Example #1
0
    def create_field(self):
        owgr = populateField.get_worldrank()
        d = {}
        for g in Golfer.objects.all().exclude(golfer_pga_num=''):
            golfer_owgr = utils.fix_name(g.golfer_name, owgr)
            if int(golfer_owgr[1][0]) < 201:
                #d[g.golfer_name] = golfer_owgr[1]
                season = FedExSeason.objects.get(season__current=True)
                print(g, golfer_owgr[1][0])

                field, created = FedExField.objects.get_or_create(
                    season=season, golfer=g)
                field.soy_owgr = golfer_owgr[1][0]
                prior = utils.fix_name(g.golfer_name, season.prior_season_data)
                print('PRIOR ', prior, type(prior))
                if type(prior[1]) == dict and prior[1].get('rank'):
                    field.prior_season_data = prior[1]
                else:
                    field.prior_season_data = {}

                d[g.golfer_name] = {
                    'soy_owgr': golfer_owgr[1][0],
                    'prior_season': field.prior_season_data
                }
                field.save()
            #print (d)
        return d
Example #2
0
def get_espn_num(player, espn_data):
    if espn_data.get(player):
        print('returning found: ', player, espn_data.get(player))
        return player, espn_data.get(player)
        #print ('found player: ', player)
    else:
        print('not found, fixing: ', player)
        fixed_data = utils.fix_name(player, espn_data)
        print('returning fixed: ', fixed_data)
        if fixed_data[0] == None:
            return (player, {})
        else:
            return player, fixed_data[1]

    return
Example #3
0
def get_espn_num(player, espn_data):
    if espn_data.get(player):
        print ('returning found: ', player, espn_data.get(player))
        #return player, espn_data.get(player)
        return espn_data.get(player).get('pga_num')
    else:
        print ('not found, fixing: ', player)
        fixed_data = utils.fix_name(player, espn_data)
        print ('returning fixed: ',  fixed_data)
        if fixed_data[0] == None:
            #return (player, {})
            return None
        else:
            #return player, fixed_data[1]
            return fixed_data[1].get('pga_num')
        
    return
