Пример #1
0
def unlock_tourney():
    key = request.args.get('key')
    tourney_id = request.args.get('tourney_id')
    pm = PersistenceManager(myapp.db_connector)
    state = ""
    try:
        tourney = pm.get_tourney_by_id(tourney_id)
        if len(key) and tourney.email == key:
            response = jsonify( result="success")
            if tourney.locked == True: #flip the lock
                tourney.locked = False
                state = "unlocked"
            else:
                tourney.locked = True
                state = "locked"
            event = Event(remote_address=myapp.remote_address(request),
                  event_date=func.now(),
                  event="lock/unlock tourney",
                  event_details="set tourney %s to state %s" % ( tourney.tourney_name, state ))
            pm.db_connector.get_session().add(event)
            pm.db_connector.get_session().commit()
            return response
        else:
            response = jsonify(result="fail")
            return response
    except Exception, e:
        error = "someone tried to unlock tourney_id " + tourney_id + " with email address " + key + " ( expected " + tourney.email + " ) "
        mail_error( error  )
        response = jsonify(message=str(e))
        response.status_code = (500)
        return response
Пример #2
0
def delete_tourney():
    tourney_name = request.args.get('tourney')
    pm = PersistenceManager(myapp.db_connector)
    pm.delete_tourney(tourney_name)

    event = Event(remote_address=myapp.remote_address(request),
                  event_date=func.now(),
                  event="delete tourney",
                  event_details="deleted tourney %s" % ( tourney_name ))
    pm.db_connector.get_session().add(event)
    pm.db_connector.get_session().commit()

    return redirect(url_for('tourneys') )
Пример #3
0
def update_tourney_details():
    tourney_id            = request.form['tourney_id']
    name                  = decode( request.form['name'] )
    type                  = request.form['tourney_type']
    print request.form['datepicker']
    mmddyyyy              = request.form['datepicker'].split('/')
    date                  = datetime.date( int(mmddyyyy[2]),int(mmddyyyy[0]), int(mmddyyyy[1])) #YYYY, MM, DD
    round_length  = request.form['round_length_userdef']
    tourney_format_def    = request.form['tourney_format_dropdown']
    tourney_format_custom = request.form['tourney_format_custom']
    participant_count     = int(request.form['participant_count'])
    country               = decode(request.form['country'])
    state                 = decode(request.form['state'])
    city                  = decode(request.form['city'])
    venue                 = decode(request.form['venue'])


    tourney_format = None
    if tourney_format_def is None or len(tourney_format_def) == 0:
        if tourney_format_custom is None or len(tourney_format_custom) == 0:
            tourney_format = xwingmetadata.format_default
        else:
            tourney_format = decode(tourney_format_custom)
    else:
        tourney_format = str(tourney_format_def)


    pm                = PersistenceManager(myapp.db_connector)
    tourney           = pm.get_tourney_by_id(tourney_id)

    tourney.tourney_name = name
    tourney.tourney_type  = type
    tourney.tourney_date = date
    tourney.round_length = round_length
    tourney.format = tourney_format
    tourney.participant_count = participant_count
    tourney.venue.country = country
    tourney.venue.state = state
    tourney.venue.city = city
    tourney.venue.venue = venue

    event = Event(remote_address=myapp.remote_address(request),
                  event_date=func.now(),
                  event="edit tourney information",
                  event_details="edited " + name )

    pm.db_connector.get_session().add(event)
    pm.db_connector.get_session().commit()

    return redirect( url_for( 'get_tourney_details', tourney_id=tourney_id) )
Пример #4
0
def export_tourney_lists():
    tourney_id = request.args.get('tourney_id')
    pm         = PersistenceManager(myapp.db_connector)
    tourney    = pm.get_tourney_by_id(tourney_id)

    ret = get_tourney_lists_as_text(tourney)

    event = Event(remote_address=myapp.remote_address(request),
                  event_date=func.now(),
                  event="export tourney lists",
                  event_details="exported tourney %s" % ( tourney.tourney_name ))
    pm.db_connector.get_session().add(event)
    pm.db_connector.get_session().commit()

    return csv_response( ret, "tourney_list_download.csv")
