If I have time, I would like to.
On Oct 25, 7:03 am, selecta <gr...@delarue-berlin.de> wrote: > so will you integrate it into the current issue tracker? > like a tab or button with "sort by number of occurrence" > > On Oct 25, 1:59 pm, mdipierro <mdipie...@cs.depaul.edu> wrote: > > > Good idea! > > > On Oct 25, 6:37 am, selecta <gr...@delarue-berlin.de> wrote: > > > > Quite a while ago I wrote some code for my issue tracker to show error > > > tickets by their number of occurrence. > > > The Idea behind this is that you will see the error that appears most > > > frequently and that needs fixing immediately. Since I am too busy to > > > finish the issue tracker I will just share the relevant code > > > > screenshothttp://jaguar.biologie.hu-berlin.de/~fkrause/screenshot_error_frequec... > > > > the controller > > > > error_files_base = > > > os.path.join(request.env.web2py_path,'applications',request.application,'errors') > > > def errors(): > > > import operator > > > import os.path > > > import hashlib > > > import os > > > import pickle > > > #------------------------------------------ > > > if request.vars.has_key('del'): > > > for fn in os.listdir(error_files_base): > > > try: > > > error = > > > pickle.load(open(os.path.join(error_files_base,fn),'r')) > > > except IOError: > > > continue > > > hash = hashlib.md5(error['traceback']).hexdigest() > > > if request.vars['del'] == hash: > > > os.remove( os.path.join(error_files_base,fn) ) > > > #------------------------------------------ > > > > hash2error = dict() > > > for fn in os.listdir(error_files_base): > > > try: > > > error = > > > pickle.load(open(os.path.join(error_files_base,fn),'r')) > > > except IOError: > > > continue > > > hash = hashlib.md5(error['traceback']).hexdigest() > > > try: > > > hash2error[hash]['count'] += 1 > > > except KeyError: > > > error_lines = error['traceback'].split("\n") > > > last_line = error_lines[-2] > > > error_causer = os.path.split(error['layer'])[1] > > > hash2error[hash] = dict(count = 1, pickel = error, causer > > > = error_causer, last_line = last_line, hash = hash) > > > > decorated = [(x['count'],x) for x in hash2error.values()] > > > decorated.sort(key=operator.itemgetter(0), reverse=True) > > > return dict(errors = [x[1] for x in decorated]) > > > > the view > > > > <table id='trck_errors'> > > > {{=THEAD(TR(TH('Delete'), TH('Count'), TH('File'), TH('Error')))}} > > > <tbody> > > > {{for e in errors:}} > > > {{=TR(TD(BUTTON_DELETE(e['hash'])), > > > TH(e['count']),TD(e['causer']),TD(e['last_line']), > > > _onclick="collapse('%s');"%e['hash'])}}{{=TR(TD(DIV(CODE(e['pickel'] > > > ['traceback']), _id=e['hash']),_colspan=4 ))}} > > > {{pass}} > > > </tbody> > > > </table> > > > <script> $(document).ready(function(){ > > > $('{{for e in errors:}}#{{=e['hash']}}, {{pass}}').hide(); > > > }); </script> > > > > feel free to use and improve > >