def test_best_run1(self): r1 = Run() r1.base_time = 10.0 r1.result = self.result r1.club = self.c r1.save() r2 = Run() r2.base_time = 11.0 r2.result = self.result r2.club = self.c r2.save() r3 = Run() r3.base_time = 9.0 r3.cones = 1 r3.result = self.result r3.club = self.c r3.save() r4 = Run() r4.base_time = 10.0 r4.result = self.result r4.penalty = "DNF" r4.club = self.c r4.save() best_run = self.result.find_best_run() self.assertEqual(best_run, r1)
def setUp(self): self.c = Club() self.c.name = "test club" self.c.full_clean() self.c.save() self.season = Season() self.season.club = self.c self.season.year = 2011 self.season.save() self.e = Event() self.e.name = "test event" self.e.date = datetime.date.today() self.e.season = self.season self.e.club = self.c self.e.save() self.sess = Session() self.sess.name = "AM" self.sess.event = self.e self.sess.club = self.c self.sess.save() self.classes = ["A", "B", "C", "D", "E", "F", "G", "H"] self.paxes = [1.0, .98, .96, .94, .92, .90, .88, .86] for klass, pax in zip(self.classes, self.paxes): self.race_class = RaceClass() self.race_class.name = klass self.race_class.pax = pax self.race_class.club = self.c self.race_class.save() for i in range(0, 10): self.r = Registration() self.r.number = i self.r.race_class = self.race_class self.r._anon_f_name = "%s%d"%(self.race_class.name, i) self.r.pax_class = None self.r.event = self.e self.r.club = self.c self.r.save() #make two regs with empty runs for each class if self.race_class.name!="H" and i < 8: #one race class with no results self.result = Result() self.result.reg = self.r self.result.session = self.sess self.result.club = self.c self.result.save() for j in range(0, 3): run = Run() run.base_time = 100.0-i-j #91.0 is lowest raw time (*0.88 for index) run.result = self.result run.club = self.c run.save()
def test_best_run_no_clean_runs(self): r1 = Run() r1.base_time = 10.0 r1.result = self.result r1.penalty = "DNF" r1.club = self.c r1.save() r2 = Run() r2.base_time = 0.1 r2.result = self.result r2.penalty = "O/C" r2.club = self.c r2.save() best_run = self.result.find_best_run() self.assertEqual(best_run, None)
def test_pax_class_one_result(self): self.race_class = RaceClass() self.race_class.name = "Pro" self.race_class.abrv ="X" self.race_class.pax = 1.0 self.race_class.pax_class=True self.race_class.club = self.c self.race_class.save() for i, pax_name in zip(range(0, 7), self.classes): rc = RaceClass.objects.filter(name=pax_name).get() self.r = Registration() self.r.number = 10*(1+i) self.r.race_class = rc self.r._anon_f_name = "%s_%d"%(self.race_class.name, i) self.r.pax_class = self.race_class self.r.event = self.e self.r.club = self.c self.r.save() #make regs with runs for each class if rc.name!="H": self.result = Result() self.result.reg = self.r self.result.session = self.sess self.result.club = self.c self.result.save() for j in range(0, 3): run = Run() run.base_time = 100.0-i-j run.result = self.result run.club = self.c run.save() race_classes = self.e.calc_results() self.assertEqual([u"A", u"B", u"C", u"D", u"E", u"F", u"G", u"Pro"], [rc.name for rc in race_classes]) #make sure the results come back sorted for rc, regs in race_classes.iteritems(): #all race_classes should have 8 regs in the results self.assertEqual(regs, sorted(regs, key=lambda x: x.total_index_time)) if rc.name != "Pro": self.assertEqual(class_point_ladder[:8], [reg.class_points for reg in regs]) self.assertEqual(8, len(regs)) else: self.assertEqual(class_point_ladder[:7], [reg.class_points for reg in regs]) self.assertEqual(7, len(regs)) regs = self.e.get_results() self.assertEqual(regs[0].total_index_time, (91.0)*.88) self.assertEqual(index_point_ladder[:63], [reg.index_points for reg in regs])
def test_best_run2(self): r1 = Run() r1.base_time = 10.0 r1.result = self.result r1.club = self.c r1.save() best_run = self.result.find_best_run() self.assertEqual(best_run, r1)
def test_calc_times(self): self.r.save() sess = Session() sess.name = "AM" sess.event = self.e sess.club = self.c sess.save() res = Result() res.reg = self.r res.session = sess res.club = self.c res.save() r = Run() r.base_time = 10.0 r.result = res r.club = self.c r.save() res = Result() res.reg = self.r res.session = sess res.club = self.c res.save() r = Run() r.base_time = 10.0 r.result = res r.club = self.c r.save() self.r.save() self.r.calc_times() self.assertEqual(self.r.total_raw_time, 20.0) self.assertEqual(self.r.total_index_time, self.r.total_raw_time * self.race_class.pax)
def test_best_run3(self): r1 = Run() r1.base_time = 10.0 r1.result = self.result r1.club = self.c r1.save() r2 = Run() r2.base_time = 9.0 r2.result = self.result r2.club = self.c r2.save() r3 = Run() r3.base_time = 10.5 r3.result = self.result r3.club = self.c r3.save() best_run = self.result.find_best_run() self.assertEqual(best_run, r2)
def test_no_index_classes_two_result(self): self.sess = Session() self.sess.name = "PM" self.sess.event = self.e self.sess.club = self.c self.sess.save() for klass, pax in zip(self.classes, self.paxes): self.race_class = RaceClass.objects.filter(name=klass).get() for i in range(0, 10): self.r = Registration.objects.filter(_anon_f_name="%s%d"%(self.race_class.name, i)).get() #make regs with empty runs for each class if self.race_class.name!="H" and i < 8: #one race class with no results self.result = Result() self.result.reg = self.r self.result.session = self.sess self.result.club = self.c self.result.save() for j in range(0, 3): run = Run() run.base_time = 100.0-i-j run.result = self.result run.club = self.c run.save() self.r = Registration.objects.filter(_anon_f_name="%s%d"%(self.race_class.name, i)).get() race_classes = self.e.calc_results() self.assertEqual(["A", "B", "C", "D", "E", "F", "G"], [rc.name for rc in race_classes]) #make sure the results come back sorted for rc, regs in race_classes.iteritems(): #all race_classes should have 8 regs in the results self.assertEqual(regs, sorted(regs, key=lambda x: x.total_index_time)) self.assertEqual(class_point_ladder[:8], [reg.class_points for reg in regs]) self.assertEqual(8, len(regs)) regs = self.e.get_results() self.assertEqual(regs[0].total_index_time, 2*(91.0)*.88) self.assertEqual(index_point_ladder[:56], [reg.index_points for reg in regs])
def test_no_dibs(self): reg = Registration() up = UserProfile.objects.get(user=self.u1) reg.user_profile = up reg.number = 15 reg.race_class = self.race_class reg.pax_class = None reg.event = self.e4 reg.club = self.c reg.save() s = Session() s.event = self.e4 s.name = "AM" s.club = self.c s.save() result = Result() result.reg = reg result.session = s result.club = self.c result.save() for k in range(0, 3): r = Run() r.base_time = 10.0 r.calc_time = 10.0 r.index_time = 10.0 r.result = result r.club = self.c r.save() self.c.assign_dibs() self.assertEqual(len(Dibs.objects.all()), 0) reg.delete() s.delete()
def parse_axtime(event, session, results_file): """Expects a Session object and a file object with and iterates through to return either a list of result instances, or a dictionary containing error messages""" validate_error = {} results = [] club = session.club reader = csv.reader(results_file) header = reader.next() header_check = [ 'First', 'Last', 'Reg', 'Class', 'Num', 'Vehicle', 'Pax_Cls', 'Color', "Notes", "Heat" ] if not all([h in header for h in header_check]): validate_error['results_file'] = "your file was missing some columns" return validate_error time_keys = [k for k in header if 'Run' in k] cone_keys = [k for k in header if 'Pyl' in k] pen_keys = [k for k in header if 'Pen' in k] if not all([time_keys, cone_keys, pen_keys]): validate_error[ 'result_file'] = "your file was missing some run results columns" return validate_error keys = header_check + time_keys + cone_keys + pen_keys for line in reader: result = Result() result.session = session result.club = session.club data = dict(zip(header, line)) reg_id = data['Notes'] #find the group class and raceclass: if data['Class'] == data['Pax_Cls']: group = None else: try: group = RaceClass.objects.get(abrv=data['Class'], club=club) except RaceClass.DoesNotExist: validate_error[ 'result_file'] = 'Your Reults for %s %s included a unknown entry, %s in the Class column' % ( data['First'], data['Last'], data['Class']) return validate_error try: race_class = RaceClass.objects.get(abrv=data['Pax_Cls'], club=club) except RaceClass.DoesNotExist: if not data['Pax_Cls']: validate_error[ 'results_file'] = "Your results for %s %s included an blank race class" % ( data['First'], data['Last']) else: validate_error[ 'results_file'] = "Your results for %s %s included an unknown race class: %s" % ( data['First'], data['Last'], data['Pax_Cls']) return validate_error car_data = data['Vehicle'].split() if len(car_data) == 3 and int_check.match(car_data[0]): data['Vehicle_year'] = car_data[0] data['Vehicle_make'] = car_data[1] data['Vehicle_model'] = car_data[2] elif len(car_data) == 2: data['Vehicle_year'] = None data['Vehicle_make'] = car_data[0] data['Vehicle_model'] = car_data[1] else: data['Vehicle_year'] = None data['Vehicle_make'] = None data['Vehicle_model'] = data['Vehicle'] #try REALLY hard to find the registration that maps to this driver try: user = User.objects.filter(username__icontains=data['Mem_Num'], first_name__icontains=data['First'], last_name__icontains=data['Last'])[0] except IndexError: #coudn't find one user = None if user: try: reg = Registration.objects.get( event=event, user_profile__user__username=user.username) if reg.race_class != race_class: reg.race_class = race_class except Registration.DoesNotExist: reg = Registration() reg.user_profile = user.get_profile() reg.number = int(data['Num']) reg.race_class = race_class reg.pax_class = group reg._anon_car = data['Vehicle'] reg.event = event reg.club = club #not sure how this could happen at all... #except Registration.MultipleObjectsReturned: # reg = session.query(model.Registration).join(model.Driver).join(model.Event).\ # filter(model.Event.id==c.event.id).filter(model.Driver.user_name==driver.user_name).all() # for r in reg: # session.delete(r) # # reg = model.Registration() # reg.driver = driver # reg.number = int(data['Num']) # reg.race_class = race_class # reg.anon_car = unicode(data['Vehicle']) # reg.event = c.event else: #try to find a previous anon_reg try: reg = Registration.objects.get(event=event, _anon_f_name=data['First'], _anon_l_name=data['Last']) except Registration.DoesNotExist: reg = Registration() reg.number = int(data['Num']) reg.race_class = race_class reg.pax_class = group reg._anon_f_name = data['First'] reg._anon_l_name = data['Last'] reg._anon_car = data['Vehicle'] reg.event = event reg.club = club try: reg.save() except: validate_error[ 'results_file'] = "%s %s has a duplicate class/number: %d %s" % ( reg.first_name, reg.last_name, reg.number, reg.race_class) return validate_error try: reg.number = int(data['Num']) except Exception: validate_error[ 'results_file'] = 'Problem with car number for entry: %s %s' % ( reg.first_name, reg.last_name) return validate_error result.reg = reg result.save() for r_key, c_key, p_key in zip(time_keys, cone_keys, pen_keys): run = Run() run.result = result run.club = club try: if float(data[r_key]) <= 0.0: continue except ValueError: continue run.base_time = float(data[r_key]) run.cones = int(data[c_key]) if data[p_key].strip(): run.penalty = data[p_key] run.save() #note: not sure why this has to be done here try: reg.save() except Exception: validate_error[ 'results_file'] = "%s %s has a duplicate class/number: %d %s" % ( reg.first_name, reg.last_name, reg.number, reg.race_class) return validate_error results.append(result) return results
def test_two_bump_class_one_result(self): self.race_class1 = RaceClass() self.race_class1.name = "index1" self.race_class1.pax = 1.0 self.race_class1.club = self.c self.race_class1.save() self.race_class2 = RaceClass() self.race_class2.name = "index2" self.race_class2.pax = 1.0 self.race_class2.club = self.c self.race_class2.save() for i, pax_name in zip(range(0, 7), self.classes): pax_class = RaceClass.objects.filter(name=pax_name).get() self.r = Registration() self.r.number = 10*(1+i) self.r.race_class = pax_class self.r._anon_f_name = "%s_%d"%(self.race_class2.name, i) self.r.bump_class = self.race_class1 self.r.event = self.e self.r.club = self.c self.r.save() #make regs with empty runs for each class if pax_class.name!="H": self.result = Result() self.result.reg = self.r self.result.session = self.sess self.result.club = self.c self.result.save() for j in range(0, 3): run = Run() run.base_time = 100.0-i-j run.result = self.result run.club = self.c run.save() self.r = Registration() self.r.number = 60*(1+i) self.r.race_class = pax_class self.r._anon_f_name = "%s_%d"%(self.race_class2.name, i) self.r.bump_class = self.race_class2 self.r.event = self.e self.r.club = self.c self.r.save() #make regs with empty runs for each class if pax_class.name!="H": self.result = Result() self.result.reg = self.r self.result.session = self.sess self.result.club = self.c self.result.save() for j in range(0, 3): run = Run() run.base_time = 100.0-i-j run.result = self.result run.club = self.c run.save() race_classes = self.e.calc_results() self.assertEqual(set(["A", "B", "C", "D", "E", "F", "G", "index1", "index2"]), set([rc.name for rc in race_classes])) #make sure the results come back sorted for rc, regs in race_classes.iteritems(): #all race_classes should have 8 regs in the results self.assertEqual(regs, sorted(regs, key=lambda x: x.total_index_time)) if "index" not in rc.name: self.assertEqual(class_point_ladder[:8], [reg.class_points for reg in regs]) self.assertEqual(8, len(regs)) else: self.assertEqual(class_point_ladder[:7], [reg.class_points for reg in regs]) self.assertEqual(7, len(regs)) regs = self.e.get_results() self.assertEqual(regs[0].total_index_time, (91.0)*.88) self.assertEqual(index_point_ladder[:70], [reg.index_points for reg in regs])
def parse_axtime(event, session, results_file): """Expects a Session object and a file object with and iterates through to return either a list of result instances, or a dictionary containing error messages""" validate_error = {} results = [] club = session.club reader = csv.reader(results_file) header = reader.next() header_check = ["First", "Last", "Reg", "Class", "Num", "Vehicle", "Pax_Cls", "Color", "Notes", "Heat"] if not all([h in header for h in header_check]): validate_error["results_file"] = "your file was missing some columns" return validate_error time_keys = [k for k in header if "Run" in k] cone_keys = [k for k in header if "Pyl" in k] pen_keys = [k for k in header if "Pen" in k] if not all([time_keys, cone_keys, pen_keys]): validate_error["result_file"] = "your file was missing some run results columns" return validate_error keys = header_check + time_keys + cone_keys + pen_keys for line in reader: result = Result() result.session = session result.club = session.club data = dict(zip(header, line)) reg_id = data["Notes"] # find the group class and raceclass: if data["Class"] == data["Pax_Cls"]: group = None else: try: group = RaceClass.objects.get(abrv=data["Class"], club=club) except RaceClass.DoesNotExist: validate_error["result_file"] = ( "Your Reults for %s %s included a unknown entry, %s in the Class column" % (data["First"], data["Last"], data["Class"]) ) return validate_error try: race_class = RaceClass.objects.get(abrv=data["Pax_Cls"], club=club) except RaceClass.DoesNotExist: if not data["Pax_Cls"]: validate_error["results_file"] = "Your results for %s %s included an blank race class" % ( data["First"], data["Last"], ) else: validate_error["results_file"] = "Your results for %s %s included an unknown race class: %s" % ( data["First"], data["Last"], data["Pax_Cls"], ) return validate_error car_data = data["Vehicle"].split() if len(car_data) == 3 and int_check.match(car_data[0]): data["Vehicle_year"] = car_data[0] data["Vehicle_make"] = car_data[1] data["Vehicle_model"] = car_data[2] elif len(car_data) == 2: data["Vehicle_year"] = None data["Vehicle_make"] = car_data[0] data["Vehicle_model"] = car_data[1] else: data["Vehicle_year"] = None data["Vehicle_make"] = None data["Vehicle_model"] = data["Vehicle"] # try REALLY hard to find the registration that maps to this driver try: user = User.objects.filter( username__icontains=data["Mem_Num"], first_name__icontains=data["First"], last_name__icontains=data["Last"], )[0] except IndexError: # coudn't find one user = None if user: try: reg = Registration.objects.get(event=event, user_profile__user__username=user.username) if reg.race_class != race_class: reg.race_class = race_class except Registration.DoesNotExist: reg = Registration() reg.user_profile = user.get_profile() reg.number = int(data["Num"]) reg.race_class = race_class reg.pax_class = group reg._anon_car = data["Vehicle"] reg.event = event reg.club = club # not sure how this could happen at all... # except Registration.MultipleObjectsReturned: # reg = session.query(model.Registration).join(model.Driver).join(model.Event).\ # filter(model.Event.id==c.event.id).filter(model.Driver.user_name==driver.user_name).all() # for r in reg: # session.delete(r) # # reg = model.Registration() # reg.driver = driver # reg.number = int(data['Num']) # reg.race_class = race_class # reg.anon_car = unicode(data['Vehicle']) # reg.event = c.event else: # try to find a previous anon_reg try: reg = Registration.objects.get(event=event, _anon_f_name=data["First"], _anon_l_name=data["Last"]) except Registration.DoesNotExist: reg = Registration() reg.number = int(data["Num"]) reg.race_class = race_class reg.pax_class = group reg._anon_f_name = data["First"] reg._anon_l_name = data["Last"] reg._anon_car = data["Vehicle"] reg.event = event reg.club = club try: reg.save() except: validate_error["results_file"] = "%s %s has a duplicate class/number: %d %s" % ( reg.first_name, reg.last_name, reg.number, reg.race_class, ) return validate_error try: reg.number = int(data["Num"]) except Exception: validate_error["results_file"] = "Problem with car number for entry: %s %s" % ( reg.first_name, reg.last_name, ) return validate_error result.reg = reg result.save() for r_key, c_key, p_key in zip(time_keys, cone_keys, pen_keys): run = Run() run.result = result run.club = club try: if float(data[r_key]) <= 0.0: continue except ValueError: continue run.base_time = float(data[r_key]) run.cones = int(data[c_key]) if data[p_key].strip(): run.penalty = data[p_key] run.save() # note: not sure why this has to be done here try: reg.save() except Exception: validate_error["results_file"] = "%s %s has a duplicate class/number: %d %s" % ( reg.first_name, reg.last_name, reg.number, reg.race_class, ) return validate_error results.append(result) return results