Пример #5
0
def export_all_lists():
    pm          = PersistenceManager(myapp.db_connector)
    tourneys    = pm.get_tourneys();
    make_header = True
    rows        = []
    for tourney in tourneys:
        ret = get_tourney_lists_as_text(tourney, make_header)
        make_header = False
        rows.extend( ret )

    event = Event(remote_address=myapp.remote_address(request),
                  event_date=func.now(),
                  event="export all tourney lists")
    pm.db_connector.get_session().add(event)
    pm.db_connector.get_session().commit()
    return csv_response( rows, "all_lists_download.csv")
Пример #6
0
def delete_list_and_retry():
    tourney_list_id = request.args.get('tourney_list_id')
    print("calling delete list and retry on tourney id " + tourney_list_id)

    pm = PersistenceManager(myapp.db_connector)
    tourney_list = pm.get_tourney_list(tourney_list_id)
    pm.delete_tourney_list_details( tourney_list )

    event = Event(remote_address=myapp.remote_address(request),
                  event_date=func.now(),
                  event="delete list",
                  event_details="deleted list id %d from tourney %s" % ( tourney_list.id, tourney_list.tourney.tourney_name ))
    pm = PersistenceManager(myapp.db_connector)
    pm.db_connector.get_session().add(event)
    pm.db_connector.get_session().commit()

    return redirect( url_for('enter_list', tourney=tourney_list.tourney.id, tourney_list_id=tourney_list.id ) )
Пример #7
0
     def get(self, tourney_id):
        pm = PersistenceManager(myapp.db_connector)
        t = pm.get_tourney_by_id(tourney_id)
        if t is None:
            response = jsonify(message="tourney %d not found" % (tourney_id))
            response.status_code = 404
            return response

        # and log it
        event = Event(remote_address=myapp.remote_address(request),
                      event_date=func.now(),
                      event="API",
                      event_details="tournament API: tourney GET")
        pm.db_connector.get_session().add(event)
        pm.db_connector.get_session().commit()

        json = TourneyToJsonConverter().convert(t,provide_points=True)
        return jsonify(json)
Пример #8
0
    def get(self, tourney_id):
        pm = PersistenceManager(myapp.db_connector)
        t = pm.get_tourney_by_id(tourney_id)
        if t is None:
            response = jsonify(message="tourney %d not found" % ( tourney_id ))
            response.status_code = 404
            return response

        # and log it
        event = Event(remote_address=myapp.remote_address(request),
                      event_date=func.now(),
                      event="API",
                      event_details="tournament API: tourney GET")
        pm.db_connector.get_session().add(event)

        pm.db_connector.get_session().commit()

        return jsonify(TourneyToJsonConverter().convert(t))
Пример #9
0
def edit_ranking_row():

    #see https://editor.datatables.net/manual/server
    tourney_id        = request.args['tourney_id']
    pm                = PersistenceManager(myapp.db_connector)
    tourney           = pm.get_tourney_by_id(tourney_id)

    de = RankingEditor(pm, tourney)

    event = Event(remote_address=myapp.remote_address(request),
                  event_date=func.now(),
                  event="edit ranking row")

    player_name = request.values['data[player_name]']
    player_name = decode(player_name)
    ret = de.set_and_get_json(request, player_name, event)
    event.event_details = event.event_details + " in tourney " + tourney.tourney_name
    pm.db_connector.get_session().add(event)
    pm.db_connector.get_session().commit()
    return ret
