From 34ce175709e57a60ecbb51fbaf1bdc7b16e0567d Mon Sep 17 00:00:00 2001
From: Tue Herlau <tuhe@dtu.dk>
Date: Mon, 10 Oct 2022 11:15:36 +0200
Subject: [PATCH] Initial commit refresh-token + put calendar event
 preliminary; api not stable

---
 .../__pycache__/learn_config.cpython-310.pyc  | Bin 0 -> 3589 bytes
 src/unlearn/cache/cache.db                    | Bin 0 -> 32768 bytes
 src/unlearn/learn_config.py                   | 122 ++++++++++++++++++
 src/unlearn/main.py                           |  84 ++++++++++++
 src/unlearn/scrap.py                          |  27 ++++
 5 files changed, 233 insertions(+)
 create mode 100644 src/unlearn/__pycache__/learn_config.cpython-310.pyc
 create mode 100644 src/unlearn/cache/cache.db
 create mode 100644 src/unlearn/learn_config.py
 create mode 100644 src/unlearn/main.py
 create mode 100644 src/unlearn/scrap.py

diff --git a/src/unlearn/__pycache__/learn_config.cpython-310.pyc b/src/unlearn/__pycache__/learn_config.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ca109eeec207a8ddacb2aa25dfc53294983e0f35
GIT binary patch
literal 3589
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

literal 0
HcmV?d00001

diff --git a/src/unlearn/cache/cache.db b/src/unlearn/cache/cache.db
new file mode 100644
index 0000000000000000000000000000000000000000..fd897644e84229987f58d420bff790a339e69599
GIT binary patch
literal 32768
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

literal 0
HcmV?d00001