Example #4
0
def create_groups(tournament_number):
    '''takes in a tournament number for pgatour.com to get json files for the field and score.  initializes all tables for the tournament'''
    print('executing PopulateMPField')
    season = Season.objects.get(current=True)

    if Tournament.objects.filter(season=season).count() > 0:
        try:
            last_tournament = Tournament.objects.get(current=True,
                                                     complete=True,
                                                     season=season)
            last_tournament.current = False
            last_tournament.save()
            key = {}
            key['pk'] = last_tournament.pk
            #try:
            #    calc_score.calc_score(key)
            #except:
            #    print ('error calc scores for last tournament', last_tournament)

        except ObjectDoesNotExist:
            print('no current tournament')
    else:
        print('setting up first tournament of season')

    print('going to get_field')
    field = populateField.get_field(tournament_number)
    OWGR_rankings = populateField.get_worldrank()
    #OWGR_rankings = {}

    print('a')
    configure_groups(field)
    print('c')
    tournament = Tournament.objects.get(current=True, season=season)
    print('d')

    bracket = scrape_scores_picks.ScrapeScores(
        tournament,
        'https://www.pgatour.com/competition/' + str(season.season) +
        '/wgc-dell-technologies-match-play/group-stage.html').mp_brackets()
    #prior_year_sd(tournament)

    #print (len(field))

    group_dict = {}
    name_switch = False
    name_issues = []
    for player in field:
        #print (player)
        if Name.objects.filter(PGA_name=player).exists():
            name_switch = True
            name = Name.objects.get(PGA_name=player)
            player = name.OWGR_name
            print('owgr player', player)
            print('pga player', name)

        # fix this to get 0 index of ranking list
        try:
            #rank = OWGR_rankings[player.capitalize()][0]
            #rank = OWGR_rankings[player.capitalize()]
            rank = OWGR_rankings[player]
        except Exception:
            try:
                lookup = utils.fix_name(player, OWGR_rankings)
                print('not in owgr', player, lookup)
                name_issues.append((player, lookup))
                rank = lookup[1]
                #rank = PGA_rankings[player]
            except Exception as e:
                print('no rank found', player, e)
                rank = [9999, 9999, 9999]

        if name_switch:
            print('name switch', player, name)
            player = name.PGA_name
            name_switch = False

        group_dict[player] = [rank, field.get(player)]

    player_cnt = 1
    group_num = 1

    groups = Group.objects.get(tournament=tournament, number=group_num)
    print('name issues: ', name_issues)
    #print ('group_dict before field save', group_dict)

    #create dict of player links for picture lookup
    #import urllib

    json_url = 'https://www.pgatour.com/players.html'
    html = urllib.request.urlopen("https://www.pgatour.com/players.html")
    soup = BeautifulSoup(html, 'html.parser')

    #players =  (soup.find("div", {'class': 'directory-item'}).find_all('option'))
    players = soup.find("div", {'class': 'overview'})
    golfer_dict = {}
    #print (players)
    #print (players.find_all('a', {'class': 'directory-item'}))
    for p in players.find_all('span', {'class': 'player-flag'}):
        #print ('players', p)
        link = ''
        p_text = str(p)[47:]
        for char in p_text:
            if char == '"':
                break
            else:
                link = link + char
            golfer_dict[link[:5]] = link
    espn_players = get_espn_players()
    print('xxxxxxx', espn_players)
    #for k, v in sorted(group_dict.items(), key=lambda x: x[1][0]):
    #print ('key/val: ', k, v)
    #map_link = get_flag(k, v, espn_players)
    #print (k, map_link)
    #print (k)
    for golfer, group in bracket.items():
        #print (golfer.split(' ')[1], len(golfer.split(' ')[1]),  k.split(' ')[1].rstrip(), len(k.split(' ')[1].rstrip()))
        #print (golfer, group, group_dict.get(golfer))
        #map_link = get_flag(golfer, group_dict.get(golfer), espn_players)
        #if golfer.split(' ')[1] == k.split(' ')[1].rstrip():
        #    print ('MAtch', golfer.split(' ')[1], len(golfer.split(' ')[1]),  k.split(' ')[1].rstrip(), len(k.split(' ')[1].rstrip()))
        g = group.split(' ')[1]
        #       break

        #print ('group: ', k, group)
        print('1 ', golfer)
        golfer_n = golfer.split('(')[0].rstrip()

        ranks = utils.fix_name(golfer_n, OWGR_rankings)
        print('2', golfer, golfer_n, ranks)

        golfer_obj, created = Golfer.objects.get_or_create(
            golfer_name=golfer_n)
        flag = get_flag(golfer_n, golfer_n, espn_players)
        pic = get_pick_link(golfer_obj.golfer_pga_num)
        g_obj = Group.objects.get(tournament=tournament, number=g)
        Field.objects.get_or_create(tournament=tournament, playerName=golfer_n, \
             currentWGR=ranks[1][0], sow_WGR=ranks[1][1], soy_WGR=ranks[1][2], \
             group=g_obj, alternate=None, \
             playerID=None, pic_link= pic, \
             map_link= flag, golfer=golfer_obj, handi=0)

    #print ('checking issue field count', Field.objects.filter(tournament=tournament).count(), 'field len: ', len(field), group_num )
    #if Field.objects.filter(tournament=tournament).count() < len(field):
    #groups = Group.objects.get(tournament=tournament,number=group_num)

    print('saved field objects')