Пример #10
0
def enter_list():
    tourney_id    = request.args.get('tourney')
    tourney_list_id = request.args.get('tourney_list_id')

    pm = PersistenceManager(myapp.db_connector)
    tourney_list = None
    tourney = None

    if tourney_list_id is None:
        tourney = pm.get_tourney_by_id(tourney_id)
        tourney_list = pm.get_random_tourney_list(tourney)
        if tourney_list is None:
            return redirect(url_for( "success", tourney_name=tourney.tourney_name ) )
    else:
        tourney_list = pm.get_tourney_list(tourney_list_id)
        tourney      = tourney_list.tourney

    m = xwingmetadata.XWingMetaData()

    image_src = None
    if tourney_list.image is not None:
        image_src = urllib.quote(tourney_list.image)

    event = Event(remote_address=myapp.remote_address(request),
                  event_date=func.now(),
                  event="create list",
                  event_details="created list %d for tourney %s" % ( tourney_list.id,  tourney.tourney_name ))
    pm = PersistenceManager(myapp.db_connector)
    pm.db_connector.get_session().add(event)
    pm.db_connector.get_session().commit()

    return render_template('list_entry.html',
                           meta=m,
                           image_src=image_src,
                           tourney_list=tourney_list,
                           tourney_list_id=tourney_list.id,
                           tourney_id=tourney.id,
                           tourney=tourney)
Пример #11
0
    def delete(self, tourney_id):
        pm = PersistenceManager(myapp.db_connector)
        helper = TournamentApiHelper(pm)
        self.helper = helper
        t = pm.get_tourney_by_id(tourney_id)
        if t is None:
            return helper.bail("tourney %d not found" % (tourney_id), 403)

        json_data = None
        try:
            json_data = request.get_json(force=True)
        except Exception:
            return helper.bail("bad json received!", 403)
        if json_data is None:
            return helper.bail("delete call for tourney_id %d missing json payload, giving up " % (tourney_id), 403)

        bail = helper.check_token(json_data, t)
        if bail:
            return bail

        # whew. aaaaalmost there...
        try:
            pm.delete_tourney_by_id(tourney_id)
        except Exception:
            return helper.bail("unable to delete tourney %d, bailing out " % (tourney_id), 403)

            # and log it
        event = Event(remote_address=myapp.remote_address(request),
                      event_date=func.now(),
                      event="API",
                      event_details="tournament API: tourney delete %d" % (tourney_id))
        pm.db_connector.get_session().add(event)
        pm.db_connector.get_session().commit()

        response = jsonify(message="deleted tourney id %d" % (tourney_id))
        response.status_code = 204
        return response
Пример #12
0
    def delete(self, tourney_id):
        pm = PersistenceManager(myapp.db_connector)
        helper = TournamentApiHelper(pm)
        self.helper = helper
        t = pm.get_tourney_by_id(tourney_id)
        if t is None:
            return helper.bail("tourney %d not found" % ( tourney_id ), 403)

        json_data = None
        try:
            json_data = request.get_json(force=True)
        except Exception:
            return helper.bail("bad json received!", 403)
        if json_data is None:
            return helper.bail("delete call for tourney_id %d missing json payload, giving up " % (tourney_id), 403)

        bail = helper.check_token(json_data, t)
        if bail:
            return bail

        # whew. aaaaalmost there...
        try:
            pm.delete_tourney_by_id(tourney_id)
        except Exception:
            return helper.bail("unable to delete tourney %d, bailing out " % ( tourney_id ), 403)

            #and log it
        event = Event(remote_address=myapp.remote_address(request),
                      event_date=func.now(),
                      event="API",
                      event_details="tournament API: tourney delete %d" % ( tourney_id ))
        pm.db_connector.get_session().add(event)
        pm.db_connector.get_session().commit()

        response = jsonify(message="deleted tourney id %d" % ( tourney_id ))
        response.status_code = 204
        return response
