import datetime
import functools
-import os
+import logging
import time
from typing import Any, Dict, List, Optional, Tuple
from dateutil.parser import parse
-import gdata # type: ignore
import gdata_oauth
-from oauth2client.client import AccessTokenRefreshError # type: ignore
import pytz
-import constants
+import kiosk_constants
import file_writer
import globals
import renderer
-import kiosk_secrets as secrets
-class gcal_renderer(renderer.debuggable_abstaining_renderer):
+logger = logging.getLogger(__file__)
+
+
+class gcal_renderer(renderer.abstaining_renderer):
"""A renderer to fetch upcoming events from www.google.com/calendar"""
calendar_whitelist = frozenset(
def __init__(
self, name_to_timeout_dict: Dict[str, int], oauth: gdata_oauth.OAuth
) -> None:
- super(gcal_renderer, self).__init__(name_to_timeout_dict, True)
+ super().__init__(name_to_timeout_dict)
self.oauth = oauth
self.client = self.oauth.calendar_service()
self.sortable_events: List[gcal_renderer.comparable_event] = []
return "gcal"
def periodic_render(self, key: str) -> bool:
- self.debug_print('called for "%s"' % key)
+ logger.debug('called for "%s"' % key)
if key == "Render Upcoming Events":
return self.render_upcoming_events()
elif key == "Look For Triggered Events":
_time_max = now + datetime.timedelta(days=95)
time_min = datetime.datetime.strftime(_time_min, "%Y-%m-%dT%H:%M:%SZ")
time_max = datetime.datetime.strftime(_time_max, "%Y-%m-%dT%H:%M:%SZ")
- self.debug_print(f"time_min is {time_min}")
- self.debug_print(f"time_max is {time_max}")
+ logger.debug(f"time_min is {time_min}")
+ logger.debug(f"time_max is {time_max}")
return (time_min, time_max)
@staticmethod
)
for calendar in calendar_list["items"]:
if calendar["summary"] in gcal_renderer.calendar_whitelist:
- self.debug_print(
+ logger.debug(
f"{calendar['summary']} is an interesting calendar..."
)
events = (
summary = event["summary"]
start = gcal_renderer.parse_date(event["start"])
end = gcal_renderer.parse_date(event["end"])
- self.debug_print(
+ logger.debug(
f" ... event '{summary}' ({event['start']} ({start}) to {event['end']} ({end})"
)
if start is not None and end is not None:
- self.debug_print(f' ... adding {summary} to sortable_events')
+ logger.debug(f' ... adding {summary} to sortable_events')
sortable_events.append(
gcal_renderer.comparable_event(
start, end, summary, calendar["summary"]
or "Holidays" in calendar["summary"]
or "Countdown" in summary
):
- self.debug_print(f" ... adding {summary} to countdown_events")
+ logger.debug(f" ... adding {summary} to countdown_events")
countdown_events.append(
gcal_renderer.comparable_event(
start, end, summary, calendar["summary"]
)
upcoming_sortable_events = self.sortable_events[:12]
for n, event in enumerate(upcoming_sortable_events):
- self.debug_print(f'{n}/12: {event.friendly_name()} / {event.calendar}')
+ logger.debug(f'{n}/12: {event.friendly_name()} / {event.calendar}')
if n % 2 == 0:
color = "#c6b0b0"
else:
x = int(delta.total_seconds())
if x > 0:
identifier = "id%d" % count
- days = divmod(x, constants.seconds_per_day)
- hours = divmod(days[1], constants.seconds_per_hour)
- minutes = divmod(hours[1], constants.seconds_per_minute)
+ days = divmod(x, kiosk_constants.seconds_per_day)
+ hours = divmod(days[1], kiosk_constants.seconds_per_hour)
+ minutes = divmod(hours[1], kiosk_constants.seconds_per_minute)
g.write(
f'<li><SPAN id="%s">%d days, %02d:%02d</SPAN> until %s</li>\n'
% (
)
timestamps[identifier] = time.mktime(eventstamp.timetuple())
count += 1
- self.debug_print(
+ logger.debug(
"countdown to %s is %dd %dh %dm"
% (name, days[0], hours[0], minutes[0])
)
</script>"""
)
return True
- except (gdata.service.RequestError, AccessTokenRefreshError):
+ except Exception as e:
+ logger.exception(e)
print("********* TRYING TO REFRESH GCAL CLIENT *********")
# self.oauth.refresh_token()
# self.client = self.oauth.calendar_service()
return False
- except:
- raise
def look_for_triggered_events(self) -> bool:
- with file_writer.file_writer(constants.gcal_imminent_pagename) as f:
+ with file_writer.file_writer(kiosk_constants.gcal_imminent_pagename) as f:
f.write("<h1>Imminent Upcoming Calendar Events:</h1>\n<hr>\n")
f.write("<center><table width=99%>\n")
now = datetime.datetime.now(pytz.timezone("US/Pacific"))
for event in self.sortable_events:
eventstamp = event.start_time
if eventstamp is None:
- return False
+ continue
delta = eventstamp - now
x = int(delta.total_seconds())
- if x > 0 and x <= constants.seconds_per_minute * 3:
- days = divmod(x, constants.seconds_per_day)
- hours = divmod(days[1], constants.seconds_per_hour)
- minutes = divmod(hours[1], constants.seconds_per_minute)
+ if x > -120 and x < 4 * kiosk_constants.seconds_per_minute:
+ days = divmod(x, kiosk_constants.seconds_per_day)
+ hours = divmod(days[1], kiosk_constants.seconds_per_hour)
+ minutes = divmod(hours[1], kiosk_constants.seconds_per_minute)
eventstamp = event.start_time
name = event.friendly_name()
calendar = event.calendar