Example #5
0
def get_field(t, owgr_rankings):
    '''takes a tournament object, goes to web to get field and returns a dict'''
        
    field_dict = {}
    if t.pga_tournament_num == '470':
        print ('match play')
        mp_dict = scrape_scores_picks.ScrapeScores(t, 'https://www.pgatour.com/competition/' + str(t.season.season) + '/wgc-dell-technologies-match-play/group-stage.html').mp_brackets()
        for player, data in mp_dict.items():
            ranks = utils.fix_name(player, owgr_rankings)
            field_dict[player] = {'pga_num': data.get('pga_num'),
                                  'curr_owgr': ranks[1][0],
                                  'soy_owgr': ranks[1][2],
                                  'sow_owgr': ranks[1][1]
                                }
        print ('mp field dict: ', field_dict)
    elif t.pga_tournament_num == '999': #Olympics
        # update this to use the class from olympics_sd.py
        mens_field = scrape_espn.ScrapeESPN(tournament=t, url='https://www.espn.com/golf/leaderboard?tournamentId=401285309', setup=True).get_data()    
        womens_field = scrape_espn.ScrapeESPN(tournament=t, url="https://www.espn.com/golf/leaderboard/_/tour/womens-olympics-golf", setup=True).get_data()
        
        for man, data in mens_field.items():
            if man != 'info':
                ranks = utils.fix_name(man, owgr_rankings)
                field_dict[man] = {'espn_num': data.get('pga_num'),
                                    'sex': 'dude',
                                  'curr_owgr': ranks[1][0],
                                  'soy_owgr': ranks[1][2],
                                  'sow_owgr': ranks[1][1], 
                                  'flag': data.get('flag')
                                }
        womens_ranks = get_womans_rankings()

        for woman, stats in womens_field.items():
            
            if woman != 'info':
                rank = utils.fix_name(woman, womens_ranks)
                field_dict[woman] ={'espn_num': stats.get('pga_num'),
                                    'sex': 'chick',
                                    'curr_owgr': int(rank[1].get('rank')) + 1000,
                                    'flag': stats.get('flag')}
        #field_dict['info'] = mens_field.get('info')
    #elif t.pga_tournament_num == 'RYDCUP':
    else:
        try:
            headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Mobile Safari/537.36'}
            json_url = 'https://statdata-api-prod.pgatour.com/api/clientfile/Field?T_CODE=r&T_NUM=' + str(t.pga_tournament_num) +  '&YEAR=' + str(t.season.season) + '&format=json'
            print (json_url)

            req = Request(json_url, headers=headers)
            data = json.loads(urlopen(req).read())
            print ('data', len(data))
            for player in data["Tournament"]["Players"][0:]:
                if player["isAlternate"] == "Yes":
                        #exclude alternates from the field
                        continue

                name = (' '.join(reversed(player["PlayerName"].rsplit(', ', 1))))
                playerID = player['TournamentPlayerId']
                if player.get('TeamID'):
                    team = player.get('TeamID')
                elif player.get('cupTeam'):
                    team = player.get('cupTeam')
                else:
                    team = None

                ranks = utils.fix_name(name, owgr_rankings)
                field_dict[name] = {'pga_num': playerID,
                                    'team': team,
                                    'curr_owgr': ranks[1][0],
                                    'soy_owgr': ranks[1][2],
                                    'sow_owgr': ranks[1][1]}
        except Exception as e:
            print ('pga scrape failed: ', e)   #to use this need to update to key everything from espn_num
            data = espn_api.ESPNData(t=t, force_refresh=True, setup=True).field()

            for golfer in data:
                name = golfer.get('athlete').get('displayName')
                ranks = utils.fix_name(name, owgr_rankings)
                #need this for now, fix rest of code to use ESPN
                try:
                    g_obj = Golfer.objects.get(espn_number=golfer.get('athlete').get('id'))
                    print ('build field found golfer', g_obj)
                except Exception as f:
                    print ('build field cant find: ', name, ' trying setup')
                    pga_num = find_pga_num(name)
                    
                    if not pga_num:
                        g_obj = get_golfer(player=name, pga_num=None, espn_num=golfer.get('athlete').get('id'))
                    elif len(pga_num) == 1:
                        g_obj = get_golfer(player=name, pga_num=pga_num[0], espn_num=golfer.get('athlete').get('id') )
                    else:
                        g_obj = get_golfer(player=name, pga_num=None, espn_num=golfer.get('athlete').get('id'))

                ranks = utils.fix_name(name, owgr_rankings)
                field_dict[name] = {'pga_num': g_obj.golfer_pga_num, 
                                    'team': None,
                                    'curr_owgr': ranks[1][0],
                                    'soy_owgr': ranks[1][2],
                                    'sow_owgr': ranks[1][1]}


    print (field_dict)
    return field_dict