Пример #13
0
def add_tourney():

    #TODO: better edge testing against user input
    name                  = decode( request.form['name'] )
    email                 = decode( request.form['email'] )
    type                  = request.form['tourney_type']
    mmddyyyy              = request.form['datepicker'].split('/')
    date                  = datetime.date( int(mmddyyyy[2]),int(mmddyyyy[0]), int(mmddyyyy[1])) #YYYY, MM, DD
    round_length_dropdown = request.form['round_length_dropdown']
    round_length_userdef  = request.form['round_length_userdef']
    tourney_format_def    = request.form['tourney_format_dropdown']
    tourney_format_custom = request.form['tourney_format_custom']
    participant_count     = int(request.form['participant_count'])
    sets_used             = request.form.getlist('sets[]')
    country               = decode(request.form['country'])
    state                 = decode(request.form['state'])
    city                  = decode(request.form['city'])
    venue                 = decode(request.form['venue'])

    round_length = None
    if round_length_dropdown is None or len(round_length_dropdown) == 0:
        round_length = int(round_length_userdef)
    else:
        round_length = int(round_length_dropdown)

    tourney_format = None
    if tourney_format_def is None or len(tourney_format_def) == 0:
        if tourney_format_custom is None or len(tourney_format_custom) == 0:
            tourney_format = xwingmetadata.format_default
        else:
            tourney_format = decode(tourney_format_custom)
    else:
        tourney_format = str(tourney_format_def)

    tourney_report  = request.files['tourney_report']

    mail_message("New tourney creation attempt", "Request to create tourney name %s from user %s of type %s on day %s with %d participants" % \
          ( name, email, type, date, participant_count) )

    if tourney_report:
        filename        = tourney_report.filename
        data            = None
        if tourney_report and allowed_file(filename):
            try:
                data = tourney_report.read()
                data = decode(data)
                cryodex = Cryodex(data, filename)
                t = create_tourney(cryodex, name, date, type, round_length,
                                   sets_used, country, state, city, venue, email, participant_count, tourney_format )
                sfilename = secure_filename(filename) + "." + str(t.id)
                save_cryodex_file( failed=False, filename=sfilename, data=data)

                event = Event(remote_address=myapp.remote_address(request),
                              event_date=func.now(),
                              event="create tourney",
                              event_details="created tourney %s from croydex input" % ( t.tourney_name ))
                pm = PersistenceManager(myapp.db_connector)
                pm.db_connector.get_session().add(event)
                pm.db_connector.get_session().commit()
                mail_message("New cryodex tourney created", "A new tourney named '%s' with id %d was created from file %s!" % ( t.tourney_name, t.id, filename ))
                print "getting tourney details"
                return redirect( url_for('get_tourney_details', tourney_id=t.id))
            except (Exception,UnicodeEncodeError ) as err:
                filename=str(uuid.uuid4()) + ".html"
                save_cryodex_file( failed=True, filename=filename, data=data)
                mail_error(errortext=str(err) + "<br><br>Filename =" + filename )
                return render_template( 'tourney_entry_error.html', errortext=str(err))


    else: #user didnt provide a cryodex file ... have to do it manually
        try:
            pm = PersistenceManager(myapp.db_connector)
            t = Tourney(tourney_name=name, tourney_date=date, tourney_type=type, locked=False,
                        round_length=round_length, email=email, entry_date=datetime.datetime.now(),
                        participant_count=participant_count,format=tourney_format)
            pm.db_connector.get_session().add(t)
            add_sets_and_venue_to_tourney(city, country, pm, sets_used, state, t, venue )
            pm.db_connector.get_session().commit()
            event = Event(remote_address=myapp.remote_address(request),
                          event_date=func.now(),
                          event="create tourney",
                          event_details="created tourney %s from manual input" % ( t.tourney_name ))
            pm = PersistenceManager(myapp.db_connector)
            pm.db_connector.get_session().add(event)
            pm.db_connector.get_session().commit()
            mail_message("New manual tourney created", "A new tourney named '%s' with id %d was created!" % ( t.tourney_name, t.id ))
            return redirect(url_for('get_tourney_details', tourney_id=t.id))
        except Exception as err:
            mail_error(errortext=str(err))
            return render_template( 'tourney_entry_error.html', errortext=str(err))
