Exemple #1
0
def form_for_now_middle(fieldname, form, description, do_events=False):
    """
    Render a form, or the response to the form. Pulls out the specified fied
    and uses that to generate a TimeGhost.middle. TimeGhost.now is Event.now().
    """
    try:
        # Render requested timeghost
        if request.method == "POST":
            now = Event.now()
            middle_key_or_date = request.form[fieldname]
            middle = Event.get_from_key_or_date(middle_key_or_date, description)

            timeghost = TimeGhostFactory.build(now=now, middle=middle)
            if not do_events:
                timeghost.display_prefix = ""

            return render_template('timeghost.html', timeghost=timeghost)
        # draw the form:
        else:
            events = None
            if do_events:
                events = Event.query().order(-Event.date).fetch()
            return render_template(form, events=events)
    except TimeGhostError as err:
        return render_template('error.html', err=err), 404
Exemple #2
0
def timeghost_json():
    """JSON page: generate a random Timeghost and return it as a JSON object"""
    now = Event.now()
    middle = Event.get_random(before=now)
    timeghost = TimeGhostFactory.build(now=now, middle=middle)
    tg_dict = { 
        'factoid':  timeghost.factoid,
        'permalink':  timeghost.permalink
    }
    return jsonify(tg_dict)
Exemple #3
0
def timeghost_json():
    """JSON page: generate a random Timeghost and return it as a JSON object"""
    middle = Event.get_random(before=Event.now())
    tg = TimeGhostFactory.build(middle=middle)
    tg_dict = dict(
        factoid=tg.factoid,
        permalink=tg.permalink_fully_qualified,
        tweet="{} #timeghost {}".format(
            tg.factoid[:110], tg.permalink_fully_qualified),
    )
    return jsonify(tg_dict)
Exemple #4
0
def earliest_event_by_short_url_server(short_url):
    try:
        middle = Event.get_from_key_or_date(short_url)
    except TimeGhostError as err:
        raise TimeGhostError("timeghost doesn't know your birthday")
    timeghost = TimeGhostFactory.build(middle=middle, get_earliest=True)
    return render_template('timeghost.html', timeghost=timeghost)
Exemple #5
0
def events_json_server(middle_key_or_date=None):
    """
    Either all events, or all events in the 'timeghost range' between than a
    given middle event key/date and now.
    """
    if request.method == "POST":
        middle_key_or_date = request.form['middle_event_key']
    events = Event.get_events_in_range(Event.now(),
                                       middle_key_or_date,
                                       sort_asc=False)
    events_in_dicts = [{'key': e.key.urlsafe(),
                        'description': e.description,
                        'date': "({0.year}-{0.month}-{0.day})".format(e.date),
                            } for e in events]

    json_events = json.dumps({'events': events_in_dicts})
    return json_events
Exemple #6
0
def events_json_server(middle_key_or_date=None):
    """
    Either all events, or all events in the 'timeghost range' between than a
    given middle event key/date and now.
    """
    if request.method == "POST":
        middle_key_or_date = request.form['middle_event_key']
    events = Event.get_events_in_range(Event.now(),
                                       middle_key_or_date,
                                       sort_asc=False)
    events_in_dicts = [{'key': e.key.urlsafe(),
                        'description': e.description,
                        'date': "({0.year}-{0.month}-{0.day})".format(e.date),
                            } for e in events]

    json_events = json.dumps({'events': events_in_dicts})
    return json_events
Exemple #7
0
def events_file_server():
    si = StringIO.StringIO()
    cw = csv.writer(si)
    events = Event.get_earlier_than()
    cw.writerows([(e.date, e.description) for e in events])
    output = make_response(si.getvalue())
    output.headers["Content-Disposition"] = "attachment; filename=events.csv"
    output.headers["Content-type"] = "text/csv"
    return output
Exemple #8
0
def events_file_server():
    si = StringIO.StringIO()
    cw = csv.writer(si)
    events = Event.get_earlier_than()
    cw.writerows([(e.date, e.description) for e in events])
    output = make_response(si.getvalue())
    output.headers["Content-Disposition"] = "attachment; filename=events.csv"
    output.headers["Content-type"] = "text/csv"
    return output
Exemple #9
0
 def post(self):
     """
     Adds a new event to the list
     """
     event_json = request.json
     event = Event(event_json)
     db.session.add(event)
     db.session.commit()
     return {"data": event}, 201
Exemple #10
0
    def seed(cls, filename=None):
        """Add Events which don't already exist in the database."""
        if filename is None:
            dirname = os.path.dirname(__file__)
            filename = os.path.join(dirname, EVENTS_FILE)

        events = []
        with open(filename) as csvfile:
            reader = csv.reader(csvfile)
            for row in reader:
                date = row[0]
                desc = row[1]
                event = Event.build(date_str=date, description=desc)
                exists = Event.query(Event.description == event.description).get()
                if not exists:
                    event.put()
                    events.append(event)

        return events
Exemple #11
0
def events_server(middle_key_or_date=None):
    """
    Show a page of all the events, or all events EARLIER than a given key/date
    """
    try:
        events = Event.get_earlier_than(middle_key_or_date)
        title = "Earlier Events" if middle_key_or_date else "All Events"
        return render_template('events.html', events=events, title=title)
    except TimeGhostError as err:
        return render_template('error.html', err=err), 404
Exemple #12
0
def chosen_event_pair():
    try:
        # Render requested timeghost
        if request.method == "POST":
            now = Event.now()

            middle_kod = request.form['middle']
            middle = Event.get_from_key_or_date(middle_kod)

            long_ago_kod = request.form['long_ago']
            long_ago = Event.get_from_key_or_date(long_ago_kod)

            timeghost = TimeGhost(now=now, middle=middle, long_ago=long_ago)
            return render_template('timeghost.html', timeghost=timeghost)
        # draw the form:
        else:
            events = Event.query().order(-Event.date).fetch()
            return render_template('specific_both.html', events=events)
    except TimeGhostError as err:
        return render_template('error.html', err=err), 404
Exemple #13
0
    def seed(cls, filename=None):
        """Add Events which don't already exist in the database."""
        if filename is None:
            dirname = os.path.dirname(__file__)
            filename = os.path.join(dirname, EVENTS_FILE)

        events = []
        with open(filename) as csvfile:
            reader = csv.reader(csvfile)
            for row in reader:
                date = row[0]
                desc = row[1]
                event = Event.build(date_str=date, description=desc)
                exists = Event.query(Event.description ==
                                     event.description).get()
                if not exists:
                    event.put()
                    events.append(event)

        return events
Exemple #14
0
def add_all_search_docs():
    event_search_index = search.Index(EVENT_SEARCH_INDEX)
    events = Event.query().fetch()
    count = 0
    for event in events:
        count += 1
        doc = event.search_doc
        event_search_index.put(doc)
        #event.put() # TODO Uncomment to go live
    title = "Updated {} events to add search doc".format(count)
    return render_template('events.html', events=events, title=title)
Exemple #15
0
def chosen_event_pair():
    try:
        # Render requested timeghost
        if request.method == "POST":
            now = Event.now()

            middle_kod = request.form['middle']
            middle = Event.get_from_key_or_date(middle_kod)

            long_ago_kod = request.form['long_ago']
            long_ago = Event.get_from_key_or_date(long_ago_kod)

            timeghost = TimeGhost(now=now, middle=middle, long_ago=long_ago)
            return render_template('timeghost.html', timeghost=timeghost)
        # draw the form:
        else:
            events = Event.query().order(-Event.date).fetch()
            return render_template('specific_both.html', events=events)
    except TimeGhostError as err:
        return render_template('error.html', err=err), 404
