1
2
3
4
5
6
7 """ Todo
8 -- showing error table + vocables
9 -- debug switch
10 -- enter negativ category
11 -- unittest
12 -- test by category (engl, ger)
13
14
15 """
16
17 import random
18 import sys
19 from sqlalchemy import *
20 import unittest
21
22 debug = False
23
24 db = create_engine('sqlite:///english.db')
25 metadata = BoundMetaData(db)
26
27 category_tbl = Table('category',metadata,
28 Column('id',Integer,primary_key=True),
29 Column('category',String(20)),
30 )
31
32 error_tbl = Table('error',metadata,
33
34 Column('id',Integer,ForeignKey('voc.id'),primary_key=True,),
35 Column('engl',Integer),
36 Column('ger',Integer),
37 )
38
39 voc_tbl = Table('voc',metadata,
40 Column('id',Integer,primary_key=True),
41 Column('english',String(30)),
42 Column('german',String(30)),
43 )
44
45 cross_tbl = Table('cross',metadata,
46 Column('voc_id',Integer,ForeignKey('voc.id')),
47 Column('cat_id',Integer,ForeignKey('category.id')),
48 )
49
50
51 class Category(object):
52 def __init__(self,name=None):
53 self.category = name
54 self.session = SessionHandler().get_session()
55 self.query = self.session.query(Category)
56
57 def get_all(self):
58 return self.query.select(Category.c.id>0,
59 order_by=[asc(Category.c.category)])
60
61
62 Category.mapper = mapper(Category,category_tbl)
63
64
65 class Cross(object):
66 pass
67 Cross.mapper = mapper(Cross,cross_tbl,
68 primary_key = [cross_tbl.c.voc_id, cross_tbl.c.cat_id])
69
70 class Error(object):
71 def __init__(self):
72 self.session = SessionHandler().get_session()
73 self.query = self.session.query(Error)
74
75
76 def delete_dispensable(self):
77 error_tbl.delete(and_(error_tbl.c.engl >= 0,error_tbl.c.ger >= 0)
78 ).execute()
79
80 def get_all(self):
81 return self.query.select()
82
83 def get_by_id(self,id):
84 obj = self.query.get_by(id=id)
85 if obj == None:
86 obj = Error()
87 obj.id = id
88 obj.engl = 0
89 obj.ger = 0
90
91 self.session.save(obj)
92
93 return obj
94
95 def get_max_id(self):
96 return self.query.count()
97
98 def get_random_voc(self):
99
100 pos = random.randint(0,self.get_max_id()-1)
101 errorObj = self.query.select()[pos]
102 if debug: print "ENGL ID: ", errorObj.id
103 return Voc().get_by_id(id=errorObj.id)
104
105 def add(self,lang,value):
106 setattr(self,lang,getattr(self,lang,value) + 1)
107
108 def reduce(self,lang,value):
109 newVal = getattr(self,lang) - value
110 setattr(self,lang, newVal)
111
112 def set(self,lang,value):
113 setattr(self,lang,value)
114
115 Error.mapper = mapper(Error,error_tbl)
116
117
118 class Voc(object):
119 def __init__(self):
120 self.session = SessionHandler().get_session()
121 self.query = self.session.query(Voc)
122
123 def get_by_id(self,id):
124 obj = self.query.get_by(id=id)
125 return obj
126
127 def get_max_id(self):
128 return self.query.count()
129
130 def get_random_voc(self):
131 return self.query.get_by(id=random.randint(1,self.get_max_id()))
132
133 Voc.mapper = mapper(Voc,voc_tbl,properties = dict(
134 category=relation(Category,secondary=cross_tbl,lazy=False)))
135
136 Error.mapper.add_property('vocable',relation(Voc))
137
138 class Singleton(object):
139 _instance=None
140 def __new__(cls,*args,**kwargs):
141 if not cls._instance:
142 cls._instance =super(Singleton,cls).__new__(cls,*args,**kwargs)
143 return cls._instance
144
145 class SessionHandler(Singleton):
146
147 def __init__(self):
148 pass
149 def get_session(self):
150 try:
151 return self.ses
152 except:
153 self.ses = create_session()
154 return self.ses
155
156
157 def create_database():
158 tbl_names=s[\
category_tbl,
159 error_tbl,
160 voc_tbl,
161 cross_tbl,
162 ]
163 for tbl in tbl_names:
164 try:
165 tbl.create()
166 except exceptions.SQLError,msg:
167 if str(msg).find('already exists') != -1:
168 print "%s already exists" %(tbl)
169 else:
170 print "Unhandled error %s" %(msg)
171 except:
172 print "Unexpected error:",sys.exc_info()[0]
173
174
175 def display_err_list():
176 e = Error()
177 v_lst = e.get_all()
178 print 75*"-"
179 for v in v_lst:
180
181 print "%-30s |%-30s |%3s |%3s |" %(v.vocable.german,
182 v.vocable.english,
183 v.ger,
184 v.engl)
185 print 75*"-"
186 selection = raw_input('Press any key ')
187
188
189 def clear_screen():
190 import curses, sys
191 curses.setupterm()
192 sys.stdout.write(curses.tigetstr("clear"))
193 sys.stdout.flush()
194
195 def enter_category():
196 enter = Enter_Category()
197 enter.input_loop()
198
199 def enter_voc():
200 enter=Enter_Voc()
201 enter.input_loop()
202
203 def test_ger_engl():
204 Error().delete_dispensable()
205 test = Ger_Engl()
206 test.loop()
207
208 def test_engl_ger():
209 Error().delete_dispensable()
210 test = Engl_Ger()
211 test.loop()
212
213 def engl_error_testing():
214 Error().delete_dispensable()
215 test = EnglErrorTest()
216 test.loop()
217
218 def ger_error_testing():
219
220 Error().delete_dispensable()
221 test = GerErrorTest()
222 test.loop()
223
224
225
226 class Trainer(object):
227
228 def __init__(self,title="",container = Voc):
229 self.title = title
230 self.container = container
231 self.session = SessionHandler().get_session()
232
233 def loop(self):
234 loop = True
235 counter = 1
236
237
238 while loop:
239 self.show_headline()
240 testobj = self.container().get_random_voc()
241 self.show_category(testobj)
242 self.ask_me(testobj,counter)
243 selection = raw_input('e) Exit c) Continue: ')
244 if selection in ['e','E']: loop=False
245 else: counter += 1
246
247 def ask_me(self,testobj,counter):
248 """ Wird ueberladen. """
249 pass
250
251 def show_headline(self):
252 clear_screen()
253 print " %s" %(self.title)
254 print 50 * "-"
255
256 def show_category(self,testobj):
257 print "Kagegorie:", \
", ".join([str(el.category) for el in testobj.category])
258 print 50 * "-"
259
260 def update_error_table(self,testobj, lang = None, match = False):
261 """ engl = 1 => set engl row else german raw """
262
263 assert lang in ('engl','ger')
264 errorObj = Error().get_by_id(int(testobj.id))
265
266 if debug:
267 print "ID: ", errorObj.id
268 print "LANG: ", lang
269 print "ERROR_COUNTER: ", getattr(errorObj,lang)
270
271 if match:
272 errorObj.add(lang,1)
273 else:
274 if getattr(errorObj,lang) == 0:
275 errorObj.set(lang,-3)
276 else:
277 errorObj.reduce(lang,1)
278
279 self.session.save_or_update(errorObj)
280 self.session.flush()
281
282
283 class Engl_Ger(Trainer):
284 def __init__(self,title = "English <==> German",container = Voc ):
285 Trainer.__init__(self,title,container)
286
287 def ask_me(self,testobj,counter):
288 german = raw_input(str(counter)+') '+str(testobj.english)+': ')
289 print 50 * "-"
290 if german == str(testobj.german):
291 print "==> correct"
292 match = True
293 else:
294 print "==> Error: ",str(testobj.german)
295 match = False
296 self.update_error_table(testobj,lang='engl',match=match)
297
298 class Ger_Engl(Trainer):
299 def __init__(self,title="German <==> English",container=Voc):
300 Trainer.__init__(self,title,container)
301
302 def ask_me(self,testobj,counter):
303 english = raw_input(str(counter)+') '+str(testobj.german)+': ')
304 print 50 * "-"
305 if english == str(testobj.english):
306 print "==> correct"
307 match = True
308 else:
309 print "==> Error: ",str(testobj.english)
310 match = False
311
312 self.update_error_table(testobj,lang='ger',match=match)
313
314
315 class Enter_Voc(Trainer):
316 def __init__(self):
317 Trainer.__init__(self,"Enter vocabulary")
318
319 def input_loop(self):
320 loop = True
321
322 while loop:
323 self.show_headline()
324
325 input = Voc()
326 input.german = raw_input('German: ')
327 input.english = raw_input('English: ')
328
329 c = Category()
330 l = c.get_all()
331
332
333
334 print
335 print "Kategorien:"
336 print "-----------"
337
338 print ", ".join([ str(el.category)+'('+str(el.id)+')' for el in l])
339
340 input.session.save(input)
341 input.session.flush()
342
343 catSelection = raw_input('Category: ')
344 catLst = catSelection.split(',')
345 catLst = map(int,catLst)
346
347
348
349 for cat in catLst:
350 c = Cross()
351 c.cat_id = cat
352 c.voc_id = input.id
353 self.session.save(c)
354 self.session.flush()
355
356 selection = raw_input('e) Exit c) Continue: ')
357 if selection in ['e','E']: loop=False
358
359 class Enter_Category(Trainer):
360 def __init__(self):
361 Trainer.__init__(self,"Enter category")
362
363 def input_loop(self):
364 loop = True
365
366 while loop:
367 self.show_headline()
368
369 c = Category()
370 l = c.get_all()
371
372 print
373 print "Kategorien:"
374 print "-----------"
375
376 print ", ".join([ str(el.category)+'('+str(el.id)+')' for el in l])
377
378
379
380 print
381 input = Category()
382 input.category = raw_input('New Category: ')
383
384 input.session.save(input)
385 input.session.flush()
386
387 selection = raw_input('e) Exit c) Continue: ')
388 if selection in ['e','E']: loop=False
389
390
391 class EnglErrorTest(Engl_Ger):
392 def __init__(self):
393 Engl_Ger.__init__(self,"Testing erraneous English voc",container=Error)
394
395 class GerErrorTest(Ger_Engl):
396 def __init__(self):
397 Ger_Engl.__init__(self,"Testing erraneous German voc",container=Error)
398
399 class VocTest(unittest.TestCase):
400 def setUp(self):
401 c = Category
402 c.id = -1
403 c.category = "test"
404
405 c.session.save(c)
406 c.session.flush()
407
408 def test_first_german_error(self):
409 pass
410
411
412
413 if __name__ == "__main__":
414 """ Displaying a mini menu here """
415
416
417 loop = True
418 while loop:
419 clear_screen()
420 print "1) Create new database"
421 print "2) Enter category"
422 print "3) Enter vocabulary"
423 print "4) Test English <--> German"
424 print "5) Test German <--> English"
425 print " Errortesting"
426 print "6) Error testing English <--> German"
427 print "7) Error testing German <--> English "
428 print "8) Testing by category English <--> German"
429 print "9) Show list of erraneous vocs"
430 print "E) Exit"
431 print ""
432 selection = raw_input("Your selection:")
433
434 if selection in ['e','E']:
435 loop=False
436
437 if selection == '1':
438 create_database()
439 elif selection == '2':
440 enter_category()
441 elif selection == '3':
442 enter_voc()
443 elif selection == '4':
444 test_engl_ger()
445 elif selection == '5':
446 test_ger_engl()
447 elif selection == '6':
448 engl_error_testing()
449 elif selection == '7':
450 ger_error_testing()
451 elif selection == '9':