Пример #14
0
    def put(self, tourney_id):
        pm = PersistenceManager(myapp.db_connector)
        tourney = pm.get_tourney_by_id(tourney_id)
        if tourney is None:
            response = jsonify(message="tourney %d not found" % ( tourney_id ))
            response.status_code = 403
            return response

        # go through and try to update what we can.
        json_data = None
        pm = PersistenceManager(myapp.db_connector)
        helper = TournamentApiHelper(pm)
        self.helper = helper

        try:
            json_data = request.get_json(force=True)
        except Exception:
            return helper.bail("bad json received!", 403)
        if json_data is not None:

            bail = helper.check_token(json_data, tourney)
            if bail:
                bail

            if json_data.has_key(TOURNAMENT):
                t = json_data[TOURNAMENT]
                if t.has_key(NAME):
                    tourney.tourney_name = t[NAME]
                if t.has_key(DATE):
                    tourney_date = t[DATE]
                    parsed_date = None
                    try:
                        parsed_date = dateutil.parser.parse(tourney_date)
                    except Exception:
                        return helper.bail("invalid tourney date %s" % ( parsed_date ), 403)
                    tourney.tourney_date = parsed_date
                if t.has_key(TYPE):
                    tourney_type = t[TYPE]
                    #validate the tourney type
                    if not tourney_type in TournamentApiHelper.tourney_types:
                        return helper.bail("invalid tourney type %s" % ( tourney_type ), 403)
                    tourney.tourney_type = tourney_type

                if t.has_key(ROUND_LENGTH):
                    tourney.round_length = t[ROUND_LENGTH]

                if t.has_key(PARTICIPANT_COUNT):
                    tourney.participant_count = t[PARTICIPANT_COUNT]

                #now try all the other fields.
                helper.extract_email(t, tourney)
                helper.extract_tourney_format(t, tourney)
                helper.extract_venue(t, tourney)
                bail, tlists_by_id, tlists_by_name = helper.extract_players(t,
                                                                            tourney)  #round by round results, if it exists
                if bail:
                    return bail
                bailout = helper.extract_set(t, tourney, pm)
                if bailout:
                    return bailout

                bailout = helper.extract_rounds(t, tourney, tlists_by_id, tlists_by_name, pm)
                if bailout:
                    return bailout

                #and log it
                event = Event(remote_address=myapp.remote_address(request),
                              event_date=func.now(),
                              event="API",
                              event_details="tournament API: tourney update via POST")

                pm.db_connector.get_session().add(event)
                pm.db_connector.get_session().commit()

                response = jsonify(
                    {TOURNAMENT: {NAME: tourney.get_tourney_name(), "id": tourney.id, API_TOKEN: tourney.api_token}})
                response.status_code = 200
                return response

            else:
                return helper.bail(
                    "invalid tourney submission, must contain required fields, missing %s " % ( TOURNAMENTS ), 403)
        else:
            return helper.bail("invalid tourney submission, must contain a json payload", 403)
