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
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') )
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) )
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")
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")
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 ) )
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)
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))
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
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)
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
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
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))
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)
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)
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)
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)