Example #6
0
def test():

    i = 1
    while i < 9:
        group = Group()
        group.tournament = tourny
        group.number = i
        group.playerCnt = 10
        group.save()
        i += 1

    field_dict = {}
    s_field_dict = {}
    #owgr_ranks = populateField.get_worldrank()
    for player in data['Tournament']['Players']:
        if player['isAlternate'] == "Yes":
            continue
        team = player['TeamID']

        name = (' '.join(reversed(player["PlayerName"].split(', '))).replace(
            ' Jr.', '').replace('(am)', ''))
        pga_num = player["TournamentPlayerId"]
        lookup_name = name
        if field_dict.get(team) == None:
            field_dict[team] = {
                'name1': name,
                'pga_num1': pga_num,
                'ranks1': utils.fix_name(name, owgr_ranks)[1]
            }
        else:
            field_dict[team].update({
                'name2':
                name,
                'pga_num2':
                pga_num,
                'ranks2':
                utils.fix_name(name, owgr_ranks)[1]
            })

    print(field_dict)
    s_dict = {
        k: v
        for k, v in sorted(
            field_dict.items(),
            key=lambda x: x[1].get('ranks1')[0] + x[1].get('ranks2')[0])
    }

    group_size = 10
    group = 1
    count = 0

    #print ('S DICT')
    print(s_dict)

    #for k, v in sorted(s_field_dict.items(), key=lambda x: x[1][2]):
    for k, v in s_dict.items():
        print(k, v)
        g1, c1 = Golfer.objects.get_or_create(golfer_pga_num=v.get('pga_num1'))
        g1.pic_link = populateField.get_pick_link(v.get('pga_num1'))
        if c1:
            g1.golfer_name = v.get('name1')
            if v.get('name1')[1] == '.' and v.get('name1')[3] == '.':
                name = str(
                    v.get('pga_num1') + '.' + v.get('name1')[0].lower() + '-' +
                    v.get('name1')[2].lower() + '--' +
                    v.get('name1').split(' ')[1].strip(', Jr.').lower())
            else:
                name = str(v.get('pga_num1')) + '.' + v.get('name1').split(
                    ' ')[0].lower() + '-' + v.get('name1').split(' ')[1].strip(
                        ', Jr.').lower()

            link = 'https://www.pgatour.com/players/player.' + unidecode.unidecode(
                name) + '.html'
            print(link)

            player_html = urllib.request.urlopen(link)
            player_soup = BeautifulSoup(player_html, 'html.parser')
            country = (player_soup.find('div', {'class': 'country'}))

            flag = country.find('img').get('src')
            print(flag)
            g1.flag_link = "https://www.pgatour.com" + flag
        g1.save()

        g2, c2 = Golfer.objects.get_or_create(golfer_pga_num=v.get('pga_num2'))
        g2.pic_link = populateField.get_pick_link(v.get('pga_num2'))
        if c2:
            g2.golfer_name = v.get('name2')
            if v.get('name2')[1] == '.' and v.get('name2')[3] == '.':
                name = str(
                    v.get('pga_num2') + '.' + v.get('name2')[0].lower() + '-' +
                    v.get('name2')[2].lower() + '--' +
                    v.get('name2').split(' ')[1].strip(', Jr.').lower())
            else:
                name = str(v.get('pga_num2')) + '.' + v.get('name2').split(
                    ' ')[0].lower() + '-' + v.get('name2').split(' ')[1].strip(
                        ', Jr.').lower()

            link = 'https://www.pgatour.com/players/player.' + unidecode.unidecode(
                name) + '.html'
            print(link)
            player_html = urllib.request.urlopen(link)
            player_soup = BeautifulSoup(player_html, 'html.parser')
            country = (player_soup.find('div', {'class': 'country'}))

            flag = country.find('img').get('src')
            print(flag)
            g2.flag_link = "https://www.pgatour.com" + flag
        g2.save()

        #g1  = populateField.get_flag(k, v, owgr_ranks)
        #g2 = populateField.get_flag(v[1], v, owgr_ranks)
        if count < group_size:
            field = Field()
            field.currentWGR = field.currentWGR = v.get('ranks1')[0] + v.get(
                'ranks2')[0]
            if v.get('ranks1')[0] < v.get('ranks2')[0]:  #0 is the current OWGR
                field.playerName = v.get('name1')
                field.golfer = Golfer.objects.get(
                    golfer_pga_num=v.get('pga_num1'))

                field.partner = v.get('name2')
                field.partner_golfer = Golfer.objects.get(
                    golfer_pga_num=v.get('pga_num2'))
                field.partner_owgr = v.get('ranks2')[0]

            else:
                field.playerName = v.get('name2')
                field.golfer = Golfer.objects.get(
                    golfer_pga_num=v.get('pga_num2'))

                field.partner = v.get('name1')
                field.partner_golfer = Golfer.objects.get(
                    golfer_pga_num=v.get('pga_num1'))
                field.partner_owgr = v.get('ranks1')[0]

            field.tournament = tourny
            field.group = Group.objects.get(number=group, tournament=tourny)
            field.alternate = False
            field.withdrawn = False
            field.handi = 0

            field.teamID = k
            #            field.golfer = g1
            #            field.partner_golfer = g2
            field.save()
            count += 1
            print(field, field.partner)

            if count == group_size:
                group += 1
                count = 0