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
zcmWFz^vNtqRY=P(%1ta$FlG>7U}9o$P*7lCU|?ooVBlat04@dw1{Nq6B+dwB<D-}v
z^uoP(`F}8QbM9i`FXTVYm(C~5yNfr4XD#<PZfmYm&RzJlkIIdPz-S1JhQMeDjE2By
z2#kinXb2!epwWVxUD{Nfqe;J{C^J1hwJ12Xq$D#hy*R!&vnn+{B{e6tB-J@FIV06M
z$kj2#RUstE)7{-QNCBHV1xL3K*B}KKS0C39R|S7R1+Yd1H~%07S4U?Lg&_ZM1t(W`
zPd|mw02h#9FhdlAT|*Sg5_3vZ6>Ooju7bahiyp`k3gI5EL9Pnfsg(-03Q8amC2Iv&
zKbJ;lE{M}zu{yo9ASIC)r$f|1oep&uWlq;t@N*4^IGqSzSa3pofjt5;^NLf8O2FZW
zHv%B)puX_*3w8|(p)dlFe1R(hOgPx3&BZyIRM8_KIlnZogqXyGtPtvWDy1Gn)MNv;
z2%2t8*zr0W5|ns@9Bf)VL?P7KR0?z4&JJN?6W0}IEY8eJNv#08F21-VzbG}nBr_M1
zLph)+#M95kH3E|Nkdz>jg9bvMW;iRGxV|`JIg+WV6$P2d#<F8E7D)|~xk#d#K`d<I
z>f(&0NCs!8R>l`4mV@2S1~oL)&oeO8RRP(_P-Sp)HL_DHbrgyc%Qc(Wnc2m~#TlD(
zOA?cEAf5)B#tJnp#L>ye72<OR4TYlo^2`(kPrndXP=OT?<mu}e6sh3t8mR*=Oq_iD
zoxtY8l;|iR0!AUo)zL>s0m(;Dk;LTW)Z$`rpreX_(*(>Y1s7L0$55XT1p^(0lEicc
zh+Uwv3!94E{FGE|;%S*Vsd<UHsR|*k5g|Izf)QktW(XsjxU4K=EjS!tr6`PMMhOj=
zsDcLA*C3-5{QN@{{6c+v6d=J5HCj`jiA~&DmXQG*XT^m%nI)<5iKQj^V17Kzpm;+V
z3)GJX_2C)7op_uCqP7`jjfTKz2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-R~z
z-4NjAd&D5Xw~m?b8Q(R&vwVm68TdZ(U*lWHf0TbM{}lcT{y2U&er<k%q3gp@myd?P
zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-R~zkr3c}#2^oKs$gRdvmy&<GCn>hGdHuu
zfq{X6Q-E2LBR8|SIJKCapIMY6BeSHKosU_R1Eh@qBS<F;Coi)&BY2vhiKj7(S)QXL
zF+CnUH_qFb$*jmxT#{IlSzMBtTrAO8!feWzl3AP`Uyzxcos$}0P?TSipPZk=D$!WX
zY{(3j%FWD+2Tk#Vms&A2Fo-r5F&lD1=iQ4d^O7@)^7Habi^UrYnRQv9;<>qr1z-)J
z$#==d0%l`js7zLVX;EHcPCRHeL3v`1SYtl3J`+?f8MJ~6tWAMIv@s814QP5lzAQ1h
zv^1BmF_&49F}XA+2NEn?>W$gV+UBWcnaL%Y`FZgL`8k=%l{u-2#U;8$smZB%B{`M4
z;1v@ophf)xe7BkS+4(>4C-HmmEAxHjd&T#UUzq;}|3Us0{FC^r_$~NugMx7skA}c#
z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkzyO2*zaRt3v@|-Ok6E4x-p^-v#l<Yi
z2pJ|2;9wSI1Pv4LgBYM;0zOXI_y8{h13$AO6G#x!mu7e)!mQ1N)|F;>4ORpnHDGut
z$!y959vVO!HDLH6&TI&gK^-*s3=)U-@sUOh7(R(I>%#i}@DT%sj}pwrFj3^u0)`J_
z*oF!i-XocgG*H0s4&-jcKmo&BUIqpRCLUb|{y99l0}zL!R*r_iXb6mkz-S1JhQMeD
zjE2By2#kinXb23}5NOL`;$u+dWM^RKVBp|n=oN%*sm{+%&2zkQ;m0iR%RVqVwbCmi
z$vrvKKhrBXw93=aFVnNwGq<E5%GuM*Gb<=NDkR$=Dm*OHCnVIs&n3CU&n4R=%Gof}
zH`g!2CnVIw&n4Z|Hzd^9KitzeGT5`&GcU+A8KgJ6AR^4!%Th13(yKHwH!{;d%hkv)
zE40c##JAEfB)Ql#H_Qa2&^IK~$S=g#)GsUD(66#QGcm%i$}=lJGtnc+Albv$%%{>a
zBiTK>G&0YtAj&AiAlcX{Bho0eG}6ej#K*|ZFvUGR)5qB>BPBc#<ca(gkD&78s{Aq^
zBe(LzVAIUx+?>2bkD#h#cekvlVAHH5BZIQYh%kdhXG?=5qmrB?kcad93?nl^9`>#B
z4@m}@XAl)`nvs+j1PO@Tu-wRylq`Q2uMD4X*NVt0&k{fPs4RbH!;Gkq^h%$Q^m2c9
zuMEGcjI1b^?25=rP$0UQf&Ay06=>q?;+Em(l5Fe~0@9mY;^*#{8(C>!;#cKc=@XJ%
z<(C^-?&soa=vS4I83hhRzpNx<ryNi?L>gIEMup@T`e){Y+*O$3o}KBR>1i018)y<4
z?rQAsY?$k36qV%@5?JmV9$FHa8<pkjY+&kJ6_yi~m6GG<5@_g`m7bXvs8^7b9~f0`
z?2#If=3AZ;URq|FRvD5JUr|}<A5viyk(3>k<ewi}>Fs1<?j2>6lb=x%8Shx^77!Zg
z=b{@}S`v^Nmg5_iRb}dunq6t^9g<n%oL*E=YUoyKYN1<En49kxl#`d5oLX2CAMEOA
z;OFgZP-<pc=9iLXR8nSOY7!q+5@ueIm0pxpR8>(~=$9T5To9CK;#iQDR%PPtlp5~o
zYn0_?7-&=(859^8;_4QjQe^1oUY2JbU*#NG80zmA6kl2pURmfIRgxOw?VXbskdsju
zZk88Zo?4ck;%Awg@0n^GRpsHGmLHhy7!Vp5Vq#%nk(&|j=w9SqR-Tk^Qev3yRBU2V
zRGd`qQtF#j>}Tj<<elhm5$PT7l9-ZM7834Qm7%MfZJ1vY5tJHMZXD#F8WG@VT;Xi&
zm*^8^oRXJS<{RRd6zQGh?ChFdZjlq1#K_B_4$p11MX6~;sl^%bC5YU%=QAX??fG0(
zqL*5#Tb^26qHCyE7LlA(l$&Z=rE46J6_6EQ7?2rYR$`f1VVRL+8eg2|oatX`XyRv_
z?`Hy<|7YUA!@z%s|J`6Mc1GPb8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O
zqalDh1O!=BIT?|M=$Hgq)Hyj(#t|U>|L+X^fB3)SHfdC5Gz3ONU^E0qLtr!nMnhmU
z1V%$(Gz3ONU^E0qLtr!nMnhl-h5!pQ10xeNGXp22|NoqU{|o=~A?S}$Cy$1}Xb6mk
zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDAVPqLnVk``Rp7D@6E`zECxo--GXRez
BW%vL9

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