def remote_update(self): """Iterate through all racers and push local updates to remote.""" racer_table_model = self.modeldb.racer_table_model racer_status_column = racer_table_model.status_column submit_list = [] # First, gather the list of updates and try pushing to remote. for row in range(racer_table_model.rowCount()): record = racer_table_model.record(row) bib = record.value(racer_table_model.BIB) start = record.value(racer_table_model.START) finish = record.value(racer_table_model.FINISH) status = record.value(racer_table_model.STATUS) if msecs_is_valid(start) and msecs_is_valid(finish) and (status != 'remote'): racer_update = {'bib': bib, 'start': start, 'finish': finish, 'row': row} submit_list.append(racer_update) # Only if remote push succeeds, we mark the status as "remote". if not submit_list or self.submit_racer_update(submit_list) != Status.Ok: return for racer_update in submit_list: index = racer_table_model.index(racer_update['row'], racer_status_column) racer_table_model.setData(index, 'remote') racer_table_model.dataChanged.emit(index, index)
def get_result_row_list(model, cat_list): """Get a list of (result, row) tuples, including only cats in cat_list, sorted by result.""" result_list = [] for row in range(model.rowCount()): category = model.data(model.index(row, model.category_column)) if not category or category == '': category = '5' if cat_list and (category not in cat_list): continue start = model.index(row, model.start_column).data() finish = model.index(row, model.finish_column).data() if not msecs_is_valid(start): result = 'DNS' elif not msecs_is_valid(finish): result = msecs_to_string(finish) else: elapsed = finish - start result = msecs_to_string(elapsed) result_list.append((result, row)) result_list.sort(key=lambda record: record[0]) return result_list
def collect_result_submits(self): """Go through the racer table and find stuff that needs submitting. We collect the list of results that need submitting into self.pending_queue. The current implementation of this function won't do a collection until the pending_queue has been drained. """ if self.pending_queue: return racer_table_model = self.modeldb.racer_table_model with self.pending_queue_lock: # Iterate through all racers and put pending results on the results queue. for row in range(racer_table_model.rowCount()): record = racer_table_model.record(row) if record.value(racer_table_model.STATUS) != 'local': continue metadata = json.loads(record.value(racer_table_model.METADATA)) # Stuff to go into the ontheday result submission. # If no ontheday metadata, this racer was not imported from ontheday.net, so skip. try: ontheday_id = metadata['ontheday']['id'] except KeyError: continue finish = record.value(racer_table_model.FINISH) if msecs_is_valid(finish): # Report time relative to reference clock (which means just use msecs since # midnight). reference_datetime = QDateTime(QDate.currentDate()) finish_time = reference_datetime.addMSecs(finish) ontheday_watch_finish_time = finish_time.time().toString( Qt.ISODateWithMs) ontheday_tt_dnf = False elif finish in (MSECS_DNF, MSECS_DNP): ontheday_watch_finish_time = self.WATCH_FINISH_TIME_TO_POST ontheday_tt_dnf = True else: ontheday_watch_finish_time = self.WATCH_FINISH_TIME_TO_POST ontheday_tt_dnf = False result = { 'ontheday': { 'id': ontheday_id, 'watch_finish_time': ontheday_watch_finish_time, 'tt_dnf': ontheday_tt_dnf, 'status': None }, 'row': row } self.pending_queue.append(result)
def extraColumnData(self, parent, row, extra_column, role=Qt.DisplayRole): """Provide extra columns for delta.""" if role in (Qt.DisplayRole, Qt.EditRole): if extra_column == self.DELTA_SECTION: model = self.sourceModel() start = model.data(model.index(row, model.start_column)) if not msecs_is_valid(start): return MSECS_UNINITIALIZED finish = model.data(model.index(row, model.finish_column)) if not msecs_is_valid(finish): return finish return finish - start else: raise IndexError('Unknown extra column number %s' % extra_column) # Make the rest of our data (background, etc.) the same as the finish column. else: model = self.modeldb.racer_table_model return model.data(model.index(row, model.finish_column), role)
def generate_finish_report(modeldb, field_name): """ Generate finish report for a particular field.""" subfields = modeldb.field_table_model.get_subfields(field_name) subfield_list_by_cat = [None] if subfields: subfield_list_by_cat = [] subfield_list = re.split('[; ]+', subfields) for subfield in subfield_list: cat_list = re.split('[, ]+', subfield) subfield_list_by_cat.append(cat_list) model = RacerTableModel(modeldb) model.setFilter('%s = "%s"' % (RacerTableModel.FIELD_ALIAS, field_name)) model.select() html = '' html += '<style>' html += ('h1 {' ' font-size: 12pt;' '}') html += ('h2 {' ' font-size: 10pt;' '}') html += ('h3 {' ' font-size: 10pt;' '}') html += ('table {' ' font-size: 10pt;' '}') html += ('td, th {' ' border: 3px solid black;' ' padding: 5px;' '}') html += ('.place, .number, .category, .age, .finish_h {' ' text-align: center;' '}') html += ('.first, .last, .team {' ' text-align: left;' '}') html += ('.finish {' ' text-align: right;' '}') html += '</style>' html += '<h1>%s</h1>' % modeldb.race_table_model.get_race_property( RaceTableModel.NAME) html += '%s' % modeldb.race_table_model.get_date().toString( Qt.DefaultLocaleLongDate) html += '<h2>Results: %s</h2>' % field_name for cat_list in subfield_list_by_cat: # Make sure cat_list is indeed a list. if not cat_list: cat_list = [] if cat_list: html += '<div align="center">Cat %s</div>' % ', '.join(cat_list) html += '<table>' html += ( '<tr><th class="place">Place</th> <th class="number">Bib #</th> ' + '<th class="first">First</th> <th class="last">Last</th> ' + '<th class="category">Cat</th> <th class="team">Team</th> ' + '<th class="finish_h">Finish</th> <th class="age">Age</th> </tr>') # Build (result, row) list and sort by result. result_list = get_result_row_list(model, cat_list) position = 1 for result, row in result_list: category = model.data(model.index(row, model.category_column)) if not category or category == '': category = '5' if cat_list and (category not in cat_list): continue bib = model.index(row, model.bib_column).data() first_name = model.index(row, model.first_name_column).data() last_name = model.index(row, model.last_name_column).data() team = model.index(row, model.team_column).data() age = model.index(row, model.age_column).data() finish = model.index(row, model.finish_column).data() if msecs_is_valid(finish): place = position else: place = 'DNP' result = '-' html += ('<tr><td class="place">%s</td> ' % place + '<td class="number">%s</td> ' % bib + '<td class="first">%s</td> ' % first_name + '<td class="last">%s</td> ' % last_name + '<td class="category">%s</td> ' % category + '<td class="team">%s</td> ' % team + '<td class="finish">%s</td> ' % result + '<td class="age">%s</td> ' % age + '</tr>') position += 1 html += '</table>' document = QTextDocument() document.setHtml(html) return document