Esempio n. 1
0
    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)
Esempio n. 2
0
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
Esempio n. 3
0
    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)
Esempio n. 4
0
    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)
Esempio n. 5
0
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