示例#1
0
 def __init__(self):
     self.actions = [
         Actions.up, Actions.down, Actions.right, Actions.left,
         Actions.stick
     ]
     self.initial_state = Soccer_Field(
         Athlete(coordinates=(2, 0), has_possession=False, ID=1),
         Athlete(coordinates=(1, 0), has_possession=True, ID=2))
     self.Nash = defaultdict(lambda: 1)
示例#2
0
    def field_state_a2_first(self, athlete1_action, athlete2_action):

        a1_new_position = self.get_new_coordinates(self.athlete1,
                                                   athlete1_action)
        a2_new_position = self.get_new_coordinates(self.athlete2,
                                                   athlete2_action)

        if a1_new_position == a2_new_position:
            both_new_actions_are_the_same = True
        else:
            both_new_actions_are_the_same = False

        # What the field would look like if athlete 2 moved first
        if a2_new_position != self.athlete1.coordinates:
            if self.athlete2.has_possession:
                a2_state_if_a2_first = Athlete(coordinates=a2_new_position,
                                               has_possession=True,
                                               ID=2)
                if both_new_actions_are_the_same:
                    a1_state_if_a2_first = Athlete(
                        coordinates=self.athlete1.coordinates,
                        has_possession=False,
                        ID=1)
                else:
                    a1_state_if_a2_first = Athlete(coordinates=a1_new_position,
                                                   has_possession=False,
                                                   ID=1)
            else:
                if both_new_actions_are_the_same:
                    a2_state_if_a2_first = Athlete(coordinates=a2_new_position,
                                                   has_possession=True,
                                                   ID=2)
                    a1_state_if_a2_first = Athlete(
                        coordinates=self.athlete1.coordinates,
                        has_possession=False,
                        ID=1)
                else:
                    a2_state_if_a2_first = Athlete(coordinates=a2_new_position,
                                                   has_possession=False,
                                                   ID=2)
                    a1_state_if_a2_first = Athlete(coordinates=a1_new_position,
                                                   has_possession=True,
                                                   ID=1)
        else:  #if a2 moves to a1's coordinates..
            a2_state_if_a2_first = Athlete(
                coordinates=self.athlete2.coordinates,
                has_possession=False,
                ID=2)
            a1_state_if_a2_first = Athlete(
                coordinates=self.athlete1.coordinates,
                has_possession=True,
                ID=1)

        new_soccer_field = Soccer_Field(a1_state_if_a2_first,
                                        a2_state_if_a2_first)
        return new_soccer_field
示例#3
0
    def parse_athlete(self, athlete_id, response):
        soup = bs4.BeautifulSoup(response.text)
        trs = soup.select('tr')
        dl = soup.select('.profile-details dl')
        athlete = Athlete(athlete_id)

        for tr in trs:
            contents = tr.contents
            if len(tr.contents) < 2:
                continue

            exercise = contents[0].getText()
            value = contents[1].getText()

            athlete.set_stat(exercise, value)

        counter = 0
        for content in dl[0].contents:
            counter += 1
            if counter % 2 == 0:
                value = content.getText()
                athlete.set_personal(label, value)
            else:
                label = content.getText()[:-1]

        return athlete
示例#4
0
def add_athlete(athlete_id, division):
    if Division(division).add_athlete(athlete_id):
        athlete = Athlete(athlete_id)

        return json.dumps(athlete.get())
    else:
        return 'Incorrect gender for Division'
示例#5
0
    def parse_open(self, response):
        soup = bs4.BeautifulSoup(response.text)
        tds = soup.select('tr > td')
        data = []

        for td in tds:
            str_td = str(td)
            athlete_match = re.search(self.ATHLETE_ID_REGEX, str_td)
            rank_and_score = re.search(self.RANK_AND_SCORE_REGEX, str_td)
            event_id = re.search(self.EVENT_ID_REGEX, str_td)

            if athlete_match:
                athlete_id = athlete_match.group("athlete_id")
                athlete = Athlete(athlete_id)
            elif self.has_rank_score_and_event(rank_and_score, event_id):
                event_id = event_id.group("event_id")
                rank = rank_and_score.group("rank")
                score = rank_and_score.group("score")
                athlete.set_event(event_id, rank, score)
                if self.verbose:
                    print("Getting event " + event_id + " for " + athlete_id +
                          "\n")

            if event_id == "5":
                data.append(athlete)

        return data
示例#6
0
    def add_athlete(self, athlete_id):
        athlete = Athlete(athlete_id).get()

        # if 'sex' not in athlete and (athlete['sex'] == self.division_object['sex'] or athlete['sex'] == 'None'):
        Division.remove_athlete_from_all_divisions(athlete_id)
        redisclient.sadd('%s_members' % self.division_id, athlete_id)

        return True
