def healthchecks(): requests.get(os.environ.get('HCHK_IO').strip()).raise_for_status()
def update_calendars(): now = timezone.localtime(timezone.now()) end = now + datetime.timedelta(days=30) for countdown in simplestats.models.Countdown.objects.exclude(calendar__exact=""): next_event = None next_time = None response = requests.get(countdown.calendar) calendar = icalendar.Calendar.from_ical(response.text) if "X-WR-CALNAME" in calendar: logger.info("Reading calendar: %s", calendar["X-WR-CALNAME"]) countdown.description = "Next event in %s" % calendar["X-WR-CALNAME"] for component in calendar.subcomponents: # Filter out non events if "DTSTART" not in component: logger.debug("No DTSTART: %s", component.get("SUMMARY", component)) continue # Filter out all day events if not isinstance(component["DTSTART"].dt, datetime.datetime): if countdown.allday: logger.debug("Converting to midnight date: %s", component["SUMMARY"]) component["DTSTART"] = icalendar.vDatetime( timezone.make_aware(datetime.datetime.combine(component["DTSTART"].dt, datetime.time.min)) ) else: logger.debug("Filter out all day event: %s", component["SUMMARY"]) continue if component["DTSTART"].dt < now: if "RRULE" not in component or countdown.repeating is False: logger.debug("Filter out past event: %s", component["SUMMARY"]) continue else: logger.debug("Processing RRULE") # Pull out our exclude dates into an easy list exdate = [] if "EXDATE" in component: try: for entry in component["EXDATE"]: for item in entry.dts: exdate.append(item.dt.date()) except TypeError: for item in component["EXDATE"].dts: exdate.append(item.dt.date()) for entry in rrulestr( component["RRULE"].to_ical().decode("utf-8"), dtstart=component["DTSTART"].dt ).between(now, end): if entry.date() in exdate: continue if next_event is None: logger.debug("Setting next to: %s", component["SUMMARY"]) next_event = component next_time = entry break if entry < next_time: next_event = component next_time = entry break continue if next_event is None: logger.debug("Setting next to: %s", component["SUMMARY"]) next_event = component next_time = component["DTSTART"].dt continue if component["DTSTART"].dt < next_time: logger.debug("Setting next to: %s", component["SUMMARY"]) next_event = component next_time = component["DTSTART"].dt if next_event: countdown.created = next_time countdown.label = next_event["SUMMARY"] countdown.more = next_event["URL"] if "URL" in next_event else "" countdown.save() logger.info("Updating date for %s to %s", countdown.label, countdown.created)