ntnoe_cancer/main.py
2017-12-05 20:10:28 +01:00

160 lines
4.6 KiB
Python

import datetime
import httplib2
import urllib
import os
import requests
import shutil
from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage
import icalendar
TIMEDELTA_SYNCHRO = datetime.timedelta(days=7) # Number of days to look for
# for synchronization
with open('ntnoe_credentials') as f:
NTNOE_ID,NTNOE_PASS,_ = f.read().split('\n')
SCOPES = 'https://www.googleapis.com/auth/calendar'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Google Calendar API Python Quickstart'
class Event:
# ColorId corresponding to course code
EVENT_COLOR = {
'9' : '9', # Amphi
'11' : '10', # TL
'10' : '6', # TD
'13' : '5', # Autre
'12' : '3', # Exam
}
def __init__(self, e):
""" Initialize an event from a `icalendar.cal.Event`."""
self.summary = e.decoded('SUMMARY').decode('utf-8')
self.start = e.decoded('DTSTART')
self.end = e.decoded('DTEND')
self.location = e.decoded('LOCATION').decode('utf-8')
self.colorid = self.EVENT_COLOR.get(e.decoded('DESCRIPTION').decode('utf-8'), '1')
def __str__(self):
return str(self.as_google())
def as_google(self):
return {
'summary' : self.summary,
'location' : self.location,
'start' : {
'dateTime' : self.start.isoformat(),
'timeZone' : 'Europe/Paris',
},
'end' : {
'dateTime' : self.end.isoformat(),
'timeZone' : 'Europe/Paris',
},
'colorId' : self.colorid,
'reminders': {
'useDefault': False,
'overrides': [],
},
}
def get_credentials():
"""Gets valid user credentials from storage.
If nothing has been stored, or if the stored credentials are invalid,
the OAuth2 flow is completed to obtain the new credentials.
Returns:
Credentials, the obtained credential.
"""
home_dir = os.path.expanduser('~')
credential_dir = os.path.join(home_dir, '.credentials')
if not os.path.exists(credential_dir):
os.makedirs(credential_dir)
credential_path = os.path.join(credential_dir, 'ntnoe.json')
store = Storage(credential_path)
credentials = store.get()
if not credentials or credentials.invalid:
flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
flow.user_agent = APPLICATION_NAME
print('Storing credentials to ' + credential_path)
credentials = tools.run_flow(flow, store)
return credentials
def get_ntnoe():
url = "http://ntnoe.metz.supelec.fr/ical/EdTcustom/Eleves/edt_{}.ics"
url = url.format(NTNOE_ID)
data = {'envoyer':'Utf8_All','submit':'Générer'}
r = requests.get(
"https://ntnoe.metz.supelec.fr/ical/index.php",
data=urllib.parse.urlencode(data),
auth=(NTNOE_ID, NTNOE_PASS),
)
url = "https://ntnoe.metz.supelec.fr/ical/EdTcustom/Eleves/edt_{id}.ics".format(id=NTNOE_ID)
r = requests.get(url, auth=(NTNOE_ID, NTNOE_PASS), stream=True)
with open("edt_{}.ics".format(NTNOE_ID), 'wb') as f:
f.write(r.content)
def main():
"""Get the events on NTNOE the puts them on Google Calendar.
"""
get_ntnoe()
credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
service = discovery.build('calendar', 'v3', http=http)
with open("edt_" + NTNOE_ID + ".ics") as f:
c = icalendar.Calendar.from_ical(f.read())
now = datetime.datetime.now()
then = now + TIMEDELTA_SYNCHRO
time_search = datetime.datetime(now.year, now.month, now.day, 1)
response = service.events().list(
calendarId='primary',
timeMin=time_search.isoformat()+'Z',
timeMax=then.isoformat()+'Z',
).execute()
existing_events = set()
for e in response['items']:
if 'summary' in e.keys():
existing_events.add(e['summary'])
for e in c.walk('VEVENT'):
event = Event(e)
t = (
event.summary,
event.start.isoformat(),
event.end.isoformat(),
event.location
)
if now >= event.end or event.start >= then:
continue
if existing_events.intersection({event.summary}):
continue
event = service.events().insert(
calendarId='primary',
body=event.as_google()
).execute()
print("Added event : {}".format(event.get('htmlLink')))
if __name__ == '__main__':
main()