diff --git a/src/unlearn/learn_config.py b/src/unlearn/learn_config.py
new file mode 100644
index 0000000..89b0aa5
--- /dev/null
+++ b/src/unlearn/learn_config.py
@@ -0,0 +1,122 @@
+import pickle
+import diskcache
+import requests
+from diskcache import Cache
+import os
+
+"""
+Links
+API: 
+"""
+
+def whoami(lc):
+    url = "https://testdtu.brightspace.com/d2l/api/lp/1.36/users/whoami"
+    payload = {}
+    headers = {
+        'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjRkZTk0ZWViLTU0NDctNDk4ZC1iMmNhLTU4NDg5MTU3OWI3YSIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE2NjUxNTc5MTYsImV4cCI6MTY2NTE2MTUxNiwiaXNzIjoiaHR0cHM6Ly9hcGkuYnJpZ2h0c3BhY2UuY29tL2F1dGgiLCJhdWQiOiJodHRwczovL2FwaS5icmlnaHRzcGFjZS5jb20vYXV0aC90b2tlbiIsInN1YiI6IjMzOTciLCJ0ZW5hbnRpZCI6ImVmYTdjODJhLWExYzItNGZjOC1hZTgyLTgwOGJhNzhjZDkxYyIsImF6cCI6IjQ4MDFhNDc3LTExYzctNGNmYy04NzMyLTczNmYwNDE1NzhiZSIsInNjb3BlIjoiY29yZToqOioiLCJqdGkiOiJjNGVhOTRhZi0xODdmLTQ3MzEtOGZmMy1lM2RkOWJhN2ZlMTIifQ.ngh5rHtFro4DWf6mcYSPoRV4LyadE7QJfNeeLRbosrPC2rwrW-00kX1oHqnrFLnWeIw9wNpeXfwM8UwYUxWvmwPcSGS6TI8d7I5gAb3Lqq6PEGHUfvho577scU2s_Lubi0RG_VTfaoNxggzFbvDlCzJom9EXWwbxGuLGk49OxtLile1_bX0kit8zOJhFoOGPjiO-GSvH5Qi4tvjYoowrBkTIyYD6Jw81ET_q2uTHaB15kWpMTl2uHeED-aRWivtX_rfTnFq3Wed3SmAPdS5Tb9g46hURKwq11O_ubGjqFbtQCsY9bIJpH5GShUURoQvWsTlqSqEyr7zgzc0wlMXwVQ'
+    }
+    headers = lc.headers
+    response = requests.request("GET", url, headers=headers, data=payload)
+    print(response.text)
+    return response
+    pass
+
+class LearnConfig:
+    server = "testdtu.brightspace.com/"
+    lp_version = "1.36"
+    headers = {
+        'Authorization': 'Bearer bla-bla'
+               }
+
+    def get_header(self):
+        headers = {
+            # cc = Cache(directory="cache")
+            'Authorization': f"Bearer {self.cc['access_token']}"
+        }
+        return headers
+
+    def isodate(self, date):
+        d = date.isoformat()
+        return d.split(".")[0] + ".000Z"
+
+
+
+    orgunitId = "8407"
+    def is_token_valid(self):
+        response = whoami(self)
+        json = response.json()
+        if "FirstName" in json:
+            print("Hello there", json['FirstName'])
+            return True
+        print("Authentication failed")
+        print(json)
+        return False
+
+    def __init__(self):
+
+        cc = Cache(directory=      os.path.join( os.path.dirname(__file__), "cache") )
+        self.cc = cc
+        while True:
+            if "access_token" in cc:
+                print("is there")
+                # Try to connect...
+                self.token = cc.get("access_token")
+                self.headers['Authorization'] = f"Bearer {self.token}"
+                if self.is_token_valid():
+                    print("Got a new token!")
+                    a = 234
+                    break
+                else:
+                    del cc['access_token']
+                    print("The token sucks.")
+                    continue
+
+            else:
+                if "refresh_token" in cc:
+
+                    url = "https://auth.brightspace.com/core/connect/token"
+                    refresh_token = cc['refresh_token']
+                    # refresh_token = "rt.eu-west-1.SAmtMKD3oe094NV6Yc4F8UuROyRdHMJRz_XwpiYtwfI"
+                    self.client_id = "4801a477-11c7-4cfc-8732-736f041578be"
+                    self.client_secret = "niLXYwe9f_pQe2RzvZ8LtYE6Ls6DSiZ_0IeTCPhx4_8"
+                    payload=f'grant_type=refresh_token&refresh_token={refresh_token}&client_id={self.client_id}&client_secret={self.client_secret}&scope=core%3A*%3A*'
+                    headers = {
+                      'Content-Type': 'application/x-www-form-urlencoded'
+                    }
+
+                    response = requests.request("POST", url, headers=headers, data=payload)
+                    cc['refresh_token'] = response.json()['refresh_token']
+                    cc['access_token'] = response.json()['access_token']
+                    print("Authentication success.")
+                    break
+
+                    # url = "https://auth.brightspace.com/core/connect/token"
+                    #
+                    # payload = 'grant_type=refresh_token&refresh_token=rt.eu-west-1.QLXytJ-TREfofv9xzbDcBEiEivw-_rogaSmS8XetScg&client_id=4801a477-11c7-4cfc-8732-736f041578be&client_secret=niLXYwe9f_pQe2RzvZ8LtYE6Ls6DSiZ_0IeTCPhx4_8&scope=core%3A*%3A*'
+                    # headers = {
+                    #     'Content-Type': 'application/x-www-form-urlencoded'
+                    # }
+                    #
+                    # response = requests.request("POST", url, headers=headers, data=payload)
+                    #
+                    # print(response.text)
+                    #
+                    #
+                    # print(response.text)
+
+                else:
+                    s = input("Please give me a refresh token")
+                    cc['refresh_token'] = s
+                    print("Saved refresh token", s)
+                print("no it is not there")
+        a = 234
+        print("Phew! Authentication completed.")
+        # load refresh token file.
+        # test if login possible with current token.
+        # pkl.get
+        # rt.eu-west-1.tN5byZD8n0KHSowkDC2NnElZx0J0BJgIz57Fmj-ZhKs
+        pass
+
+if __name__ == '__main__':
+    print("Hello world")
+    c = LearnConfig()
diff --git a/src/unlearn/main.py b/src/unlearn/main.py
new file mode 100644
index 0000000..950cb8b
--- /dev/null
+++ b/src/unlearn/main.py
@@ -0,0 +1,84 @@
+import datetime
+import json
+import requests
+from learn_config import LearnConfig
+
+def get_calendar_events(lc):
+    """ https://{{server}}d2l/api/le/{{lp_version}}/{{orgunitId}}/calendar/events/ """
+    # def whoami(lc):
+    url = f"https://{lc.server}d2l/api/le/{lc.lp_version}/{lc.orgunitId}/calendar/events/"
+    payload = {}
+    # headers = {
+    #     'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjRkZTk0ZWViLTU0NDctNDk4ZC1iMmNhLTU4NDg5MTU3OWI3YSIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE2NjUxNTc5MTYsImV4cCI6MTY2NTE2MTUxNiwiaXNzIjoiaHR0cHM6Ly9hcGkuYnJpZ2h0c3BhY2UuY29tL2F1dGgiLCJhdWQiOiJodHRwczovL2FwaS5icmlnaHRzcGFjZS5jb20vYXV0aC90b2tlbiIsInN1YiI6IjMzOTciLCJ0ZW5hbnRpZCI6ImVmYTdjODJhLWExYzItNGZjOC1hZTgyLTgwOGJhNzhjZDkxYyIsImF6cCI6IjQ4MDFhNDc3LTExYzctNGNmYy04NzMyLTczNmYwNDE1NzhiZSIsInNjb3BlIjoiY29yZToqOioiLCJqdGkiOiJjNGVhOTRhZi0xODdmLTQ3MzEtOGZmMy1lM2RkOWJhN2ZlMTIifQ.ngh5rHtFro4DWf6mcYSPoRV4LyadE7QJfNeeLRbosrPC2rwrW-00kX1oHqnrFLnWeIw9wNpeXfwM8UwYUxWvmwPcSGS6TI8d7I5gAb3Lqq6PEGHUfvho577scU2s_Lubi0RG_VTfaoNxggzFbvDlCzJom9EXWwbxGuLGk49OxtLile1_bX0kit8zOJhFoOGPjiO-GSvH5Qi4tvjYoowrBkTIyYD6Jw81ET_q2uTHaB15kWpMTl2uHeED-aRWivtX_rfTnFq3Wed3SmAPdS5Tb9g46hURKwq11O_ubGjqFbtQCsY9bIJpH5GShUURoQvWsTlqSqEyr7zgzc0wlMXwVQ'
+    # }
+    # headers = lc.headers
+    response = requests.request("GET", url, headers=lc.headers, data=payload)
+    print(response.text)
+    return response
+    pass
+
+def put_calendar_event(lc, start_date, end_date, title="Lecture", description="Do some stuff today", location_name="Auditorim 666"):
+    """
+    [{'CalendarEventId': 131048,
+  'OrgUnitId': 8407,
+  'CreatorUserId': 3397,
+  'Title': 'This even is a lecture! feel free to drop dead. ',
+  'Description': 'Oy veh.',
+  'CalendarEventViewUrl': 'https://testdtu.brightspace.com/d2l/le/calendar/8407/event/146759/detailsview',
+  'IsAllDayEvent': False,
+  'GroupId': None,
+  'StartDateTime': '2022-10-26T23:00:00.000Z',
+  'EndDateTime': '2022-10-27T01:00:00.000Z',
+  'IsRecurring': False,
+  'RecurrenceInfo': None,
+  'StartDay': None,
+  'EndDay': None,
+  'LocationId': None,
+  'LocationName': 'Auditorium',
+  'OrgUnitName': 'Tue Herlau- Sandbox',
+  'OrgUnitCode': 'OFFERING-SANDBOX-92378',
+  'IsAssociatedWithEntity': False,
+  'AssociatedEntity': None,
+  'HasVisibilityRestrictions': False,
+  'VisibilityRestrictions': {'Type': 1,
+   'Range': None,
+   'HiddenRangeUnitType': None,
+   'StartDate': None,
+   'EndDate': None},
+  'Presenters': []}]
+    """
+
+
+
+    url = f"https://testdtu.brightspace.com/d2l/api/le/{lc.lp_version}/{lc.orgunitId}/calendar/event/"
+
+    payload = json.dumps({
+        "Title": title, # "Today's Special 666b",
+        "Description": description, # "<p>Soup <b>is relly good</p><p>and also healthy</p>",
+        "StartDateTime":     lc.isodate(start_date), # "2019-05-02T20:00:00.000Z",
+        "EndDateTime":   lc.isodate(end_date), # "2019-05-02T20:30:00.000Z",
+        "StartDay": None,
+        "EndDay": None,
+        "GroupId": None,
+        "RecurrenceInfo": None,
+        "LocationId": None,
+        "LocationName": location_name,
+        "AssociatedEntity": None,
+        "VisibilityRestrictions": {
+            "Type": 1,
+            "Range": None,
+            "HiddenRangeUnitType": None,
+            "StartDate": None,
+            "EndDate": None
+        }
+    })
+    headers = lc.get_header()
+    headers['Content-Type'] = 'application/json'
+    response = requests.request("POST", url, headers=headers, data=payload)
+    print(response.text)
+
+if __name__ == '__main__':
+    lc = LearnConfig()
+    get_calendar_events(lc)
+    from datetime import datetime, timedelta
+    put_calendar_event(lc, start_date=datetime.now(), end_date=datetime.now() + timedelta(hours=2), title="Do stuff for lecture 4", description="<p><b>MORE</b></p>", location_name="Room 022")
diff --git a/src/unlearn/scrap.py b/src/unlearn/scrap.py
new file mode 100644
index 0000000..9e96d59
--- /dev/null
+++ b/src/unlearn/scrap.py
@@ -0,0 +1,27 @@
+# Cartoon elk: https://community.desire2learn.com/d2l/home/14841
+"""
+I will just copy the required information in again:
+
+Client ID
+
+4801a477-11c7-4cfc-8732-736f041578be
+
+Client Secret
+
+niLXYwe9f_pQe2RzvZ8LtYE6Ls6DSiZ_0IeTCPhx4_8
+
+
+Description
+
+Redirect URI
+https://localhost:3434/redirecturi
+Access Token Lifetime (seconds)
+3600
+Scope
+core:*:*
+
+
+ACCESS CODE (learn)
+tuhe / G(..)(!60 optional).
+
+"""
\ No newline at end of file
-- 
GitLab