commit 58dea7c7f6e1c9dec7ee4430d659ba6ceb6e42bc
Author: Klafyvel <klafyvel@gmail.com>
Date:   Mon Dec 4 22:19:04 2017 +0100

    Ajout des fichiers.

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..381fd69
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,123 @@
+ntnoe_credentials
+
+
+# Created by https://www.gitignore.io/api/vim,python
+
+### Python ###
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+
+### Vim ###
+# swap
+[._]*.s[a-v][a-z]
+[._]*.sw[a-p]
+[._]s[a-v][a-z]
+[._]sw[a-p]
+# session
+Session.vim
+# temporary
+.netrwhist
+*~
+# auto-generated tag files
+tags
+
+# End of https://www.gitignore.io/api/vim,python
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..0691d36
--- /dev/null
+++ b/main.py
@@ -0,0 +1,163 @@
+import datetime
+import httplib2
+import urllib
+import os
+
+from apiclient import discovery
+from oauth2client import client
+from oauth2client import tools
+from oauth2client.file import Storage
+
+import icalendar
+
+
+TIMEDELTA_SYNCHRO = datetime.timedelta(days=4) # 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)
+
+    h = httplib2.Http()
+    h.add_credentials(NTNOE_ID,NTNOE_PASS)
+    data = {'envoyer':'Utf8_All','submit':'G%E9n%E9rer'}
+
+    h.request(
+        "https://ntnoe.metz.supelec.fr/ical/index.php",
+        body=urllib.parse.urlencode(data),
+        method='POST',
+    )
+    # resp,content = h.request(
+        # "https://ntnoe.metz.supelec.fr/ical/EdTcustom/Eleves/edt_{id}.ics".format(id=NTNOE_ID),
+    # )
+    # print(resp,content)
+    # TODO : download from ntnoe
+
+
+
+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
+    response = service.events().list(
+        calendarId='primary',
+        timeMin=now.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
+        else:
+            print(event.summary)
+
+        event = service.events().insert(
+            calendarId='primary',
+            body=event.as_google()
+        ).execute()
+        print("Added event : {}".format(event.get('htmlLink')))
+
+if __name__ == '__main__':
+    main()
+
diff --git a/ntnoe_credentials.example b/ntnoe_credentials.example
new file mode 100644
index 0000000..bc20392
--- /dev/null
+++ b/ntnoe_credentials.example
@@ -0,0 +1,2 @@
+nom_pre
+ThisIsASecretPassword