# import datetime import psycopg2.extras import model import _bs from pprint import pprint import time import database import sys # import view # import arrow if __name__ == '__main__': row = -1 if len(sys.argv) > 1: try: row = int(sys.argv[1]) except ValueError: sys.exit(1) broadcast = True if len(sys.argv) > 2: broadcast = False start = time.time() db = database.db race_days_global = model.scrape_racingaustralia_main_page(row) interim = time.time() # print('interim 1 {}'.format(interim - start)) # pprint(race_days_global) race_days = [] raw_data_dict = {} for race_day in race_days_global: raw_data = model.get_raw_scratchings(race_day) race_day_details = model.process_raw_data(raw_data, race_day) race_days.append(race_day_details) raw_data_dict[race_day.name] = raw_data interim = time.time() # print('interim 2 {}'.format(interim - start)) # pprint(race_days) races = model.get_relevant_races_from_database(db) scratchings_for_database = [] messages = [] full_scratchings = [] for race_day in race_days: if not raw_data_dict or not race_day: # raw_data_dict may be empty when there is no data available (yet) continue raw_data = raw_data_dict[race_day.name] scratchings = model.get_scratching_details(raw_data, race_day) if not scratchings: # model.get_scratchings_details may return empty continue # retrieve previous stored scratching for this venue / day query = "SELECT * FROM horses WHERE venue = %s AND race_date = %s;" db.commit() cur1 = db.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor) cur1.execute(query, (race_day.name, race_day.date)) db_data_query1 = cur1.fetchall() # print(' 54. len(db_data): {}'.format(len(db_data))) # print(' 55. type(db_data): {}'.format(type(db_data))) # pprint(db_data) cur1.close() # compare retrieved scratchings with new data for scratching in scratchings: additional_data = model.get_race_from_races(races, scratching.date, scratching.venue, scratching.race) # print('additional_data') # pprint(additional_data) if len(additional_data) == 0: print('len(additional_data) == {}'.format(len(additional_data))) pprint(scratching) print('continue') continue full_scratching = _bs.Scratching(scratching.venue, scratching.state, scratching.date, scratching.race, additional_data[0], additional_data[1], scratching.horse_no, scratching.horse_display_name, additional_data[2]) full_scratchings.append(full_scratching) continue """ # ### OLD ### found_in_database = False # if db_data is None: # print(' 62. Caught db_data is None') # found_in_database = False # else: for row in db_data_query1: # print('row: ', end = '') # print(type(row)) # print(row) # if type(row) == 'datetime.time': # continue try: # if not hasattr(db_data, 'name'): # continue date_in_db_row_formatted = row.race_date.strftime('%Y-%m-%d') if ( scratching.date == date_in_db_row_formatted and scratching.venue == row.venue and int(scratching.race) == int(row.race) and scratching.horse_no == row.horse_no ): message_string = 'Horse found: date = {}, venue = {}, race = {}, horse = {}' message = message_string.format(scratching.date, scratching.venue, scratching.race, '{} {}'.format( scratching.horse_no, scratching.horse_display_name)) # print(message) # print(row) found_in_database = True except AttributeError as ae: print(ae) print(' 94. row: ', end='') print(row) pprint(db_data_query1) continue if not found_in_database: # report new scratching date_object = datetime.datetime.strptime(scratching.date, "%Y-%m-%d").date() day_abbr = date_object.strftime('%a') query = """ # SELECT start_time, utctime, torn FROM race_program # WHERE race_date = %s AND # venue = %s AND # race = %s; """ cur2 = db.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor) cur2.execute(query, (scratching.date, scratching.venue, scratching.race)) db_data_query2 = cur2.fetchone() cur2.close() if db_data_query2 is None or len(db_data_query2) == 0: print('106. cursor.execute(query, (scratching.date, scratching.venue, scratching.race))') print('107. cursor.execute({}, ({}, {}, {}))'.format( query, scratching.date, scratching.venue, scratching.race )) print('110. No race found') continue flag = '' if db_data_query2.torn: flag = 'FLAGGED!! ' message_string = '{}venue = {} {} {}-{} | race = {} starts at {} | {} UTC | horse = {}' message = message_string.format(flag, day_abbr, scratching.date, scratching.state, scratching.venue, scratching.race, db_data_query2.start_time.strftime('%H:%M'), db_data_query2.utctime.strftime('%H:%M'), '{} {}'.format(scratching.horse_no, scratching.horse_display_name)) print(message) if broadcast or flag == 'FLAGGED!! ': messages.append(message) # view.broadcast(message) # store new scratching scratchings_for_database.append((scratching.venue, scratching.date, scratching.race, scratching.horse_no, scratching.horse_display_name)) """ # pprint(full_scratchings) # print('len(full_scratchings): {}'.format(len(full_scratchings))) scratchings_to_be_broadcast = model.store_scratched_horses(db, full_scratchings) # print('len(scratchings_to_be_broadcast): {}'.format(len(scratchings_to_be_broadcast))) model.send_messages(scratchings_to_be_broadcast, 'RA') db.close() interim = time.time() # print('interim 3 {}'.format(interim - start))