| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- # 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)))
- if (arrow.utcnow().minute + 4) % 20 == 0:
- pprint(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', start)
- db.close()
- interim = time.time()
- if len(scratchings_to_be_broadcast) > 0:
- print('interim 3 {}'.format(interim - start))
|