Exemple #16
0
def permalink_server(middle_key_urlsafe, long_ago_key_urlsafe=None):
    """
    Handles permalinks for a particular timeghost if both arguments
    are given, and TimeGhosts between now and a particular middle event if
    only the middle event key is given.
    """
    try:
        now = Event.now()
        middle = Event.get_from_key_or_date(middle_key_urlsafe)
        long_ago = None

        if long_ago_key_urlsafe is not None:
            long_ago = Event.get_from_key_or_date(long_ago_key_urlsafe)

        timeghost = TimeGhostFactory.build(now=now,
                                           middle=middle,
                                           long_ago=long_ago)
        return render_template('timeghost.html', timeghost=timeghost)
    except TimeGhostError as err:
        return render_template('error.html', err=err), 404
Exemple #17
0
def fixup_events():
    user = users.get_current_user()
    now = datetime.datetime.now()

    events = Event.query().filter(Event.created_by == None).fetch()
    for event in events:
        event.created_on = now
        event.created_by = user
        event.approved = True
        event.put()
    title = "Updated events to have created_on and created_by and approved"
    return render_template('events.html', events=events, title=title)
Exemple #18
0
def permalink_server(middle_key_urlsafe, long_ago_key_urlsafe=None):
    """
    Handles permalinks for a particular timeghost if both arguments
    are given, and TimeGhosts between now and a particular middle event if
    only the middle event key is given.
    """
    try:
        if middle_key_urlsafe == 'your-birthday':
            raise TimeGhostError("timeghost doesn't know your birthday")

        middle = Event.get_from_key_or_date(middle_key_urlsafe)
        long_ago = None

        if long_ago_key_urlsafe is not None:
            long_ago = Event.get_from_key_or_date(long_ago_key_urlsafe)


        tg = TimeGhostFactory.build(middle=middle, long_ago=long_ago)
        return render_template('timeghost.html', timeghost=tg)
    except TimeGhostError as err:
        return render_template('error.html', err=err), 404
Exemple #19
0
def birthday_server(birthday_date=None):
    """ Generate a timeghost for a user-selected birth year."""
    fieldname = 'bday'
    form = 'birthday.html'
    description = "Your birthday"

    if birthday_date:
        middle = Event.get_from_key_or_date(birthday_date)
        timeghost = TimeGhostFactory.build(middle=middle)
        return render_template('timeghost.html', timeghost=timeghost)
    else:
        return form_for_now_middle(fieldname, form, description)
Exemple #20
0
def fast_timeghost_server(middle_date_str=None, now_date_str=None):
    """
    Generates a random timeghost, a timeghost between now and a particular
    time, or a timeghost between two specified times, depending on the number
    of arguments given.
    """
    try:
        if now_date_str is None:
            now = Event.now()
        else:
            now = Event.build(date_str=now_date_str)

        if middle_date_str is None:
            middle = Event.get_random(before=now)
        else:
            middle = Event.build(date_str=middle_date_str)

        timeghost = TimeGhostFactory.build(middle=middle)

        return render_template('timeghost.html', timeghost=timeghost)
    except TimeGhostError as err:
        return render_template('error.html', err=err), 404
Exemple #21
0
def form_for_now_middle(fieldname, form, description, do_events=False, get_earliest=False):
    """
    Render a form, or the response to the form. Pulls out the specified field
    and uses that to generate a TimeGhost.middle. TimeGhost.now is Event.now().
    """
    try:
        # Render requested timeghost ('form' input seems to be ignored):
        if request.method == "POST":
            middle_key_or_date = request.form[fieldname]
            middle = Event.get_from_key_or_date(middle_key_or_date, description)
            timeghost = TimeGhostFactory.build(middle=middle, get_earliest=get_earliest)
            if not do_events:
                timeghost.display_prefix = ""

            return render_template('timeghost.html', timeghost=timeghost)
        # GET request; draw the form:
        else:
            events = None
            if do_events:
                events = Event.query().order(-Event.date).fetch()
            return render_template(form, events=events)
    except TimeGhostError as err:
        return render_template('error.html', err=err), 404
Exemple #22
0
def timeghost_server(middle_date_str=None, now_date_str=None):
    """
    Generates a random timeghost, a timeghost between now and a particular
    time, or a timeghost between two specified times, depending on the number
    of arguments given.
    """
    try:
        if now_date_str is None:
            now = Event.now()
        else:
            now = Event.build(date_str=now_date_str)

        if middle_date_str is None:
            middle = Event.get_random(before=now)
        else:
            middle = Event.build(date_str=middle_date_str)

        timeghost = TimeGhostFactory.build(now=now, middle=middle)
        logging.debug("output timeghost: %s", timeghost)

        return render_template('timeghost.html', timeghost=timeghost)
    except TimeGhostError as err:
        return render_template('error.html', err=err), 404
Exemple #23
0
def events_server(middle_key_or_date=None):
    """
    Show a page of all the events, or all events EARLIER than a given key/date
    """
    try:
        events = Event.get_earlier_than(middle_key_or_date)

        title = "All Events"
        if middle_key_or_date:
            title = "Events before {0.description}".format(middle)

        return render_template('events.html', events=events, title=title)
    except TimeGhostError as err:
        return render_template('error.html', err=err), 404
Exemple #24
0
    def build(cls, now=None, middle=None, long_ago=None, get_earliest=False):
        """
        Create TimeGhost objects from triplets of events.
        """
        timeghost = TimeGhost(now=now, middle=middle, long_ago=long_ago)

        # Set the .now Event to "now" if not specified:
        if timeghost.now is None:
            timeghost.set(Event.now(), "now")

        # Generate a .middle Event if not specified:
        if timeghost.middle is None:
            timeghost.set(Event.get_random(), "middle")

        # Generate a .long_ago Event if not specified:
        if timeghost.long_ago is None:
            try:
                long_ago = timeghost.find_best_long_ago(get_earliest)
            except TimeGhostError:
                long_ago = Event.get_earliest()
            timeghost.set(long_ago, "long_ago")

        # Return a new instance to insure the init validation is run properlhy:
        return TimeGhost(timeghost.now, timeghost.middle, timeghost.long_ago)
Exemple #25
0
    def build_from_timeghost(cls, timeghost):
        """Return a completed TimeGhost based on the partial TimeGhost
        request."""

        logging.debug("TimeGhostFactory.build: %s", timeghost)

        # Timeghost between now and a random event
        if timeghost.middle is None:
            timeghost.middle = Event.get_random()
        # Timeghost for now and given middle, no long_ago
        elif timeghost.now is not None and \
             timeghost.middle is not None and \
             timeghost.long_ago is None:
            pass
        # Fully specified timeghost. Just return it.
        elif timeghost.now is not None and \
             timeghost.middle is not None and \
             timeghost.long_ago is not None:
            return timeghost
        # Otherwise error
        else:
            raise TimeGhostError("bad case in TimeGhostFactory.build for %s",
                                 timeghost)

        logging.debug("TimeGhostFactory.build: %s", timeghost)
        try:
            best_long_ago = timeghost.find_best_long_ago()
        except TimeGhostError:
            best_long_ago = Event.get_earliest()
        logging.debug("TimeGhostFactory.build: %s", best_long_ago)

        output_timeghost = TimeGhost(now=timeghost.now,
                                     middle=timeghost.middle,
                                     long_ago=best_long_ago)
        logging.debug("TimeGhostFactory.build: %s", output_timeghost)
        return output_timeghost
Exemple #26
0
def addshorturl():
    #user = users.get_current_user()
    #now = datetime.datetime.now()

    #events = Event.query().filter(Event.created_by == None).fetch()
    #events = Event.query().filter(Event.short_url == None).fetch()
    events = Event.query().fetch()
    count = 0
    for event in events:
        count += 1
        #event.created_on = now
        #event.created_by = user
        #event.approved = True
        event.set_short_url()
        #event.put() # TODO Uncomment to go live
    title = "Updated %s events to add a short_url" % count
    return render_template('events.html', events=events, title=title)
