BeispielCodeVortragRalf

   1 #!/usr/bin/env python
   2 #coding: ISO-8859-1 -*-'
   3 
   4 #Code aus Vortrag von Ralph Schoenian über Alchemy Protokoll 20070110:
   5 # Datei pyvoc.py
   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 #import os
  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     #Column('id',Integer,primary_key=True),
  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         #print 70*"-"
 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 # -------------- View ---------------
 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             # catLst = [el.category for el in l]
 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             # Save category
 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             #input.category.append(Category(catSelection))
 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':

BeispielCodeVortragRalf (last edited 2009-06-17 16:14:20 by localhost)