示例#7
0
def get_coach_data(filename):
    try:
        with open(filename) as f:
            data = f.readline()
            templ = data.strip().split(',')
        return (Athlete(templ.pop(0), templ.pop(0), templ))
    except IOError as ierr:
        print('file error:' + str(ioerr))
        return None
示例#8
0
def get_coach_data(filename):
    try:
        with open(filename) as player_score:
            data = player_score.readline().strip().split(',')
            result = Athlete(data.pop(0), data.pop(0), data)
            return (result)
    except IOError as err:
        print('IOErroe: ' + str(err))
        return (None)
示例#9
0
    def __init__(self, filename=None, data_path=None):
        # Based in Django's approach -> http://code.djangoproject.com/svn/django/trunk/django/__init__.py
        self.version = __import__('pytrainer').get_version()
        #Process command line options
        self.startup_options = self.get_options()
        #Setup logging
        self.environment = Environment(platform.get_platform(),
                                       self.startup_options.conf_dir)
        self.environment.create_directories()
        self.set_logging(self.startup_options.log_level,
                         self.startup_options.log_type)
        logging.debug('>>')
        logging.debug("pytrainer version %s" % (self.version))
        self.data_path = data_path
        self.date = Date()
        self.ddbb = None
        # Checking profile
        logging.debug('Checking configuration and profile...')
        self.profile = Profile(self.environment, self.data_path, self)
        self.uc = UC()
        self.windowmain = None
        self.ddbb = DDBB(self.profile, self)
        logging.debug('connecting to DDBB')
        self.ddbb.connect()

        initialize_data(self.ddbb, self.environment.conf_dir)

        self._sport_service = SportService(self.ddbb)
        self.record = Record(self._sport_service, data_path, self)
        self.athlete = Athlete(data_path, self)
        self.stats = Stats(self._sport_service, self)
        pool_size = self.profile.getIntValue("pytraining",
                                             "activitypool_size",
                                             default=1)
        self.activitypool = ActivityPool(self, size=pool_size)
        #preparamos la ventana principal
        self.windowmain = Main(self._sport_service,
                               data_path,
                               self,
                               self.version,
                               gpxDir=self.profile.gpxdir)
        self.date = Date(self.windowmain.calendar)
        self.waypoint = Waypoint(data_path, self)
        self.extension = Extension(data_path, self)
        self.plugins = Plugins(data_path, self)
        self.importdata = Importdata(self._sport_service, data_path, self,
                                     self.profile)
        self.loadPlugins()
        self.loadExtensions()
        self.windowmain.setup()
        self.windowmain.on_calendar_selected(None)
        self.refreshMainSportList()
        self.windowmain.run()
        logging.debug('<<')
示例#10
0
def get_coach_data(filename):
    """
    将指定文件去除不需要的空白符并返回列表。
    参数"filename“,将要转换为列表的文件路径。
    """
    try:
        with open(filename) as fl:
            data = fl.readline().strip().split(',')

        return Athlete(data.pop(0), data.pop(0), data)
    except IOError as err:
        print('File Error\n\t' + str(err))
        return None
示例#11
0
    def test_Athlete_whenCalledWithAthleteIdInRedis_returnsAthleteRecordFromRedis(
            self):
        with mock.patch('webrequest.getjsonfromurl') as mock_geturl:
            self.setupTestData()
            mock_geturl.return_value = self.test_data['members'][1338208]

            athlete = Athlete('1338208').get()

            mock_geturl.assert_not_called()

            self.assertEqual(athlete['firstname'], 'Brett')
            self.assertEqual(athlete['lastname'], 'J ARCC')
            self.assertEqual(athlete['sex'], 'M')
示例#12
0
    def get_all(get_athletes=False):
        divisions = {}
        division_list = Division.get_list()

        for division_id in division_list:
            division = Division(division_id).get()

            if get_athletes:
                for member in division['members']:
                    division['members'][member] = Athlete(member).get()

            divisions[division_id] = division

        return divisions
示例#13
0
def token_exchange():
    code = request.args.get('code')

    client_id = redisclient.hget('api', 'client_id')
    client_secret = redisclient.hget('api', 'client_token')

    exch_uri = 'https://www.strava.com/oauth/token'
    data = urlencode({
        'client_id': client_id,
        'client_secret': client_secret,
        'code': code
    }).encode()

    with closing(urlopen(exch_uri, data)) as response:
        user_profile = json.loads(response.read().decode())

        athlete = Athlete(user_profile['athlete']['id']).get()

        return render_template('connected.html', athlete=athlete)