Exemple #27
0
def add_event_server():
    """ Add a new event, or draw the form to do so """
    try:
        user = users.get_current_user()
        now = datetime.datetime.now()

        # POST: parse the form input
        if request.method == "POST":
            date_str = request.form['date_str']
            description = request.form['description']
            created_on = datetime.datetime.now()
            created_by = user
            approved = users.is_current_user_admin()

            event = Event.build(
                date_str=date_str,
                description=description,
                created_on=now,
                created_by=created_by,
                approved=approved)
            event.set_short_url()
            event.put()

            mail.send_mail(
                sender="Kester Allen <*****@*****.**>",
                to="Kester Allen <*****@*****.**>",
                subject="Event added",
                body="Event %s was added" % event)

            rt = render_template('events.html', events=[event], title="Added one event")

        # GET: draw the form:
        else:
            if user:
                text = "Logout, %s" % user.nickname()
                url = users.create_logout_url('/')
            else:
                text = "Login"
                url = users.create_login_url('/')

            rt = render_template('add.html', login_url=url, login_text=text)
    except TimeGhostError as err:
        rt = render_template('error.html', err=err), 404
    return rt
Exemple #28
0
def add_event_server():
    """Add a new event and email me that it was added, or draw the form to 
    do so:"""
    try:
        user = users.get_current_user()
        now = datetime.datetime.now()

        # parse the form input
        if request.method == "POST":
            date_str = request.form['date_str']
            description = request.form['description']
            created_on = datetime.datetime.now()
            created_by = user
            approved = users.is_current_user_admin()

            event = Event.build(date_str=date_str,
                                description=description,
                                created_on=now,
                                created_by=created_by,
                                approved=approved)
            event.put()

            mail.send_mail(
                     sender="Kester Allen <*****@*****.**>",
                     to="Kester Allen <*****@*****.**>",
                     subject="Event added",
                     body="Event %s was added" % event)

            return render_template('events.html',
                                   events=[event],
                                   title="Added one event")
        # draw the form:
        else:
            if user:
                text = "Logout, %s" % user.nickname()
                url = users.create_logout_url('/')
            else:
                text = "Login"
                url = users.create_login_url('/')

            return render_template('add.html', login_url=url, login_text=text)
    except TimeGhostError as err:
        return render_template('error.html', err=err), 404
Exemple #29
0
    def post(self):
        json_data = request.get_json(force=True)
        if not json_data:
            return {'message': 'No input data provided'}, 400
        # Validate and deserialize input
        data, errors = events_schema.load(json_data)
        if errors:
            return errors, 422
        event = Event.query.filter_by(name=data['name']).first()
        if event:
            return {'message': 'Event already exists'}, 400
        event = Event(name=json_data['name'])

        db.session.add(event)
        db.session.commit()

        result = events_schema.dump(event).data

        return {"status": 'success', 'data': result}, 201
Exemple #30
0
    def post(self):
        json_data = request.get_json(force=True)
        if not json_data:
            return {'message': 'No input data provided'}, 400
        # Validate and deserialize input
        data, errors = event_schema.load(json_data)
        if errors:
            return errors, 422
        event = Event(
            location=json_data['location'],
            created=json_data['created'],
            action=json_data['action']
        )

        db.session.add(event)
        db.session.commit()

        result = event_schema.dump(event).data

        return {"status": 'success', 'data': result}, 201
Exemple #31
0
    def post(self):
        json_data = request.get_json(force=True)
        creation_date = datetime.datetime.now()
        if not json_data:
            return {'message': 'No input data provided'}, 400
        data, errors = event_schema.load(json_data)
        if errors:
            return errors, 422
        event = Event.query.filter_by(creation_date=creation_date).first()
        if event:
            return {'message': 'Event already exists'}, 400

        event = Event(
            creation_date=creation_date,
            activity_id=json_data['activity_id'],
            value=json_data['value'],
            comment=json_data['comment'],
        )

        db.session.add(event)
        db.session.commit()

        result = event_schema.dump(event).data
        return {"status": 'success', 'data': result}, 201