Пример #15
0
    def post(self):
        json_data = None
        pm = PersistenceManager(myapp.db_connector)

        helper = TournamentApiHelper(pm)
        self.helper = helper

        try:
            json_data = request.get_json(force=True)
        except Exception:
            return helper.bail("bad json received!", 403)
        if json_data is not None:
            if json_data.has_key(TOURNAMENT):
                t = json_data[TOURNAMENT]

                # it should have all the required fields
                missing_field = helper.missing_required_field(t)
                if missing_field is not None:
                    return helper.bail(
                        "invalid tourney submission, must contain required fields, missing %s " % (missing_field),
                        403)

                tourney_name = t[NAME]
                tourney_date = t[DATE]
                tourney_type = t[TYPE]
                round_length = t[ROUND_LENGTH]
                participant_count = t[PARTICIPANT_COUNT]

                # validate the tourney date
                parsed_date = None
                try:
                    parsed_date = dateutil.parser.parse(tourney_date)
                except Exception:
                    return helper.bail("invalid tourney date %s" % (parsed_date), 403)

                # validate the tourney type
                if not tourney_type in TournamentApiHelper.tourney_types:
                    return helper.bail("invalid tourney type %s" % (tourney_type), 403)

                # good to go!
                tourney = Tourney(tourney_name=tourney_name, tourney_date=tourney_date,
                                  tourney_type=tourney_type, round_length=round_length, entry_date=parsed_date,
                                  participant_count=participant_count, locked=False)
                pm.db_connector.get_session().add(tourney)

                helper.extract_email(t, tourney)
                helper.extract_video_url(t,tourney)
                helper.extract_tourney_format(t, tourney)
                helper.extract_venue(t, tourney)
                # now see if the players are there.  if so, add 'em
                bail, tlists_by_id, tlists_by_name = helper.extract_players(t,
                                                                            tourney)  # round by round results, if it exists

                if bail:
                    return bail

                # set gook
                bailout = helper.extract_set(t, tourney, pm)
                if bailout:
                    return bailout

                bailout = helper.extract_rounds(t, tourney, tlists_by_id, tlists_by_name, pm)
                if bailout:
                    return bailout

                # looking good.
                # grab a uuid to finish the job
                tourney.api_token = str(uuid.uuid4())

                # and log it
                event = Event(remote_address=myapp.remote_address(request),
                              event_date=func.now(),
                              event="API",
                              event_details="tournament API: tourney creation via POST")

                pm.db_connector.get_session().add(event)
                pm.db_connector.get_session().commit()

                players = []
                for player in tourney.tourney_players:
                    players.append({NAME: player.get_player_name(), ID: player.id})

                response = jsonify({TOURNAMENT: {NAME: decode(tourney.tourney_name),
                                                 ID: tourney.id,
                                                 API_TOKEN: tourney.api_token,
                                                 PLAYERS: players}})
                response.status_code = 201
                return response

            else:
                return helper.bail(
                    "invalid tourney submission, must contain required fields, missing %s " % (TOURNAMENTS), 403)
        else:
            return helper.bail("invalid tourney submission, must contain a json payload", 403)
Пример #16
0
    def put(self, tourney_id):
        pm = PersistenceManager(myapp.db_connector)
        tourney = pm.get_tourney_by_id(tourney_id)
        if tourney is None:
            response = jsonify(message="tourney %d not found" % (tourney_id))
            response.status_code = 403
            return response

        # go through and try to update what we can.
        json_data = None
        pm = PersistenceManager(myapp.db_connector)
        helper = TournamentApiHelper(pm)
        self.helper = helper

        try:
            json_data = request.get_json(force=True)
        except Exception:
            return helper.bail("bad json received!", 403)
        if json_data is not None:

            bail = helper.check_token(json_data, tourney)
            if bail:
                bail

            if json_data.has_key(TOURNAMENT):
                t = json_data[TOURNAMENT]
                if t.has_key(NAME):
                    tourney.tourney_name = t[NAME]
                if t.has_key(DATE):
                    tourney_date = t[DATE]
                    parsed_date = None
                    try:
                        parsed_date = dateutil.parser.parse(tourney_date)
                    except Exception:
                        return helper.bail("invalid tourney date %s" % (parsed_date), 403)
                    tourney.tourney_date = parsed_date
                if t.has_key(TYPE):
                    tourney_type = t[TYPE]
                    # validate the tourney type
                    if not tourney_type in TournamentApiHelper.tourney_types:
                        return helper.bail("invalid tourney type %s" % (tourney_type), 403)
                    tourney.tourney_type = tourney_type

                if t.has_key(ROUND_LENGTH):
                    tourney.round_length = t[ROUND_LENGTH]

                if t.has_key(PARTICIPANT_COUNT):
                    tourney.participant_count = t[PARTICIPANT_COUNT]

                # now try all the other fields.
                helper.extract_email(t, tourney)
                helper.extract_video_url(t,tourney)
                helper.extract_tourney_format(t, tourney)
                helper.extract_venue(t, tourney)
                bail, tlists_by_id, tlists_by_name = helper.extract_players(t,
                                                                            tourney)  # round by round results, if it exists
                if bail:
                    return bail
                bailout = helper.extract_set(t, tourney, pm)
                if bailout:
                    return bailout

                bailout = helper.extract_rounds(t, tourney, tlists_by_id, tlists_by_name, pm)
                if bailout:
                    return bailout

                # and log it
                event = Event(remote_address=myapp.remote_address(request),
                              event_date=func.now(),
                              event="API",
                              event_details="tournament API: tourney update via POST")

                pm.db_connector.get_session().add(event)
                pm.db_connector.get_session().commit()

                response = jsonify(
                    {TOURNAMENT: {NAME: tourney.get_tourney_name(), "id": tourney.id, API_TOKEN: tourney.api_token}})
                response.status_code = 200
                return response

            else:
                return helper.bail(
                    "invalid tourney submission, must contain required fields, missing %s " % (TOURNAMENTS), 403)
        else:
            return helper.bail("invalid tourney submission, must contain a json payload", 403)
