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