main.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. # import datetime
  2. import psycopg2.extras
  3. import model
  4. import _bs
  5. from pprint import pprint
  6. import time
  7. import database
  8. import sys
  9. # import view
  10. # import arrow
  11. if __name__ == '__main__':
  12. row = -1
  13. if len(sys.argv) > 1:
  14. try:
  15. row = int(sys.argv[1])
  16. except ValueError:
  17. sys.exit(1)
  18. broadcast = True
  19. if len(sys.argv) > 2:
  20. broadcast = False
  21. start = time.time()
  22. db = database.db
  23. race_days_global = model.scrape_main_page(row)
  24. interim = time.time()
  25. # print('interim 1 {}'.format(interim - start))
  26. # pprint(race_days_global)
  27. race_days = []
  28. raw_data_dict = {}
  29. for race_day in race_days_global:
  30. raw_data = model.get_raw_scratchings(race_day)
  31. race_day_details = model.process_raw_data(raw_data, race_day)
  32. race_days.append(race_day_details)
  33. raw_data_dict[race_day.name] = raw_data
  34. interim = time.time()
  35. # print('interim 2 {}'.format(interim - start))
  36. # pprint(race_days)
  37. races = model.get_relevant_races_from_database(db)
  38. scratchings_for_database = []
  39. messages = []
  40. full_scratchings = []
  41. for race_day in race_days:
  42. if not raw_data_dict or not race_day:
  43. # raw_data_dict may be empty when there is no data available (yet)
  44. continue
  45. raw_data = raw_data_dict[race_day.name]
  46. scratchings = model.get_scratching_details(raw_data, race_day)
  47. if not scratchings:
  48. # model.get_scratchings_details may return empty
  49. continue
  50. # retrieve previous stored scratching for this venue / day
  51. query = "SELECT * FROM horses WHERE venue = %s AND race_date = %s;"
  52. db.commit()
  53. cur1 = db.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor)
  54. cur1.execute(query, (race_day.name, race_day.date))
  55. db_data_query1 = cur1.fetchall()
  56. # print(' 54. len(db_data): {}'.format(len(db_data)))
  57. # print(' 55. type(db_data): {}'.format(type(db_data)))
  58. # pprint(db_data)
  59. cur1.close()
  60. # compare retrieved scratchings with new data
  61. for scratching in scratchings:
  62. additional_data = model.get_race_from_races(races, scratching.date, scratching.venue, scratching.race)
  63. # print('additional_data')
  64. # pprint(additional_data)
  65. if len(additional_data) == 0:
  66. print('len(additional_data) == {}'.format(len(additional_data)))
  67. pprint(scratching)
  68. print('continue')
  69. continue
  70. full_scratching = _bs.Scratching(scratching.venue, scratching.state, scratching.date, scratching.race,
  71. additional_data[0], additional_data[1], scratching.horse_no,
  72. scratching.horse_display_name, additional_data[2])
  73. full_scratchings.append(full_scratching)
  74. continue
  75. """
  76. # ### OLD ###
  77. found_in_database = False
  78. # if db_data is None:
  79. # print(' 62. Caught db_data is None')
  80. # found_in_database = False
  81. # else:
  82. for row in db_data_query1:
  83. # print('row: ', end = '')
  84. # print(type(row))
  85. # print(row)
  86. # if type(row) == 'datetime.time':
  87. # continue
  88. try:
  89. # if not hasattr(db_data, 'name'):
  90. # continue
  91. date_in_db_row_formatted = row.race_date.strftime('%Y-%m-%d')
  92. if (
  93. scratching.date == date_in_db_row_formatted and
  94. scratching.venue == row.venue and
  95. int(scratching.race) == int(row.race) and
  96. scratching.horse_no == row.horse_no
  97. ):
  98. message_string = 'Horse found: date = {}, venue = {}, race = {}, horse = {}'
  99. message = message_string.format(scratching.date,
  100. scratching.venue,
  101. scratching.race,
  102. '{} {}'.format(
  103. scratching.horse_no, scratching.horse_display_name))
  104. # print(message)
  105. # print(row)
  106. found_in_database = True
  107. except AttributeError as ae:
  108. print(ae)
  109. print(' 94. row: ', end='')
  110. print(row)
  111. pprint(db_data_query1)
  112. continue
  113. if not found_in_database:
  114. # report new scratching
  115. date_object = datetime.datetime.strptime(scratching.date, "%Y-%m-%d").date()
  116. day_abbr = date_object.strftime('%a')
  117. query = """
  118. # SELECT start_time, utctime, torn FROM race_program
  119. # WHERE race_date = %s AND
  120. # venue = %s AND
  121. # race = %s;
  122. """
  123. cur2 = db.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor)
  124. cur2.execute(query, (scratching.date, scratching.venue, scratching.race))
  125. db_data_query2 = cur2.fetchone()
  126. cur2.close()
  127. if db_data_query2 is None or len(db_data_query2) == 0:
  128. print('106. cursor.execute(query, (scratching.date, scratching.venue, scratching.race))')
  129. print('107. cursor.execute({}, ({}, {}, {}))'.format(
  130. query, scratching.date, scratching.venue, scratching.race
  131. ))
  132. print('110. No race found')
  133. continue
  134. flag = ''
  135. if db_data_query2.torn:
  136. flag = 'FLAGGED!! '
  137. message_string = '{}venue = {} {} {}-{} | race = {} starts at {} | {} UTC | horse = {}'
  138. message = message_string.format(flag,
  139. day_abbr,
  140. scratching.date,
  141. scratching.state,
  142. scratching.venue,
  143. scratching.race,
  144. db_data_query2.start_time.strftime('%H:%M'),
  145. db_data_query2.utctime.strftime('%H:%M'),
  146. '{} {}'.format(scratching.horse_no, scratching.horse_display_name))
  147. print(message)
  148. if broadcast or flag == 'FLAGGED!! ':
  149. messages.append(message)
  150. # view.broadcast(message)
  151. # store new scratching
  152. scratchings_for_database.append((scratching.venue, scratching.date,
  153. scratching.race, scratching.horse_no, scratching.horse_display_name))
  154. """
  155. # pprint(full_scratchings)
  156. print('len(full_scratchings): {}'.format(len(full_scratchings)))
  157. scratchings_to_be_broadcast = model.store_scratched_horses(db, full_scratchings)
  158. print('len(scratchings_to_be_broadcast): {}'.format(len(scratchings_to_be_broadcast)))
  159. model.send_messages(scratchings_to_be_broadcast, 'RA')
  160. db.close()
  161. interim = time.time()
  162. # print('interim 3 {}'.format(interim - start))