#!/usr/local/bin/python2 # kplock.py analys av kontroll-plockning pi 02-12-14 from string import strip, split,ljust,rjust, find,replace import odbc, os, os.path, dbi, sys import Cparamfil, Sklubbar, Cklubbnamn from ldafunc import xint, idag, addDays, upperSW class glb: param=Cparamfil.paramfil('') #PATH=param.katalog1+param.dbfil+'\\' PATH=param.katalog1+'\\' t=odbc.odbc(param.dbfil) CUR=t.cursor() print 'Kontroll-plockning',param.dbfil #try: os.mkdir(param.katalog1+param.dbfil) #except: pass CUR.execute('select namn,datum,plats,malkod from Tavling') resT=CUR.fetchall() [tnamn,tdatum,tbanlaggare,malkod]=resT[0] rub=tnamn+' '+replace(str(tdatum),' 00:00:00','')+' Banläggare: '+tbanlaggare def finnBanaForDelt(allaKoder,allaBanor,allaTidpunkter): #print 'kk',allaKoder kodlista,tidpunktslista=fixRensadLista(allaKoder,allaTidpunkter) #print kodlista maxR=0 antRochSaknade={} xsaknade=[] for banId in allaBanor.keys(): antR=0 saknade=[] for kod in allaBanor[banId][0]: if kod in kodlista: antR=antR+1 else: saknade.append(kod) #print 'bbb',banId,antR,saknade antRochSaknade[banId]=antR,saknade if antR>=maxR: if len(xsaknade)==0 or len(saknade)<=len(xsaknade): xbanId=banId xsaknade=saknade maxR=antR if len(xsaknade)>0: kommentar='Saknas:' for kod in xsaknade: kommentar=kommentar+' '+str(kod) else: kommentar='' # Finn ev extra kontroller som löparen tagit xextra=[] for kod in kodlista[:-2]: if kod not in allaBanor[xbanId][0]: xextra.append(kod) if len(xextra)>0: kommentar=kommentar+' Extra' for kod in xextra: kommentar=kommentar+' '+str(kod) return xbanId,kommentar def fixRensadLista(AllaKoder,AllaTidpunkter): kodlista=split(AllaKoder) tidpunktslista=split(AllaTidpunkter) kodNr=0 lastKod=0 borttagslista=[] for kod in kodlista: kodNr=kodNr+1 if xint(kod)==99: borttagslista.append(kodNr); continue if xint(kod)==lastKod: borttagslista.append(kodNr); continue lastKod=xint(kod) #print 'bb',borttagslista nykodlista=[] kodNr=0 for kod in kodlista: kodNr=kodNr+1 if kodNr not in borttagslista: nykodlista.append(kod) nytidpunktslista=[] kodNr=0 for tidp in tidpunktslista: kodNr=kodNr+1 if kodNr not in borttagslista: nytidpunktslista.append(tidp) #print 'kk2',nykodlista return nykodlista,nytidpunktslista def fixaKmtid(xtid,banlangd): tid=xint(xtid) while tid>99999: tid=tid-100000 if tid==0: return " "*5 if banlangd==0: return " "*5 banlangdKM=banlangd/1000.0 x1=round(tid/60.0/banlangdKM,1) if x1>=10: return ' '+str(x1)[:4] else: return ' '+str(x1)[:3] def MMMSS(tid): if tid>9999: tid=tid-100000 mm=tid/60 sek=tid-60*mm return (" ("+str(mm))[-3:]+"."+("00"+str(sek))[-2:]+')' else: mm=tid/60 sek=tid-60*mm return (" "+str(mm))[-3:]+"."+("00"+str(sek))[-2:]+' ' def fixaKod(kk): # FIXME ++++ if kk==str(glb.malkod): return '0' return kk def readAvstandsfil(): avstand={} antUtanAvstand=-1 try: infil=open(glb.PATH+"avstand.txt","r") antUtanAvstand=0 for rad in infil.readlines(): try: [xkodstr,xavstand]=split(rad) avstand[xkodstr]=xint(xavstand) except: antUtanAvstand=antUtanAvstand+1 except: pass infil.close() return avstand,antUtanAvstand def readAllaBanor(): glb.CUR.execute('select BanId,allaKoder,AllaStracklangder from Bana') res=glb.CUR.fetchall() allaBanor={} for [banId,allaKoder,allaStracklangder] in res: langd=0 #for ind in range(0,len(allaStr),5): langd=langd+int(strip(allaStr[ind:ind+5])) allaBanor[banId]=[split(allaKoder),allaStracklangder] return allaBanor def readAllaKlasser(): glb.CUR.execute('select namn,banId from Klass') res=glb.CUR.fetchall() klasslista={} for [namn,banId] in res: #print x[0],x[1] if klasslista.has_key(banId): klasslista[banId].append(namn) else: klasslista[banId]=[namn] return klasslista def skrivAvstandfil(kodstrlista,avstand): print len(kodstrLista) slist=open(glb.PATH+'avstand.txt','w') kodstrLista.sort() for kodstr in kodstrLista: if avstand.has_key(kodstr): slist.write(kodstr+' '+str(avstand[kodstr])+'\n') else: slist.write(kodstr+'\n') slist.close() def uppdateraDeltagareMedKlassOchTid(): allaBanor=readAllaBanor() klasslista=readAllaKlasser() glb.CUR.execute('select id,bricknr,avlasnTidpunkt,AllaKoder,AllaTidpunkter from BrickAvl') resy=glb.CUR.fetchall() for [brickavlid,bricknr,avlasnTidpunkt,allaKoder,allaTidpunkter] in resy: banId,kommentar=finnBanaForDelt(allaKoder,allaBanor,allaTidpunkter) glb.CUR.execute('select id,tid,tilldeladStarttid,namn from Deltagare where bricknr='+str(bricknr)) resx=glb.CUR.fetchall() if len(resx)<1: print 'Ingen deltagare har bricknr=',bricknr continue elif len(resx)>1: continue [id,tid,tilldeladStarttid,namn]=resx[0] tidpunktslista=split(allaTidpunkter) if tilldeladStarttid==0: sek2s=0 else: sek2s=xint(tidpunktslista[-1])-(avlasnTidpunkt-tilldeladStarttid) # Tid mellan nolln o start btid=xint(tidpunktslista[-2])-sek2s if find(kommentar,'Saknas')>-1: btid=btid+100000 klass=klasslista[banId][0] q1="update Deltagare set tid="+str(btid)+",kommentar='"+kommentar+"', klass='"+klass+"', brickavlid="+str(brickavlid)+" where id="+str(id) glb.CUR.execute(q1) print id,tid,tilldeladStarttid,banId,bricknr,kommentar,namn,MMMSS(btid) #sys.exit() uppdateraDeltagareMedKlassOchTid() avstand,antUtanAvstand=readAvstandsfil() tblue=' bgcolor="#ccffff"' tcolor='' kodstrLista=[] tidpunktslista=[] glb.CUR.execute('select klass,namn,tid,Id,brickavlId,tilldeladStarttid,kommentar from Deltagare order by klass,tid') resx=glb.CUR.fetchall() lastklass='' lastkodstr2='' ares=open(glb.PATH+glb.param.dbfil+'.htm','w') ares.write('
\n'+glb.rub+'\n')
ares.write('
')
		if klass<>lastklass:
			plac=1
			lastklass=klass		
			ares.write('\n\n'+klass+' kontrollplockning på '+str(len(kodlista)-2)+' kontroller\n')
		else:
			plac=plac+1
		lastkod='0'
		lasttidp=sek2s
		kodstr2=''
		tidstr2=''
		tidstr3=''
		kmtidstr=''
		ii=0
		for xkod in kodlista[:-2]:
			kod=fixaKod(xkod)
			tidp=xint(tidpunktslista[ii])
			if xint(lastkod)0:
				kodstr2=kodstr2+' '+rjust(kod,5)+' '
				tidstr2=tidstr2+MMMSS(tidp-sek2s)
				tidstr3=tidstr3+MMMSS(tidp-lasttidp)
				kmtidstr=kmtidstr+' '+fixaKmtid(tidp-lasttidp,strlen)+' '
				if not ii%5:
					kodstr2=kodstr2+'  '
					tidstr2=tidstr2+'  '
					tidstr3=tidstr3+'  '
					kmtidstr=kmtidstr+'  '
			lasttidp=tidp
			
		kodstr='0-'+lastkod
		#print kodstr
		if avstand.has_key(kodstr):
			strlen=avstand[kodstr]
			totlen=totlen+strlen
		else:
			strlen=0
		tid2goal=xint(tidpunktslista[ii])-lasttidp
		tidstr3=tidstr3+MMMSS(tid2goal)
		kmtidstr=kmtidstr+' '+fixaKmtid(tid2goal,strlen)
		#if '0-'+lastkod not in kodstrLista:	kodstrLista.append('0-'+lastkod) #FIXME om inte start och mål är samma
		if tid<9999:	xplac=(str(plac)+'  ')[:3]
		else:			xplac='fel'
		if len(kommentar)>13:	komm=kommentar[:13]+'...'
		else:					komm=kommentar
		xtid=ljust((MMMSS(tid)+' '+komm)[:23],23)
		if kodstr2==lastkodstr2:
			ares.write(xplac+' '+ljust(namn[:20],22)+tidstr2+'\n')
			ares.write(' '*2+' '+xtid+tidstr3+'\n')
			ares.write(' '*3+' '+ljust(str(totlen)+'m',9)+fixaKmtid(tid,totlen)+' min/km'+kmtidstr+'\n')
		else:
			lastkodstr2=kodstr2
			ares.write(xplac+' '+ljust(namn[:20],21)+kodstr2+'\n')
			ares.write(' '*2+' '+xtid+tidstr2+'\n')
			ares.write(' '*3+' '+ljust(str(totlen)+'m',22)+tidstr3+'\n')
			ares.write(' '*2+' '+fixaKmtid(tid,totlen)+' min/km'+' '*10+kmtidstr+'\n')
ares.close()

if 	antUtanAvstand<>0:	skrivAvstandfil(kodstrlista,avstand)
')
for [klass,namn,tid,Id,brickavlId,tilldeladStarttid,kommentar] in resx:
	if xint(brickavlId)>0:
		totlen=0
		glb.CUR.execute('select avlasnTidpunkt,AllaKoder,AllaTidpunkter from BrickAvl where id='+str(brickavlId))
		resy=glb.CUR.fetchall()
		#print resy
		#print klass,namn,tid,Id,brickavlId,tilldeladStarttid,
		for [avlasnTidpunkt,AllaKoder,AllaTidpunkter] in resy:
			kodlista,tidpunktslista=fixRensadLista(AllaKoder,AllaTidpunkter)
		#print 'kk',kodlista
		if tilldeladStarttid==0:
			sek2s=0
		else:
			sek2s=xint(tidpunktslista[-1])-(avlasnTidpunkt-tilldeladStarttid) # Tid mellan nolln o start
		if lastklass<>'':
			if len(tcolor)==0:	tcolor=tblue
			else:				tcolor=''
			ares.write('