def iteration_time(request,iteration): its = get_iterations() it = [it for it in its if it[1]['name']==iteration][0] start_date = it[1]['start date'].date() end_date = it[1]['end date'].date() tf = get_fns(recurse=True) hours = [os.path.join(os.path.dirname(t),'hours.json') for t in tf] agg={} ; persons={} ; ptasks={} for h in hours: tid = '/'.join(os.path.dirname(h).split('/')[2:]) if not os.path.exists(h): continue md = loadmeta(h) for stmp,data in md.items(): stmp = datetime.datetime.strptime(stmp,'%Y-%m-%d').date() if not (stmp>=start_date and stmp<=end_date): continue for person,hours in data.items(): if stmp not in agg: agg[stmp]={} if person not in agg[stmp]: agg[stmp][person]={} if person not in persons: persons[person]=0 if person not in ptasks: ptasks[person]=[] persons[person]+=hours if tid not in ptasks[person]: ptasks[person].append(tid) if tid not in agg[stmp][person]: agg[stmp][person][tid]=0 agg[stmp][person][tid]+=hours agg = list(agg.items()) agg.sort(lambda i1,i2: cmp(i1[0],i2[0])) persons = list(persons.items()) persons.sort(lambda i1,i2: cmp(i1[1],i2[1]),reverse=True) return {'persons':persons,'agg':agg,'it':it,'ptasks':ptasks,'request':request}
def test_iteration_creation(self): docs.add_iteration('testiter') rt = docs.add_task('testiter',parent=None,params={'summary':'1st test task'},tags=['chuckacha']) tf = docs.get_fns(iteration='testiter',flush=True) assert len(tf)==1 for i in range(5): rt2 = docs.add_task(iteration=None,parent=rt['id'],params={'summary':'1st subtask'},tags=['subtask']) print(rt2) tf = docs.get_fns(iteration='testiter',recurse=True,flush=True) assert len(tf)==i+2 t1 = docs.get_task(rt['id'],read=True) assert t1['id']==rt['id'] assert t1['summary']=='1st test task' assert 'chuckacha' in t1['tags'] t2 = docs.get_task(rt2['id'],read=True) assert t2['summary']=='1st subtask' assert 'subtask' in t2['tags']
def test_iteration_creation(self): docs.add_iteration('testiter') rt = docs.add_task('testiter',parent=None,params={'summary':'1st test task'},tags=['chuckacha']) tf = docs.get_fns(iteration='testiter',flush=True) assert len(tf)==1 for i in range(5): rt2 = docs.add_task(iteration=None,parent=rt['id'],params={'summary':'1st subtask'},tags=['subtask']) print rt2 tf = docs.get_fns(iteration='testiter',recurse=True,flush=True) assert len(tf)==i+2 t1 = docs.get_task(rt['id'],read=True) assert t1['id']==rt['id'] assert t1['summary']=='1st test task' assert 'chuckacha' in t1['tags'] t2 = docs.get_task(rt2['id'],read=True) assert t2['summary']=='1st subtask' assert 'subtask' in t2['tags']
def iteration_commits(request,iteration,branch): gwu = cfg.GITWEB_URL its = get_iterations() it = [it for it in its if it[1]['name']==iteration][0] start_date = it[1]['start date'] end_date = it[1]['end date'] #print('commits on iteration %s to branch %s'%(iteration,branch)) tf = get_fns(recurse=True) metas = [os.path.join(os.path.dirname(t),'meta.json') for t in tf] agg={} ; repos=[] ; task_data={} ; lastcommits={} for m in metas: tid = '/'.join(os.path.dirname(m).split('/')[2:]) if not os.path.exists(m): continue md = loadmeta(m) if 'branchlastcommits' not in md: continue blc = md['branchlastcommits'] for br,stmp in blc.items(): if '/' not in br: #print "%s has no /"%(br) continue try: repo,br = br.split('/') except ValueError: #print '%s has too many /'%(br) continue stmp = parsegitdate(stmp) if not (stmp.date()>=start_date.date() and stmp.date()<=end_date.date()): #print 'bad commit date %s'%stmp continue if not (branch=='all' or branch==br): #print 'branch mismatch %s<>%s'%(branch,br) continue if tid not in agg: agg[tid]={} if repo not in agg[tid]: agg[tid][repo]=[] agg[tid][repo].append(br) if tid not in task_data: t = get_task(tid) task_data[tid]=t if tid not in lastcommits: lastcommits[tid]=stmp if stmp>=lastcommits[tid]: lastcommits[tid]=stmp if repo not in repos: repos.append(repo) #print(tid,repo,br,stmp) agg = list(agg.items()) def lcsort(i1,i2): return cmp(lastcommits[i1[0]],lastcommits[i2[0]]) agg.sort(lcsort,reverse=True) return {'agg':agg,'it':it,'branch':branch,'repos':repos,'gwu':gwu,'task_data':task_data,'lastcommits':lastcommits,'request':request}
def asgn(request,person=None,created=None,iteration=None,recurse=True,notdone=False,query=None,tag=None,newer_than=None,recent=False,gethours=False): in_tasks = get_fns(assignee=person,created=created,recurse=recurse,query=query,tag=tag,newer_than=newer_than,recent=recent) tasks={} print 'got initial ',len(in_tasks),' tasks; cycling' for t in in_tasks: print 'getting parent for %s'%t._id tlp = get_parent(t._id,tl=True) assert hasattr(t,'status'),"%s with no status"%t._id st = t['status'] #print 'st of %s setting to status of tlp %s: %s'%(t._id,tlp,st) print 'grouping by status' if st not in tasks: tasks[st]=[] showtask=False if not notdone: showtask=True if str(t['status']) not in cfg.DONESTATES: showtask=True print 'showtask' if showtask: tasks[st].append(t) def srt(t1,t2): t1ids = [int(tp) for tp in (t1._id.split('/'))] t2ids = [int(tp) for tp in (t2._id.split('/'))] t1ids.insert(0,int('priority' in t1['tags'])) t2ids.insert(0,int('priority' in t2['tags'])) t1idsc = copy.copy(t1ids) t2idsc = copy.copy(t2ids) while True and len(t1ids) and len(t2ids): t1id = t1ids.pop(0) t2id = t2ids.pop(0) #print 'comparing %s & %s which were extracted from %s, %s'%(t1id,t2id,t1idsc,t2idsc) rt= cmp(t1id,t2id) if rt!=0: break return rt for st in tasks: tasks[st].sort(srt,reverse=True) return {'tasks':tasks,'statuses':STATUSES,'request':request,'gethours':gethours}
def asgn(request, P, C, person=None, created=None, informed=None, handled_by=None, iteration=None, recurse=True, notdone=False, query=None, tag=None, newer_than=None, tids=None, recent=False, gethours=False): in_tasks = get_fns(C,assignee=person,created=created,handled_by=handled_by,informed=informed,recurse=recurse,query=query,tag=tag,newer_than=newer_than,tids=tids,recent=recent) tasks={} #print 'got initial ',len(in_tasks),' tasks; cycling' for td in in_tasks: t = Task(**td['contents']) t.pri = td['comb_pri'] tlp = get_parent(t._id,tl=True) assert hasattr(t,'status'),"%s with no status"%t._id st = t.status if st not in tasks: tasks[st]=[] showtask=False if not notdone: showtask=True if str(t['status']) not in cfg.DONESTATES: showtask=True if showtask: tasks[st].append(t) sortmode = request.params.get('sortby','default') for st in tasks: tasks[st].sort(key=cmp_to_key(sortmodes[sortmode]),reverse=True) return basevars(request,P,C,{'tasks':tasks,'statuses':STATUSES,'request':request,'gethours':gethours})