示例#14
0
    def __init__(self, filename=None, data_path=None):
        # Based on Django's approach -> http://code.djangoproject.com/svn/django/trunk/django/__init__.py
        self.version = __import__('pytrainer').get_version()
        #Process command line options
        self.startup_options = self.get_options()
        #Setup logging
        self.environment = Environment(self.startup_options.conf_dir,
                                       data_path)
        self.environment.create_directories()
        self.environment.clear_temp_dir()
        self.set_logging(self.startup_options.log_level,
                         self.startup_options.log_type)
        logging.debug('>>')
        logging.info("pytrainer version %s" % (self.version))
        self.data_path = data_path

        # Checking profile
        logging.debug('Checking configuration and profile...')
        self.profile = Profile()
        # Write the default config to disk
        self.profile.saveProfile()
        self.uc = UC()
        self.profilewindow = None
        self.ddbb = DDBB(self.profile.sqlalchemy_url)
        logging.debug('connecting to DDBB')
        self.ddbb.connect()

        logging.info('Checking if some upgrade action is needed...')
        initialize_data(self.ddbb, self.environment.conf_dir)

        # Loading shared services
        logging.debug('Loading sport service...')
        self._sport_service = SportService(self.ddbb)
        logging.debug('Loading record service...')
        self.record = Record(self._sport_service, data_path, self)
        logging.debug('Loading athlete service...')
        self.athlete = Athlete(data_path, self)
        logging.debug('Loading stats service...')
        self.stats = Stats(self)
        logging.debug('Initializing activity pool...')
        pool_size = self.profile.getIntValue("pytraining",
                                             "activitypool_size",
                                             default=1)
        self.activitypool = ActivityService(self, size=pool_size)

        #Loading main window
        self.windowmain = None
        logging.debug('Loading main window...')
        self.windowmain = Main(self._sport_service,
                               data_path,
                               self,
                               self.version,
                               gpxDir=self.profile.gpxdir)

        # Select initial date depending on user's preference
        self.selectInitialDate()

        logging.debug('Loading waypoint service...')
        self.waypoint = WaypointService(data_path, self)
        logging.debug('Loading extension service...')
        self.extension = Extension(data_path, self)
        logging.debug('Loading plugins service...')
        self.plugins = Plugins(data_path, self)
        self.importdata = Importdata(self._sport_service, data_path, self,
                                     self.profile)
        logging.debug('Loading plugins...')
        self.loadPlugins()
        logging.debug('Loading extensions...')
        self.loadExtensions()
        logging.debug('Setting values for graphs, maps and waypoint editor...')
        self.windowmain.setup()
        self.windowmain.on_calendar_selected(None)
        logging.debug('Refreshing sport list... is this needed?')
        self.refreshMainSportList()
        logging.debug('Launching main window...')
        self.windowmain.run()
        logging.debug('<<')
示例#15
0
    try:
        with open(filename) as fl:
            data = fl.readline().strip().split(',')

        return Athlete(data.pop(0), data.pop(0), data)
    except IOError as err:
        print('File Error\n\t' + str(err))
        return None


