Skip to content

Instantly share code, notes, and snippets.

@DamnedFacts
Last active January 30, 2019 19:31
Show Gist options
  • Save DamnedFacts/fd063c3a7e45e2765dd319336d12c893 to your computer and use it in GitHub Desktop.
Save DamnedFacts/fd063c3a7e45e2765dd319336d12c893 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
import datetime
from io import BytesIO
from sys import argv
import requests
from PyPDF2 import PdfFileReader
from icalendar import Calendar, Event, Alarm
from icalendar.prop import vRecur
from pytz import UTC
import argparse
def parse_pdf(pdata, period):
pdata = BytesIO(pdata)
pdf = PdfFileReader(pdata)
extract = []
for page_num in range(pdf.numPages):
page = pdf.getPage(page_num)
extract.extend(page.extractText().split())
pos = 0
due_dates = []
while pos < len(extract):
if extract[pos] == period:
due_dates.append(extract[pos+5])
pos += 5
else:
pos += 1
return due_dates
def create_ics(dates, url, period):
reminder_delta = 24 # hours
cal = Calendar()
cal.add('prodid', '-//TimeKeeper Calendar//mxm.dk//')
cal.add('version', '2.0')
counter = 0
for date in dates:
month, day, year = date.split("/")
date = datetime.date(int(year), int(month), int(day))
event = Event()
event.add('SUMMARY', "Payroll Time Keeper Due Date")
event.add('DTSTART', date)
event.add('DTEND', date)
event.add('DTSTAMP', datetime.datetime.now(tz=UTC))
event.add('LOCATION', "HRMS")
event.add('URL', url)
d = datetime.datetime.now(tz=UTC)
ds = str(d)
ds = ds.replace('+00:00', 'Z')
ds = ds.replace(' ', 'T')
ds = ds.replace('-', '')
ds = ds.replace(':', '')
event['uid'] = '{0}-{1}@pas.rochester.edu'.format(
ds,
counter)
alarm = Alarm()
alarm.add("action", "DISPLAY")
alarm.add('description', "Reminder")
#alarm.add("trigger", dt.timedelta(hours=-reminderHours))
# The only way to convince Outlook to do it correctly
alarm.add("TRIGGER;RELATED=START", "-PT{0}H".format(reminder_delta))
event.add_component(alarm)
cal.add_component(event)
counter += 1
with open(f"timekeeper_{period.lower()}.ics", 'wb') as f:
f.write(cal.to_ical())
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-u", "--url",
type=str,
nargs="?",
default=None,
help="provide a Timekeeper PDF URL",
required=True,
action='store')
parser.add_argument("-p", "--period",
type=str,
nargs="?",
default=None,
help="paygroup code, e.g. \"MTH\"",
required=True,
action='store')
args = parser.parse_args()
data = requests.get(args.url)
due_dates = parse_pdf(data.content, args.period)
create_ics(due_dates, args.url, args.period)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment