You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
3.0 KiB

  1. from dateutil import rrule
  2. from gcalendar import dateTime
  3. import datetime
  4. import pickle
  5. import json
  6. import re
  7. LOCATION = "5500 St Louis Ave, Chicago, IL 60625"
  8. event = {
  9. 'summary': 'Google I/O 2015',
  10. 'location': '800 Howard St., San Francisco, CA 94103',
  11. 'description': 'A chance to hear more about Google\'s developer products.',
  12. 'start': {
  13. 'dateTime': '2015-05-28T09:00:00-07:00',
  14. 'timeZone': 'America/Los_Angeles',
  15. },
  16. 'end': {
  17. 'dateTime': '2015-05-28T17:00:00-07:00',
  18. 'timeZone': 'America/Los_Angeles',
  19. },
  20. 'recurrence': [
  21. 'RRULE:FREQ=DAILY;COUNT=2'
  22. ],
  23. 'attendees': [
  24. {'email': 'lpage@example.com'},
  25. {'email': 'sbrin@example.com'},
  26. ],
  27. 'reminders': {
  28. 'useDefault': False,
  29. 'overrides': [
  30. {'method': 'email', 'minutes': 24 * 60},
  31. {'method': 'popup', 'minutes': 10},
  32. ],
  33. },
  34. }
  35. def rrule_former(class_obj):
  36. days = class_obj.days
  37. start =datetime.datetime.combine(class_obj.date_range[0],class_obj.time_range[0]).astimezone()
  38. end =datetime.datetime.combine(class_obj.date_range[1],class_obj.time_range[1]).astimezone()
  39. days = [ (day -1) % 7 for day in days]
  40. ret = rrule.rrule(freq=rrule.WEEKLY,dtstart=start,wkst=rrule.SU,until=end,byweekday=days)
  41. ret_str = str(ret).split('\n')[-1]
  42. ret_str=re.sub(r'(UNTIL=[^;]+)',r'\1Z',ret_str)
  43. return 'RRULE:{}'.format(ret_str)
  44. def create_body(_class):
  45. if _class.time_range:
  46. body = {
  47. # "kind": "calendar#event",
  48. }
  49. body['recurrence'] = [rrule_former(_class)]
  50. body['start'] = dateTime(datetime.datetime.combine(_class.date_range[0],_class.time_range[0]))
  51. body['end'] = dateTime(datetime.datetime.combine(_class.date_range[0],_class.time_range[1]))
  52. body['summary'] = _class.title
  53. body['description'] = 'location: {}'.format(_class.location)
  54. body['location'] = LOCATION
  55. body['reminders'] = {'useDefault':True}
  56. return body
  57. def json_dump(obj):
  58. with open('classes.json','w') as file:
  59. json.dump(obj,file)
  60. def test_rrule():
  61. #test
  62. now = datetime.datetime.now()
  63. from munch import Munch
  64. test_obj = Munch(
  65. days=[1,3,5],
  66. time_range=[
  67. now.time(),
  68. (now+datetime.timedelta(seconds=50*60)).time()
  69. ],
  70. date_range=[
  71. now.date(),
  72. (now+datetime.timedelta(days=20)).date()
  73. ],
  74. )
  75. test_result = rrule_former(test_obj)
  76. return locals()
  77. def test_class2body():
  78. with open('classes.pkl','rb') as file:
  79. classes = pickle.load(file)
  80. test_result = list(filter(bool,map(create_body,classes)))
  81. return test_result
  82. def create_event(class_list):
  83. for class_obj in class_list:
  84. body,lab_body = create_body(class_obj)
  85. yield body
  86. if lab_body:
  87. yield lab_body
  88. if __name__ == "__main__":
  89. from scraper import get_classes
  90. with open('schedule.html') as file:
  91. classes = get_classes(file.read())
  92. l = list(create_event(classes))
  93. json_dump(l)