Пример #17
0
    def post(self):
        json_data = None
        pm = PersistenceManager(myapp.db_connector)

        helper = TournamentApiHelper(pm)
        self.helper = helper

        try:
            json_data = request.get_json(force=True)
        except Exception:
            return helper.bail("bad json received!", 403)
        if json_data is not None:
            if json_data.has_key(TOURNAMENT):
                t = json_data[TOURNAMENT]

                # it should have all the required fields
                missing_field = helper.missing_required_field(t)
                if missing_field is not None:
                    return helper.bail(
                        "invalid tourney submission, must contain required fields, missing %s " % ( missing_field ),
                        403)

                tourney_name = t[NAME]
                tourney_date = t[DATE]
                tourney_type = t[TYPE]
                round_length = t[ROUND_LENGTH]
                participant_count = t[PARTICIPANT_COUNT]

                # validate the tourney date
                parsed_date = None
                try:
                    parsed_date = dateutil.parser.parse(tourney_date)
                except Exception:
                    return helper.bail("invalid tourney date %s" % ( parsed_date ), 403)

                #validate the tourney type
                if not tourney_type in TournamentApiHelper.tourney_types:
                    return helper.bail("invalid tourney type %s" % ( tourney_type ), 403)

                #good to go!
                tourney = Tourney(tourney_name=tourney_name, tourney_date=tourney_date,
                                  tourney_type=tourney_type, round_length=round_length, entry_date=parsed_date,
                                  participant_count=participant_count, locked=False)
                pm.db_connector.get_session().add(tourney)

                helper.extract_email(t, tourney)
                helper.extract_tourney_format(t, tourney)
                helper.extract_venue(t, tourney)
                #now see if the players are there.  if so, add 'em
                bail, tlists_by_id, tlists_by_name = helper.extract_players(t,
                                                                            tourney)  #round by round results, if it exists

                if bail:
                    return bail

                #set gook
                bailout = helper.extract_set(t, tourney, pm)
                if bailout:
                    return bailout

                bailout = helper.extract_rounds(t, tourney, tlists_by_id, tlists_by_name, pm)
                if bailout:
                    return bailout

                #looking good.
                #grab a uuid to finish the job
                tourney.api_token = str(uuid.uuid4())

                #and log it
                event = Event(remote_address=myapp.remote_address(request),
                              event_date=func.now(),
                              event="API",
                              event_details="tournament API: tourney creation via POST")

                pm.db_connector.get_session().add(event)
                pm.db_connector.get_session().commit()

                players = []
                for player in tourney.tourney_players:
                    players.append({NAME: player.get_player_name(), ID: player.id})

                response = jsonify({TOURNAMENT: {NAME: decode(tourney.tourney_name),
                                                 ID: tourney.id,
                                                 API_TOKEN: tourney.api_token,
                                                 PLAYERS: players}})
                response.status_code = 201
                return response

            else:
                return helper.bail(
                    "invalid tourney submission, must contain required fields, missing %s " % ( TOURNAMENTS ), 403)
        else:
            return helper.bail("invalid tourney submission, must contain a json payload", 403)