james = get_coach_data('.//chapter6//james2.txt')
julie = get_coach_data('.//chapter6//julie2.txt')
mikey = get_coach_data('.//chapter6//mikey2.txt')
sarah = get_coach_data('.//chapter6//sarah2.txt')
print(james.name + "'s fastest times are: " + str(james.top3()))
print(julie.name + "'s fastest times are: " + str(julie.top3()))
print(mikey.name + "'s fastest times are: " + str(mikey.top3()))
print(sarah.name + "'s fastest times are: " + str(sarah.top3()))
# print(james.times)
# james.add_time('0:3')
# print(james.name + "'s fastest times are: " + str(james.top3()))
# print(james.times)
# james.add_times(['3.2', '1:2', '0-1'])
# print(james.name + "'s fastest times are: " + str(james.top3()))
# print(james.times)
vera = Athlete('Vera Vi')
vera.append('1.31')
print(vera.top3())
vera.extend(['2.22', '1-21', '2:22'])
print(vera.top3())
示例#16
0
    def compile_league(self, league_name, effort_list):
        members = redisclient.smembers(league_name + '_members')
        times = []
        efforts = {}

        # Compile dict of best efforts for each athlete in this league
        for effort in effort_list:
            athlete_id = effort['athlete']['id']

            if str(athlete_id) in members:
                if athlete_id in efforts:
                    if effort['elapsed_time'] >= efforts[athlete_id][
                            'elapsed_time']:
                        continue

                efforts[athlete_id] = effort

        # Enrich with athlete details, and collect list of times for ranking
        for athlete_id, effort in efforts.items():
            athlete = Athlete(athlete_id).get()

            for k, v in athlete.items():
                effort['athlete'][k] = v

            corrected_time = effort['elapsed_time']

            neutralised_times = []
            for key, value in effort['neutralised'].items():
                corrected_time = corrected_time - value
                neutralised_times.append(str(value))

            effort['neutralised_times_formatted'] = ', '.join(
                neutralised_times)

            minutes = int(effort['elapsed_time'] / 60)
            seconds = effort['elapsed_time'] % 60
            effort['elapsed_time_formatted'] = "%d.%02d" % (minutes, seconds)

            minutes = corrected_time / 60
            seconds = corrected_time % 60
            effort['corrected_time'] = corrected_time
            effort['corrected_time_formatted'] = "%d.%02d" % (minutes, seconds)

            start_time_formatted = datetime.strptime(
                effort['start_date_local'], "%Y-%m-%dT%H:%M:%SZ")
            effort['start_time_formatted'] = start_time_formatted.strftime(
                '%a %d/%m, %H:%M')

            times.append(corrected_time)

        times = list(set(times))
        times.sort()
        rank = 1

        # Assign a rank to each effort
        for time in times:
            joint = 0

            for athlete_id, effort in efforts.items():
                if effort['corrected_time'] == time:
                    effort['rank'] = rank
                    effort['points'] = max(11 - rank, 0)
                    joint = joint + 1

            rank = rank + max(joint, 1)

        # s = OrderedDict(sorted(efforts.items(), key=lambda t: t[1]['rank']))

        return efforts
示例#17
0
def createAthlete(data):
    athleteJson = json.loads(data)
    return Athlete(athleteJson.get('id'), athleteJson.get('firstName'),
                   athleteJson.get('secondName'), athleteJson.get('age'),
                   athleteJson.get('disc'), athleteJson.get('club'),
                   athleteJson.get('nationality'))
示例#18
0
    def field_state_a1_first(self, athlete1_action, athlete2_action):

        # update the soccer field if athlete 1 goes first
        a1_new_position = self.get_new_coordinates(self.athlete1,
                                                   athlete1_action)
        a2_new_position = self.get_new_coordinates(self.athlete2,
                                                   athlete2_action)

        if a1_new_position == a2_new_position:
            both_new_actions_are_the_same = True
        else:
            both_new_actions_are_the_same = False

        # What the field would look like if athlete 1 moved first
        '''if the player without the ball moves into the player with the ball, attempting to steal 
        the ball, he cannot.'''
        if a1_new_position != self.athlete2.coordinates:  #if a1's new move is NOT where a2 is...
            if self.athlete1.has_possession:  #AND a1 has possession...
                a1_state_if_a1_first = Athlete(
                    coordinates=a1_new_position, has_possession=True,
                    ID=1)  #then a1 can move anywhere
                if both_new_actions_are_the_same:
                    a2_state_if_a1_first = Athlete(
                        coordinates=self.athlete2.coordinates,
                        has_possession=False,
                        ID=2
                    )  #a2 cannot move where a1 is because no possession
                else:
                    a2_state_if_a1_first = Athlete(
                        coordinates=a2_new_position,
                        has_possession=False,
                        ID=2
                    )  #a2 can go anywhere as long as it's not where a1 is

            else:  #if a1 doesn't have the ball
                if both_new_actions_are_the_same:  #and both actions are the same...
                    a1_state_if_a1_first = Athlete(coordinates=a1_new_position,
                                                   has_possession=True,
                                                   ID=1)  #a1 gets the ball
                    a2_state_if_a1_first = Athlete(
                        coordinates=self.athlete2.coordinates,
                        has_possession=False,
                        ID=2)  #a2 loses the ball
                else:
                    a1_state_if_a1_first = Athlete(coordinates=a1_new_position,
                                                   has_possession=False,
                                                   ID=1)
                    a2_state_if_a1_first = Athlete(coordinates=a2_new_position,
                                                   has_possession=True,
                                                   ID=2)
        #If the player with the ball moves into the player without it, the former loses the ball to the latter
        else:
            a1_state_if_a1_first = Athlete(
                coordinates=self.athlete1.coordinates,
                has_possession=False,
                ID=1)
            a2_state_if_a1_first = Athlete(
                coordinates=self.athlete2.coordinates,
                has_possession=True,
                ID=2)

        new_soccer_field = Soccer_Field(a1_state_if_a1_first,
                                        a2_state_if_a1_first)
        return new_soccer_field