Exemple #32
0
def getCompetitions():
    competitions = [
        #		Competition( 'Track: Sprint World Cup', [
        #			Tournament( '', [
        #				System( '1/8 Finals', [
        #					Event( 'N1 N16 -> 1A1 1A2', 1 ),
        #					Event( 'N2 N15 -> 2A1 2A2', 1 ),
        #					Event( 'N3 N14 -> 3A1 3A2', 1 ),
        #					Event( 'N4 N13 -> 4A1 4A2', 1 ),
        #					Event( 'N5 N12 -> 5A1 5A2', 1 ),
        #					Event( 'N6 N11 -> 6A1 6A2', 1 ),
        #					Event( 'N7 N10 -> 7A1 7A2', 1 ),
        #					Event( 'N8 N9  -> 8A1 8A2', 1 ),
        #				]),
        #				System( '1/4 Finals', [
        #					Event( '1A1 8A1 -> 1B 1P', 3 ),
        #					Event( '2A1 7A1 -> 2B 2P', 3 ),
        #					Event( '3A1 6A1 -> 3B 3P', 3 ),
        #					Event( '4A1 5A1 -> 4B 4P', 3 )
        #				]),
        #				System( '1/4 Finals 5-8', [
        #					Event( '1P 2P 3P 4P -> 5R 6R 7R 8R', 1 )
        #				]),
        #				System( '1/2 Finals', [
        #					Event( '1B 4B -> 1C1 1C2', 3 ),
        #					Event( '2B 3B -> 2C1 2C2', 3 ),
        #				]),
        #				System( 'Finals', [
        #					Event( '1C1 2C1 -> 1R 2R', 3 ),
        #					Event( '1C2 2C2 -> 3R 4R', 3 )
        #				]),
        #			]),
        #			Tournament( 'B', [
        #				System( '1/4 Finals', [
        #					Event( '1A2 8A2 -> 1D1 1TT', 1 ),
        #					Event( '2A2 7A2 -> 2D1 2TT', 1 ),
        #					Event( '3A2 6A2 -> 3D1 3TT', 1 ),
        #					Event( '4A2 5A2 -> 4D1 4TT', 1 ),
        #				]),
        #				System( '1/2 Finals', [
        #					Event( '1D1 4D1 -> 1E1 1E2', 1 ),
        #					Event( '2D1 3D1 -> 2E1 2E2', 1 ),
        #				]),
        #				System( 'Finals', [
        #						Event( '1E1 2E1 -> 9R 10R', 1 ),
        #						Event( '1E2 2E2 -> 11R 12R', 1 ),
        #				]),
        #			]),
        #		]),
        Competition('Track: Sprint World Cup and World Championships', [
            Tournament('', [
                System('1/16 Finals', [
                    Event('N1 N24 -> 1A 1TT', 1),
                    Event('N2 N23 -> 2A 2TT', 1),
                    Event('N3 N22 -> 3A 3TT', 1),
                    Event('N4 N21 -> 4A 4TT', 1),
                    Event('N5 N20 -> 5A 5TT', 1),
                    Event('N6 N19 -> 6A 6TT', 1),
                    Event('N7 N18 -> 7A 7TT', 1),
                    Event('N8 N17 -> 8A 8TT', 1),
                    Event('N9 N16 -> 9A 9TT', 1),
                    Event('N10 N15 -> 10A 10TT', 1),
                    Event('N11 N14 -> 11A 11TT', 1),
                    Event('N12 N13 -> 12A 12TT', 1),
                ]),
                System('1/8 Finals', [
                    Event('1A 12A -> 1B1 1B2', 3),
                    Event('2A 11A -> 2B1 2B2', 3),
                    Event('3A 10A -> 3B1 3B2', 3),
                    Event('4A 9A -> 4B1 4B2', 3),
                    Event('5A 8A -> 5B1 5B2', 3),
                    Event('6A 7A -> 6B1 6B2', 3),
                ]),
                System('Repechages', [
                    Event('1B2 4B2 6B2 -> 1C 13TT 14TT', 1),
                    Event('2B2 3B2 5B2 -> 2C 15TT 16TT', 1),
                ]),
                System('1/4 Finals', [
                    Event('1B1 2C -> 1D 1P', 3),
                    Event('2B1 1C -> 2D 2P', 3),
                    Event('3B1 6B1 -> 3D 3P', 3),
                    Event('4B1 5B1 -> 4D 4P', 3),
                ]),
                System('1/4 Finals 5-8',
                       [Event('1P 2P 3P 4P -> 5R 6R 7R 8R', 1)]),
                System('1/2 Finals', [
                    Event('1D 4D -> 1E1 1E2', 3),
                    Event('2D 3D -> 2E1 2E2', 3),
                ]),
                System('Finals', [
                    Event('1E1 2E1 -> 1R 2R', 3),
                    Event('1E2 2E2 -> 3R 4R', 3),
                ]),
            ])
        ]),
        Competition('Track: Sprint Olympic Games', [
            Tournament('', [
                System('1/16 Finals', [
                    Event('N1 N18 -> 1A1 1A2', 1),
                    Event('N2 N17 -> 2A1 2A2', 1),
                    Event('N3 N16 -> 3A1 3A2', 1),
                    Event('N4 N15 -> 4A1 4A2', 1),
                    Event('N5 N14 -> 5A1 5A2', 1),
                    Event('N6 N13 -> 6A1 6A2', 1),
                    Event('N7 N12 -> 7A1 7A2', 1),
                    Event('N8 N11 -> 8A1 8A2', 1),
                    Event('N9 N10 -> 9A1 9A2', 1),
                ]),
                System('Repechages 1', [
                    Event('1A2 6A2 9A2 -> 1B 1TT 2TT', 1),
                    Event('2A2 5A2 7A2 -> 2B 3TT 4TT', 1),
                    Event('3A2 4A2 8A2 -> 3B 5TT 6TT', 1),
                ]),
                System('1/8 Finals', [
                    Event('1A1 3B -> 1C1 1C2', 1),
                    Event('2A1 2B -> 2C1 2C2', 1),
                    Event('3A1 1B -> 3C1 3C2', 1),
                    Event('4A1 9A1 -> 4C1 4C2', 1),
                    Event('5A1 8A1 -> 5C1 5C2', 1),
                    Event('6A1 7A1 -> 6C1 6C2', 1),
                ]),
                System('Repechages 2', [
                    Event('1C2 4C2 6C2 -> 1D 1P 2P', 1),
                    Event('2C2 3C2 5C2 -> 2D 3P 4P', 1),
                    Event('1P 2P 3P 4P -> 9R 10R 11R 12R', 1)
                ]),
                System('1/4 Finals', [
                    Event('1C1 2D -> 1F 1Q', 3),
                    Event('2C1 1D -> 2F 2Q', 3),
                    Event('3C1 6C1 -> 3F 3Q', 3),
                    Event('4C1 5C1 -> 4F 4Q', 3),
                ]),
                System('1/4 Finals 5-8',
                       [Event('1Q 2Q 3Q 4Q -> 5R 6R 7R 8R', 1)]),
                System('1/2 Finals', [
                    Event('1F 4F -> 1G1 1G2', 3),
                    Event('2F 3F -> 2G1 2G2', 3),
                ]),
                System('Finals', [
                    Event('1G1 2G1 -> 1R 2R', 3),
                    Event('1G2 2G2 -> 3R 4R', 3),
                ]),
            ]),
        ]),
        Competition('Track: Sprint 1/2 World Championships', [
            Tournament('', [
                System('1/8 Finals', [
                    Event('N1 N12 -> 1B1 1B2', 1),
                    Event('N2 N11 -> 2B1 2B2', 1),
                    Event('N3 N10 -> 3B1 3B2', 1),
                    Event('N4 N9 -> 4B1 4B2', 1),
                    Event('N5 N8 -> 5B1 5B2', 1),
                    Event('N6 N7 -> 6B1 6B2', 1),
                ]),
                System('Repechages', [
                    Event('1B2 4B2 6B2 -> 1C 9TT 10TT', 1),
                    Event('2B2 3B2 5B2 -> 2C 11TT 12TT', 1),
                ]),
                System('1/4 Finals', [
                    Event('1B1 2C -> 1D 1P', 3),
                    Event('2B1 1C -> 2D 2P', 3),
                    Event('3B1 6B1 -> 3D 3P', 3),
                    Event('4B1 5B1 -> 4D 4P', 3),
                ]),
                System('1/4 Finals 5-8',
                       [Event('1P 2P 3P 4P -> 5R 6R 7R 8R', 1)]),
                System('1/2 Finals', [
                    Event('1D 4D -> 1E1 1E2', 3),
                    Event('2D 3D -> 2E1 2E2', 3),
                ]),
                System('Finals', [
                    Event('1E1 2E1 -> 1R 2R', 3),
                    Event('1E2 2E2 -> 3R 4R', 3),
                ]),
            ])
        ]),
        Competition('Track: Sprint 1/2 Former World Cup', [
            Tournament('', [
                System('1/4 Finals', [
                    Event('N1 N8 -> 1B 1P', 1),
                    Event('N2 N7 -> 2B 2P', 1),
                    Event('N3 N6 -> 3B 3P', 1),
                    Event('N4 N5 -> 4B 4P', 1),
                ]),
                System('1/4 Finals 5-8',
                       [Event('1P 2P 3P 4P -> 5R 6R 7R 8R', 1)]),
                System('1/2 Finals', [
                    Event('1B 4B -> 1C1 1C2', 3),
                    Event('2B 3B -> 2C1 2C2', 3),
                ]),
                System('Finals', [
                    Event('1C1 2C1 -> 1R 2R', 3),
                    Event('1C2 2C2 -> 3R 4R', 3)
                ]),
            ])
        ]),
        Competition('Track: Sprint 1/2 Finals + 2', [
            Tournament('', [
                System('5-6 Final', [
                    Event('N5 N6 -> 5R 6R', 1),
                ]),
                System('1/2 Finals', [
                    Event('N1 N4 -> 1C1 1C2', 3),
                    Event('N2 N3 -> 2C1 2C2', 3),
                ]),
                System('Finals', [
                    Event('1C1 2C1 -> 1R 2R', 3),
                    Event('1C2 2C2 -> 3R 4R', 3)
                ]),
            ])
        ]),
        Competition('Track: Sprint 1/2 Finals', [
            Tournament('', [
                System('1/2 Finals', [
                    Event('N1 N4 -> 1C1 1C2', 3),
                    Event('N2 N3 -> 2C1 2C2', 3),
                ]),
                System('Finals', [
                    Event('1C1 2C1 -> 1R 2R', 3),
                    Event('1C2 2C2 -> 3R 4R', 3)
                ]),
            ])
        ]),
        Competition('Track: Sprint Direct Finals', [
            Tournament('', [
                System('Finals', [
                    Event('N1 N2 -> 1R 2R', 3),
                ]),
            ])
        ]),
    ]

    #-----------------------------------------------------------------------------------------
    competitions.append(
        Competition('Track: Keirin 12-14', [
            Tournament('', [
                System('1st Round', [
                    Event(
                        'N1 N4 N5 N8  N9 N12 N13 -> QA1 QA2 QA3 QA4 QA5 QA6 QA7',
                        1),
                    Event(
                        'N2 N3 N6 N7 N10 N11 N14 -> QB1 QB2 QB3 QB4 QB5 QB6 QB7',
                        1),
                ]),
                System('Small Final 7-12', [
                    Event('QA4 QA5 QA6 QB4 QB5 QB6 -> 7R 8R 9R 10R 11R 12R',
                          1),
                ]),
                System('Final Round 1-6', [
                    Event('QA1 QA2 QA3 QB1 QB2 QB3 -> 1R 2R 3R 4R 5R 6R', 1),
                ]),
            ])
        ]))
    competitions.append(
        Competition('Track: Keirin 15-20', [
            Tournament('', [
                System('1st Round', [
                    Event(
                        'N1 N6 N7 N12 N13 N18 N19 -> QA1 QA2 QA3 QA4 QA5 QA6 QA7',
                        1),
                    Event(
                        'N2 N5 N8 N11 N14 N17 N20 -> QB1 QB2 QB3 QB4 QB5 QB6 QB7',
                        1),
                    Event(
                        'N3 N4 N9 N10 N15 N16     -> QC1 QC2 QC3 QC4 QC5 QC6',
                        1),
                ]),
                System('Repechages', [
                    Event(
                        'QA3 QA4 QB4 QB5 QC5 QC6 QA7 -> rA1 rA2 rA3 1EE 2EE 3EE',
                        1),
                    Event(
                        'QB3 QC3 QC4 QA5 QA6 QB6 QB7 -> rB1 rB2 rB3 4EE 5EE 6EE',
                        1),
                ]),
                System('2nd Round (1/2 Finals)', [
                    Event('QA1 QC1 QB2 rA1 rB2 rA3 -> FA1 FA2 FA3 FA4 FA5 FA6',
                          1),
                    Event('QB1 QA2 QC2 rB1 rA2 rB3 -> FB1 FB2 FB3 FB4 FB5 FB6',
                          1),
                ]),
                System('Small Final 7-12', [
                    Event('FA4 FA5 FA6 FB4 FB5 FB6 -> 7R 8R 9R 10R 11R 12R',
                          1),
                ]),
                System('Final Round 1-6', [
                    Event('FA1 FA2 FA3 FB1 FB2 FB3 -> 1R 2R 3R 4R 5R 6R', 1),
                ]),
            ])
        ]))
    competitions.append(
        Competition('Track: Keirin 21', [
            Tournament('', [
                System('1st Round', [
                    Event(
                        'N1 N6 N7 N12 N13 N18 N19 -> QA1 QA2 QA3 QA4 QA5 QA6 QA7',
                        1),
                    Event(
                        'N2 N5 N8 N11 N14 N17 N20 -> QB1 QB2 QB3 QB4 QB5 QB6 QB7',
                        1),
                    Event(
                        'N3 N4 N9 N10 N15 N16 N21 -> QC1 QC2 QC3 QC4 QC5 QC6 QC7',
                        1),
                ]),
                System('Repechages', [
                    Event('QA3 QC4 QA5 QC6 QA7 -> rA1 rA2 1EE 2EE 3EE', 1),
                    Event('QB3 QB4 QB5 QB6 QB7 -> rB1 rB2 4EE 5EE 6EE', 1),
                    Event('QC3 QA4 QC5 QA6 QC7 -> rC1 rC2 7EE 8EE 9EE', 1),
                ]),
                System('2nd Round (1/2 Finals)', [
                    Event('QA1 QC1 QB2 rA1 rC1 rB2 -> FA1 FA2 FA3 FA4 FA5 FA6',
                          1),
                    Event('QB1 QA2 QC2 rB1 rA2 rC2 -> FB1 FB2 FB3 FB4 FB5 FB6',
                          1),
                ]),
                System('Small Final 7-12', [
                    Event('FA4 FA5 FA6 FB4 FB5 FB6 -> 7R 8R 9R 10R 11R 12R',
                          1),
                ]),
                System('Final Round 1-6', [
                    Event('FA1 FA2 FA3 FB1 FB2 FB3 -> 1R 2R 3R 4R 5R 6R', 1),
                ]),
            ])
        ]))
    competitions.append(
        Competition('Track: Keirin 22-28', [
            Tournament('', [
                System('1st Round', [
                    Event(
                        'N1 N8  N9 N16 N17 N24 N25 -> QA1 QA2 QA3 QA4 QA5 QA6 QA7',
                        1),
                    Event(
                        'N2 N7 N10 N15 N18 N23 N26 -> QB1 QB2 QB3 QB4 QB5 QB6 QB7',
                        1),
                    Event(
                        'N3 N6 N11 N14 N19 N22 N27 -> QC1 QC2 QC3 QC4 QC5 QC6 QC7',
                        1),
                    Event(
                        'N4 N5 N12 N13 N20 N21 N28 -> QD1 QD2 QD3 QD4 QD5 QD6 QD7',
                        1),
                ]),
                System('Repechages', [
                    Event('QA3 QD4 QC5 QB6 QA7 -> rA1  1EE  2EE  3EE  4EE', 1),
                    Event('QB3 QC4 QB5 QA6 QD7 -> rB1  5EE  6EE  7EE  8EE', 1),
                    Event('QC3 QB4 QA5 QD6 QC7 -> rC1  9EE 10EE 11EE 12EE', 1),
                    Event('QD3 QA4 QD5 QC6 QB7 -> rD1 13EE 14EE 15EE 16EE', 1),
                ]),
                System('2nd Round (1/2 Finals)', [
                    Event('QA1 QD1 QB2 QC2 rA1 rD1 -> FA1 FA2 FA3 FA4 FA5 FA6',
                          1),
                    Event('QB1 QC1 QA2 QD2 rB1 rC1 -> FB1 FB2 FB3 FB4 FB5 FB6',
                          1),
                ]),
                System('Small Final 7-12', [
                    Event('FA4 FA5 FA6 FB4 FB5 FB6 -> 7R 8R 9R 10R 11R 12R',
                          1),
                ]),
                System('Final Round 1-6', [
                    Event('FA1 FA2 FA3 FB1 FB2 FB3 -> 1R 2R 3R 4R 5R 6R', 1),
                ]),
            ])
        ]))
    competitions.append(
        Competition('Track: Keirin 29-42', [
            Tournament('', [
                System('1st Round', [
                    Event(
                        'N1 N12 N13 N24 N25 N36 N37 -> QA1 QA2 QA3 QA4 QA5 QA6 QA7',
                        1),
                    Event(
                        'N2 N11 N14 N23 N26 N35 N38 -> QB1 QB2 QB3 QB4 QB5 QB6 QB7',
                        1),
                    Event(
                        'N3 N10 N15 N22 N27 N34 N39 -> QC1 QC2 QC3 QC4 QC5 QC6 QC7',
                        1),
                    Event(
                        'N4  N9 N16 N21 N28 N33 N40 -> QD1 QD2 QD3 QD4 QD5 QD6 QD7',
                        1),
                    Event(
                        'N5  N8 N17 N20 N29 N32 N41 -> QE1 QE2 QE3 QE4 QE5 QE6 QE7',
                        1),
                    Event(
                        'N6  N7 N18 N19 N30 N31 N42 -> QF1 QF2 QF3 QF4 QF5 QF6 QF7',
                        1),
                ]),
                System('Repechages', [
                    Event('QA2 QF3 QE4 QD5 QC6 QB7 -> rA1  1EE  2EE  3EE  4EE',
                          1),
                    Event('QB2 QE3 QD4 QC5 QB6 QA7 -> rB1  5EE  6EE  7EE  8EE',
                          1),
                    Event('QC2 QD3 QC4 QB5 QA6 QF7 -> rC1  9EE 10EE 11EE 12EE',
                          1),
                    Event('QD2 QC3 QB4 QA5 QF6 QE7 -> rD1 13EE 14EE 15EE 16EE',
                          1),
                    Event('QE2 QB3 QA4 QF5 QE6 QD7 -> rE1 17EE 18EE 19EE 20EE',
                          1),
                    Event('QF2 QA3 QF4 QE5 QD6 QC7 -> rF1 21EE 22EE 23EE 24EE',
                          1),
                ]),
                System('2nd Round (1/2 Finals)', [
                    Event('QA1 QD1 QE1 rA1 rD1 rE1 -> FA1 FA2 FA3 FA4 FA5 FA6',
                          1),
                    Event('QB1 QC1 QF1 rB1 rC1 rF1 -> FB1 FB2 FB3 FB4 FB5 FB6',
                          1),
                ]),
                System('Small Final 7-12', [
                    Event('FA4 FA5 FA6 FB4 FB5 FB6 -> 7R 8R 9R 10R 11R 12R',
                          1),
                ]),
                System('Final Round 1-6', [
                    Event('FA1 FA2 FA3 FB1 FB2 FB3 -> 1R 2R 3R 4R 5R 6R', 1),
                ]),
            ])
        ]))
    competitions.append(
        Competition('Track: Keirin 43-49', [
            Tournament('', [
                System('1st Round', [
                    Event(
                        'N1 N14 N15 N28 N29 N42 N43 -> QA1 QA2 QA3 QA4 QA5 QA6 QA7',
                        1),
                    Event(
                        'N2 N13 N16 N27 N30 N41 N44 -> QB1 QB2 QB3 QB4 QB5 QB6 QB7',
                        1),
                    Event(
                        'N3 N12 N17 N26 N31 N40 N45 -> QC1 QC2 QC3 QC4 QC5 QC6 QC7',
                        1),
                    Event(
                        'N4 N11 N18 N25 N32 N39 N46 -> QD1 QD2 QD3 QD4 QD5 QD6 QD7',
                        1),
                    Event(
                        'N5 N10 N19 N24 N33 N38 N47 -> QE1 QE2 QE3 QE4 QE5 QE6 QE7',
                        1),
                    Event(
                        'N6  N9 N20 N23 N34 N37 N48 -> QF1 QF2 QF3 QF4 QF5 QF6 QF7',
                        1),
                    Event(
                        'N7  N8 N21 N22 N35 N36 N49 -> QG1 QG2 QG3 QG4 QG5 QG6 QG7',
                        1),
                ]),
                System('Repechages 1', [
                    Event(
                        'QA2 QG2 QF3 QE4 QD5 QC6 QB7 -> rA1 rA2  1EE  2EE  3EE  4EE  5EE',
                        1),
                    Event(
                        'QB2 QA3 QG3 QF4 QE5 QD6 QC7 -> rB1 rB2  6EE  7EE  8EE  9EE 10EE',
                        1),
                    Event(
                        'QC2 QB3 QA4 QG4 QF5 QE6 QD7 -> rC1 rC2 11EE 12EE 13EE 14EE 15EE',
                        1),
                    Event(
                        'QD2 QC3 QB4 QA5 QG5 QF6 QE7 -> rD1 rD2 16EE 17EE 18EE 19EE 20EE',
                        1),
                    Event(
                        'QE2 QD3 QC4 QB5 QA6 QG6 QF7 -> rE1 rE2 21EE 22EE 23EE 24EE 25EE',
                        1),
                    Event(
                        'QF2 QE3 QD4 QC5 QB6 QA7 QG7 -> rF1 rF2 26EE 27EE 28EE 29EE 30EE',
                        1),
                ]),
                System('1/4 Finals', [
                    Event(
                        'QA1 QF1 QG1 rC1 rB2 rC2     -> SA1 SA2 SA3 SA4 SA5 SA6',
                        1),
                    Event(
                        'QB1 QE1 rA1 rD1 rA2 rD2     -> SB1 SB2 SB3 SB4 SB5 SB6',
                        1),
                    Event(
                        'QC1 QD1 rB1 rE1 rF1 rE2 rF2 -> SC1 SC2 SC3 SC4 SC5 SC6 SC7',
                        1),
                ]),
                System('Repechages 2', [
                    Event(
                        'SA3 SA4 SB4 SB5 SC5 SC6 SC7 -> sA1 sA2 sA3 31EE 32EE 33EE 34EE',
                        1),
                    Event(
                        'SB3 SC3 SC4 SA5 SA6 SB6     -> sB1 sB2 sB3 35EE 36EE 37EE',
                        1),
                ]),
                System('1/2 Finals', [
                    Event('SA1 SC1 SB2 sA1 sB2 sA3 -> FA1 FA2 FA3 FA4 FA5 FA6',
                          1),
                    Event('SB1 SA2 SC2 sB1 sA2 sB3 -> FB1 FB2 FB3 FB4 FB5 FB6',
                          1),
                ]),
                System('Small Final 7-12', [
                    Event('FA4 FA5 FA6 FB4 FB5 FB6 -> 7R 8R 9R 10R 11R 12R',
                          1),
                ]),
                System('Final Round 1-6', [
                    Event('FA1 FA2 FA3 FB1 FB2 FB3 -> 1R 2R 3R 4R 5R 6R', 1),
                ]),
            ])
        ]))
    '''
	competitions.append(
		Competition( 'Track: Keirin 50-56', [
			Tournament( '', [
				System( '1st Round', [
					Event( 'N1 N16 N17 N32 N33 N48 N49 -> QA1 QA2 QA3 QA4 QA5 QA6 QA7', 1 ),
					Event( 'N2 N15 N18 N31 N34 N47 N50 -> QB1 QB2 QB3 QB4 QB5 QB6 QB7', 1 ),
					Event( 'N3 N14 N19 N30 N35 N46 N51 -> QC1 QC2 QC3 QC4 QC5 QC6 QC7', 1 ),
					Event( 'N4 N13 N20 N29 N36 N45 N52 -> QD1 QD2 QD3 QD4 QD5 QD6 QD7', 1 ),
					Event( 'N5 N12 N21 N28 N37 N44 N53 -> QE1 QE2 QE3 QE4 QE5 QE6 QE7', 1 ),
					Event( 'N6 N11 N22 N27 N38 N43 N54 -> QF1 QF2 QF3 QF4 QF5 QF6 QF7', 1 ),
					Event( 'N7 N10 N23 N26 N39 N42 N55 -> QG1 QG2 QG3 QG4 QG5 QG6 QG7', 1 ),
					Event( 'N8  N9 N24 N25 N40 N41 N56 -> QH1 QH2 QH3 QH4 QH5 QH6 QH7', 1 ),
				]),
				System( 'Repechages 1', [
					Event( 'QA2 QH2 QG3 QF4 QE5 QD6 QC7 -> rA1 rA2  1EE  2EE  3EE  4EE  5EE', 1 ),
					Event( 'QB2 QA3 QH3 QG4 QF5 QE6 QD7 -> rB1 rB2  6EE  7EE  8EE  9EE 10EE', 1 ),
					Event( 'QC2 QB3 QA4 QH4 QG5 QF6 QE7 -> rC1 rC2 11EE 12EE 13EE 14EE 15EE', 1 ),
					Event( 'QD2 QC3 QB4 QA5 QH5 QG6 QF7 -> rD1 rD2 16EE 17EE 18EE 19EE 20EE', 1 ),
					Event( 'QE2 QD3 QC4 QB5 QA6 QH6 QG7 -> rE1 rE2 21EE 22EE 23EE 24EE 25EE', 1 ),
					Event( 'QF2 QE3 QD4 QC5 QB6 QA7 QH7 -> rF1 rF2 26EE 27EE 28EE 29EE 30EE', 1 ),
					Event( 'QG2 QF3 QE4 QD5 QC6 QB7     -> rG1 rG2 31EE 32EE 33EE 34EE', 1 ),
				]),
				System( '1/4 Finals', [
					Event( 'QA1 QH1 rA1 rB2 rC2     -> SA1 SA2 SA3 SA4 SA5 SA6', 1 ),
					Event( 'QB1 QG1 rB1 rA2 rD2     -> SB1 SB2 SB3 SB4 SB5 SB6', 1 ),
					Event( 'QC1 QF1 rC1 rG1 rE2     -> SC1 SC2 SC3 SC4 SC5 SC6', 1 ),
					Event( 'QD1 QE1 rD1 rF1 rF2 rG2 -> SD1 SD2 SD3 SD4 SD5 SD6 SD7', 1 ),
				]),
				System( 'Repechages 2', [
					Event( 'SA3 SD3 SA5 SB5 SC6 SD6 -> sA1 sA2 35EE 36EE 37EE 38EE 39EE', 1 ),
					Event( 'SB3 SA4 SD4 SC5 SB6 SD7 -> sB1 sB2 40EE 41EE 42EE 43EE 44EE', 1 ),
					Event( 'SC3 SB4 SC4 SD5 SA6     -> sC1 sC2 45EE 46EE 47EE 48EE', 1 ),
				]),
				System( '1/2 Finals', [
					Event( 'SA1 SD1 SB2 SC2 sA1 sC1 sB2 -> FA1 FA2 FA3 FA4 FA5 FA6', 1 ),
					Event( 'SB1 SC1 SA2 SD2 sB1 sA2 sC2 -> FB1 FB2 FB3 FB4 FB5 FB6', 1 ),
				]),
				System( 'Small Final 7-12', [
					Event( 'FA4 FA5 FA6 FB4 FB5 FB6 -> 7R 8R 9R 10R 11R 12R', 1 ),
				]),
				System( 'Final Round 1-6', [
					Event( 'FA1 FA2 FA3 FB1 FB2 FB3 -> 1R 2R 3R 4R 5R 6R', 1 ),
				]),
			])
		])
	)
	'''

    #-----------------------------------------------------------------------------------------
    competitions.append(
        Competition('MTB: XCE 36', [
            Tournament('', [
                System('Round 1', [
                    Event(
                        'N1 N12 N13 N24 N25 N36 -> 1A 2A  1RR_1_3  2RR_1_4  3RR_1_5  4RR_1_6',
                        1),
                    Event(
                        'N6  N7 N18 N19 N30 N31 -> 3A 4A  5RR_1_3  6RR_1_4  7RR_1_5  8RR_1_6',
                        1),
                    Event(
                        'N3 N10 N15 N22 N27 N34 -> 5A 6A  9RR_1_3 10RR_1_4 11RR_1_5 12RR_1_6',
                        1),
                    Event(
                        'N4  N9 N16 N21 N28 N33 -> 1B 2B 13RR_1_3 14RR_1_4 15RR_1_5 16RR_1_6',
                        1),
                    Event(
                        'N2 N11 N14 N23 N26 N35 -> 3B 4B 17RR_1_3 18RR_1_4 19RR_1_5 20RR_1_6',
                        1),
                    Event(
                        'N5  N8 N17 N20 N29 N32 -> 5B 6B 21RR_1_3 22RR_1_4 23RR_1_5 24RR_1_6',
                        1),
                ]),
                System('1/2 Finals', [
                    Event('1A 2A 3A 4A 5A 6A -> 1C 2C 3C 4C 5C 6C', 1),
                    Event('1B 2B 3B 4B 5B 6B -> 1D 2D 3D 4D 5D 6D', 1),
                ]),
                System('Finals', [
                    Event('4C 5C 6C 4D 5D 6D -> 7R 8R 9R 10R 11R 12R', 1),
                    Event('1C 2C 3C 1D 2D 3D -> 1R 2R 3R 4R 5R 6R', 1),
                ]),
            ])
        ]))

    #-----------------------------------------------------------------------------------------
    competitions.append(
        Competition('MTB: XCE 12', [
            Tournament('', [
                System('1/2 Finals', [
                    Event('N1 N3 N6 N7 N10 N12 -> 1C 2C 3C 4C 5C 6C', 1),
                    Event('N2 N4 N5 N8 N9  N11 -> 1D 2D 3D 4D 5D 6D', 1),
                ]),
                System('Finals', [
                    Event('4C 5C 6C 4D 5D 6D -> 7R 8R 9R 10R 11R 12R', 1),
                    Event('1C 2C 3C 1D 2D 3D -> 1R 2R 3R 4R 5R 6R', 1),
                ]),
            ])
        ]))

    #-----------------------------------------------------------------------------------------
    competitions.append(
        Competition('MTB: XCE 32', [
            Tournament('', [
                System('1/8 Finals', [
                    Event('N1 N16 N17 N32 -> 1A1 1A2  1RR_1_3  2RR_1_4', 1),
                    Event('N8  N9 N24 N25 -> 2A3 2A4  3RR_1_3  4RR_1_4', 1),
                    Event('N5 N12 N21 N28 -> 3B1 3B2  5RR_1_3  6RR_1_4', 1),
                    Event('N4 N13 N20 N29 -> 4B3 4B4  7RR_1_3  8RR_1_4', 1),
                    Event('N2 N15 N18 N31 -> 5C1 5C2  9RR_1_3 10RR_1_4', 1),
                    Event('N7 N10 N23 N26 -> 6C3 6C4 11RR_1_3 12RR_1_4', 1),
                    Event('N3 N14 N19 N30 -> 7D1 7D2 13RR_1_3 14RR_1_4', 1),
                    Event('N6 N11 N22 N27 -> 8D3 8D4 15RR_1_3 16RR_1_4', 1),
                ]),
                System('1/4 Finals', [
                    Event('1A1 1A2 2A3 2A4 -> 1E1 1E2 1RR_2_3 2RR_2_4', 1),
                    Event('3B1 3B2 4B3 4B4 -> 2E3 2E4 3RR_2_3 4RR_2_4', 1),
                    Event('5C1 5C2 6C3 6C4 -> 3F1 3F2 5RR_2_3 6RR_2_4', 1),
                    Event('7D1 7D2 8D3 8D4 -> 3F3 3F4 7RR_2_3 8RR_2_4', 1),
                ]),
                System('1/2 Finals', [
                    Event('1E1 1E2 2E3 2E4 -> 1G1 1G2 1G3 1G4', 1),
                    Event('3F1 3F2 3F3 3F4 -> 2H1 2H2 2H3 2H4', 1),
                ]),
                System('Finals', [
                    Event('1G3 1G4 2H3 2H4 -> 5R 6R 7R 8R', 1),
                    Event('1G1 1G2 2H1 2H2 -> 1R 2R 3R 4R', 1),
                ]),
            ])
        ]))

    #-----------------------------------------------------------------------------------------
    # Code the round and rank of the eliminated riders in the RR codes as the last values.
    competitions.append(
        Competition('MTB: XCE 16', [
            Tournament('', [
                System('1/4 Finals', [
                    Event('N1 N8  N9 N16 -> 1E1 1E2 1RR_1_3 2RR_1_4', 1),
                    Event('N4 N5 N12 N13 -> 2E3 2E4 3RR_1_3 4RR_1_4', 1),
                    Event('N2 N7 N10 N15 -> 3F1 3F2 5RR_1_3 6RR_1_4', 1),
                    Event('N3 N6 N11 N14 -> 3F3 3F4 7RR_1_3 8RR_1_4', 1),
                ]),
                System('1/2 Finals', [
                    Event('1E1 1E2 2E3 2E4 -> 1G1 1G2 1G3 1G4', 1),
                    Event('3F1 3F2 3F3 3F4 -> 2H1 2H2 2H3 2H4', 1),
                ]),
                System('Finals', [
                    Event('1G3 1G4 2H3 2H4 -> 5R 6R 7R 8R', 1),
                    Event('1G1 1G2 2H1 2H2 -> 1R 2R 3R 4R', 1),
                ]),
            ])
        ]))

    competitions.append(
        Competition('MTB: XCE 8', [
            Tournament('', [
                System('1/2 Finals', [
                    Event('N1 N4 N5 N8 -> 1G1 1G2 1G3 1G4', 1),
                    Event('N2 N3 N6 N7 -> 2H1 2H2 2H3 2H4', 1),
                ]),
                System('Finals', [
                    Event('1G3 1G4 2H3 2H4 -> 5R 6R 7R 8R', 1),
                    Event('1G1 1G2 2H1 2H2 -> 1R 2R 3R 4R', 1),
                ]),
            ])
        ]))

    #-----------------------------------------------------------------------------------------
    competitions.append(
        Competition('MTB: Four Cross 64', [
            Tournament('', [
                System('Round 1', [
                    Event('N64  N1 N33 N32 -> 32A  1A  1RR_1_3  2RR_1_4', 1),
                    Event('N17 N49 N16 N48 -> 17A 16A  3RR_1_3  4RR_1_4', 1),
                    Event('N40 N25 N57  N8 -> 25A  8A  5RR_1_3  6RR_1_4', 1),
                    Event('N41 N24 N56  N9 -> 24A  9A  7RR_1_3  8RR_1_4', 1),
                    Event('N29  N4 N36 N61 -> 29A  4A  9RR_1_3 10RR_1_4', 1),
                    Event('N45 N20 N13 N52 -> 20A 13A 11RR_1_3 12RR_1_4', 1),
                    Event('N28 N37  N5 N60 -> 28A  5A 13RR_1_3 14RR_1_4', 1),
                    Event('N44 N21 N12 N53 -> 21A 12A 15RR_1_3 16RR_1_4', 1),
                    Event('N34 N31 N63  N2 -> 31A  2A 17RR_1_3 18RR_1_4', 1),
                    Event('N47 N18 N50 N15 -> 18A 15A 19RR_1_3 20RR_1_4', 1),
                    Event('N39 N26  N7 N58 -> 26A  7A 21RR_1_3 22RR_1_4', 1),
                    Event('N10 N55 N23 N42 -> 23A 10A 23RR_1_3 24RR_1_4', 1),
                    Event('N30 N35 N62  N3 -> 30A  3A 25RR_1_3 26RR_1_4', 1),
                    Event('N19 N46 N51 N14 -> 19A 14A 27RR_1_3 28RR_1_4', 1),
                    Event('N38 N27  N6 N59 -> 27A  6A 29RR_1_3 30RR_1_4', 1),
                    Event('N43 N22 N11 N54 -> 22A 11A 31RR_1_3 32RR_1_4', 1),
                ]),
                System('Round 2', [
                    Event('32A 1A 17A 16A -> 1B 16B  1RR_2_3  2RR_2_4', 1),
                    Event('25A 8A 24A  9A -> 8B  9B  3RR_2_3  4RR_2_4', 1),
                    Event('29A 4A 20A 13A -> 4B 13B  5RR_2_3  6RR_2_4', 1),
                    Event('28A 5A 21A 12A -> 5B 12B  7RR_2_3  8RR_2_4', 1),
                    Event('31A 2A 18A 15A -> 2B 15B  9RR_2_3 10RR_2_4', 1),
                    Event('26A 7A 23A 10A -> 7B 10B 11RR_2_3 12RR_2_4', 1),
                    Event('30A 3A 19A 14A -> 3B 14B 13RR_2_3 14RR_2_4', 1),
                    Event('27A 6A 22A 11A -> 6B 11B 15RR_2_3 16RR_2_4', 1),
                ]),
                System('Round 3', [
                    Event('1B 16B 8B  9B -> 1C 8C 1RR_3_3 2RR_3_4', 1),
                    Event('4B 13B 5B 12B -> 4C 5C 3RR_3_3 4RR_3_4', 1),
                    Event('2B 15B 7B 10B -> 2C 7C 5RR_3_3 6RR_3_4', 1),
                    Event('3B 14B 6B 11B -> 3C 6C 7RR_3_3 8RR_3_4', 1),
                ]),
                System('Round 4', [
                    Event('1C 5C 4C 8C -> 1D 3D 5D 7D', 1),
                    Event('2C 7C 3C 6C -> 2D 4D 6D 8D', 1),
                ]),
                System('Finals', [
                    Event('5D 6D 7D 8D -> 5R 6R 7R 8R', 1),
                    Event('1D 2D 3D 4D -> 1R 2R 3R 4R', 1),
                ]),
            ])
        ]), )

    # Derive Four Cross for 32 and 16 starters from 64 starters.
    for i in six.moves.range(2):
        fcX = copy.deepcopy(competitions[-1])
        fcX.tournaments[0].systems.pop(0)
        fcX.starters //= 2
        fcX.name = 'MTB: Four Cross %d' % fcX.starters
        for event in fcX.tournaments[0].systems[0].events:
            event.composition = ['N%s' % c[:-1] for c in event.composition]
        for system in fcX.tournaments[0].systems:
            if system.name.startswith('Round'):
                system.name = 'Round %d' % (int(system.name.split()[1]) - 1)
        competitions.append(fcX)

    #-----------------------------------------------------------------------------------------
    def genN(iStart, iEnd, stride=1):
        return ' '.join('N{}'.format(i)
                        for i in six.moves.range(iStart, iEnd + 1, stride))

    def gen(suffix, iStart, iEnd, stride=1):
        return ' '.join('{}{}'.format(i, suffix)
                        for i in six.moves.range(iStart, iEnd + 1, stride))

    competitions.append(
        Competition('Track: Track Endurance Eliminator', [
            Tournament('', [
                System('Round 1', [
                    Event(
                        genN(1, 96, 4) + ' -> ' + gen('B', 1, 15) + ' ' +
                        gen('RepA', 1, 9), 1),
                    Event(
                        genN(2, 96, 4) + ' -> ' + gen('B', 16, 30) + ' ' +
                        gen('RepA', 10, 18), 1),
                    Event(
                        genN(3, 96, 4) + ' -> ' + gen('B', 31, 45) + ' ' +
                        gen('RepA', 19, 27), 1),
                    Event(
                        genN(4, 96, 4) + ' -> ' + gen('B', 46, 60) + ' ' +
                        gen('RepA', 28, 36), 1),
                ]),
                System('Repechage A', [
                    Event(
                        gen('RepA', 1, 9) + ' ' + gen('RepA', 19, 27) +
                        ' -> ' + gen('B', 61, 66), 1),
                    Event(
                        gen('RepA', 10, 18) + ' ' + gen('RepA', 28, 36) +
                        ' -> ' + gen('B', 67, 72), 1),
                ]),
                System('Round 2', [
                    Event(
                        gen('B', 1, 72, 3) + ' -> ' + gen('C', 1, 8) + ' ' +
                        gen('RepB', 1, 16), 1),
                    Event(
                        gen('B', 2, 72, 3) + ' -> ' + gen('C', 9, 16) + ' ' +
                        gen('RepB', 17, 32), 1),
                    Event(
                        gen('B', 3, 72, 3) + ' -> ' + gen('C', 17, 24) + ' ' +
                        gen('RepB', 33, 48), 1),
                ]),
                System('Repechage B', [
                    Event(
                        gen('RepB', 1, 16, 2) + ' ' + gen('RepB', 17, 32, 2) +
                        ' -> ' + gen('C', 25, 30), 1),
                    Event(
                        gen('RepB', 2, 8, 2) + ' ' + gen('RepB', 18, 24, 2) +
                        ' ' + gen('RepB', 33, 48, 2) + ' -> ' +
                        gen('C', 31, 36), 1),
                    Event(
                        gen('RepB', 10, 16, 2) + ' ' + gen('RepB', 26, 32, 2) +
                        ' ' + gen('RepB', 34, 48, 2) + ' -> ' +
                        gen('C', 37, 42), 1),
                ]),
                System('Semi Finals', [
                    Event(
                        gen('C', 1, 42, 2) + ' -> ' + gen('D', 1, 10) + ' ' +
                        gen('RepC', 1, 11), 1),
                    Event(
                        gen('C', 2, 42, 2) + ' -> ' + gen('D', 11, 20) + ' ' +
                        gen('RepC', 12, 22), 1),
                ]),
                System('Repechage C', [
                    Event(gen('RepC', 1, 22) + ' -> ' + gen('D', 21, 24), 1),
                ]),
                System('Finals', [
                    Event(gen('D', 1, 24) + ' -> ' + gen('R', 1, 24), 1),
                ]),
            ])
        ]), )
    return competitions
Exemple #33
0
def approve_all():
    events = Event.query().fetch()
    for event in events:
        event.approved = True
        event.put()
    return "HI"
Exemple #34
0
def fight_club_server():
    """ Generate a timeghost for the release of Fight Club """
    fight_club = Event.get_from_key_or_date(
        'ag9zfnRpbWVnaG9zdC1hcHByEgsSBUV2ZW50GICAgICG7IcKDA')
    timeghost = TimeGhostFactory.build(middle=fight_club)
    return render_template('fight_club.html', timeghost=timeghost)