main.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. send_only_flagged = True # Note: there is another one in racenet.py
  20. if len(sys.argv) > 2:
  21. broadcast = False
  22. start = time.time()
  23. db = database.db
  24. race_days_global = model.scrape_racingaustralia_main_page(row)
  25. interim = time.time()
  26. # print('interim 1 {}'.format(interim - start))
  27. # pprint(race_days_global)
  28. race_days = []
  29. raw_data_dict = {}
  30. for race_day in race_days_global:
  31. raw_data = model.get_raw_scratchings(race_day)
  32. race_day_details = model.process_raw_data(raw_data, race_day)
  33. race_days.append(race_day_details)
  34. raw_data_dict[race_day.name] = raw_data
  35. races = model.get_relevant_races_from_database(db)
  36. scratchings_for_database = []
  37. messages = []
  38. full_scratchings = []
  39. for race_day in race_days:
  40. if not raw_data_dict or not race_day:
  41. # raw_data_dict may be empty when there is no data available (yet)
  42. continue
  43. raw_data = raw_data_dict[race_day.name]
  44. scratchings = model.get_scratching_details(raw_data, race_day)
  45. if not scratchings:
  46. # model.get_scratchings_details may return empty
  47. continue
  48. # retrieve previous stored scratching for this venue / day
  49. query = "SELECT * FROM horses WHERE venue = %s AND race_date = %s;"
  50. db.commit()
  51. cur1 = db.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor)
  52. cur1.execute(query, (race_day.name, race_day.date))
  53. db_data_query1 = cur1.fetchall()
  54. # print(' 54. len(db_data): {}'.format(len(db_data)))
  55. # print(' 55. type(db_data): {}'.format(type(db_data)))
  56. # pprint(db_data)
  57. cur1.close()
  58. # compare retrieved scratchings with new data
  59. for scratching in scratchings:
  60. additional_data = model.get_race_from_races(races, scratching.date, scratching.venue, scratching.race)
  61. # print('additional_data')
  62. # pprint(additional_data)
  63. if len(additional_data) == 0:
  64. print('len(additional_data) == {}'.format(len(additional_data)))
  65. pprint(scratching)
  66. print('continue')
  67. continue
  68. full_scratching = _bs.Scratching(scratching.venue, scratching.state, scratching.date, scratching.race,
  69. additional_data[0], additional_data[1], scratching.horse_no,
  70. scratching.horse_display_name, additional_data[2])
  71. full_scratchings.append(full_scratching)
  72. continue
  73. if (arrow.utcnow().minute + 4) % 20 == 0:
  74. pprint(full_scratchings)
  75. scratchings_to_be_broadcast = model.store_scratched_horses(db, full_scratchings)
  76. # print('len(scratchings_to_be_broadcast): {}'.format(len(scratchings_to_be_broadcast)))
  77. model.send_messages(scratchings_to_be_broadcast, 'RA', start, send_only_flagged)
  78. db.close()
  79. interim = time.time()
  80. if len(scratchings_to_be_broadcast) > 0:
  81. print('interim 3 {}'.format(interim - start))