From eb99e7aaf6d6c858c1050d95e0b41ce53bb1ec3f Mon Sep 17 00:00:00 2001 From: Norm Rasmussen Date: Wed, 4 Dec 2024 16:33:40 -0500 Subject: [PATCH] Lots of progress on migration tool for Luma's monthly ask. It's 90% working, but the enrollments endpoint is giving me issues. --- Custom_Templates/customer_templates/.DS_Store | Bin 22532 -> 22532 bytes Scripts/.DS_Store | Bin 10244 -> 10244 bytes .../Migration_tool/Luma_mass_completions.zip | Bin 0 -> 19605 bytes .../__pycache__/Apikeys.cpython-310.pyc | Bin 0 -> 223 bytes .../__pycache__/Calls.cpython-310.pyc | Bin 0 -> 1500 bytes .../__pycache__/manage_csv.cpython-310.pyc | Bin 0 -> 378 bytes .../Luma_mass_completions/data.csv | 16 ++ .../Luma_mass_completions/manage_csv.py | 6 + .../mark_course_as_complete.py | 225 ++++++++++++++++++ .../Luma_mass_completions/utils/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 191 bytes .../utils/__pycache__/apikeys.cpython-310.pyc | Bin 0 -> 227 bytes .../utils/__pycache__/calls.cpython-310.pyc | Bin 0 -> 1959 bytes .../Luma_mass_completions/utils/apikeys.py | 1 + .../Luma_mass_completions/utils/calls.py | 63 +++++ 15 files changed, 311 insertions(+) create mode 100644 Scripts/Migration_tool/Luma_mass_completions.zip create mode 100644 Scripts/Migration_tool/Luma_mass_completions/__pycache__/Apikeys.cpython-310.pyc create mode 100644 Scripts/Migration_tool/Luma_mass_completions/__pycache__/Calls.cpython-310.pyc create mode 100644 Scripts/Migration_tool/Luma_mass_completions/__pycache__/manage_csv.cpython-310.pyc create mode 100644 Scripts/Migration_tool/Luma_mass_completions/data.csv create mode 100644 Scripts/Migration_tool/Luma_mass_completions/manage_csv.py create mode 100644 Scripts/Migration_tool/Luma_mass_completions/mark_course_as_complete.py create mode 100644 Scripts/Migration_tool/Luma_mass_completions/utils/__init__.py create mode 100644 Scripts/Migration_tool/Luma_mass_completions/utils/__pycache__/__init__.cpython-310.pyc create mode 100644 Scripts/Migration_tool/Luma_mass_completions/utils/__pycache__/apikeys.cpython-310.pyc create mode 100644 Scripts/Migration_tool/Luma_mass_completions/utils/__pycache__/calls.cpython-310.pyc create mode 100644 Scripts/Migration_tool/Luma_mass_completions/utils/apikeys.py create mode 100644 Scripts/Migration_tool/Luma_mass_completions/utils/calls.py diff --git a/Custom_Templates/customer_templates/.DS_Store b/Custom_Templates/customer_templates/.DS_Store index 85b43cc4ee95f848ab37d2edacaeeee12782b033..10531d219559bcd6fcac3dee77ede57eb53faccb 100644 GIT binary patch delta 335 zcmZqKz}T{Zaf2P>*~%btVu=-F$YcRSqfLe{_$IHj*P2|zC_dTOL4C5B zL*T?x9Y!aR(VMS0T;>QDVF+eOX2@X32f`c%T_7u!A(0^k$SMM|QW!G9bTUIpPP$=m za(-?B0|fX2DLi^7XDO>nWGj7PM%Kx1?6f8a*o#kYWz?8l?I1Z>$H8#35Yt!Ii4DA)**RDw z7~LluD2QxUQ25OxF2vx-kjGHMkin48kORc&43!MJ3_+8nJQZ=ug?Xytl$(Y}?wY6K z>>Js2>|1S3s3+6 diff --git a/Scripts/Migration_tool/Luma_mass_completions.zip b/Scripts/Migration_tool/Luma_mass_completions.zip new file mode 100644 index 0000000000000000000000000000000000000000..e6949af23931a47b8d78bcbad15456345fc1eeba GIT binary patch literal 19605 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 literal 0 HcmV?d00001 diff --git a/Scripts/Migration_tool/Luma_mass_completions/__pycache__/Calls.cpython-310.pyc b/Scripts/Migration_tool/Luma_mass_completions/__pycache__/Calls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c7d973dff2d586a7014ec7b143f36c2771ec8dc GIT binary patch literal 1500 zcmah}&u`l{6ecNIk`p_1n-17v!?XeWVGOa*_7-fz+{Rdju9*?HXu=%~L1b$=vZRsJ z8VmL?V7vCVTQ{IP_CFeQ*P{oZkrbm`j_? zW6fU>U12M16~{(43AKE?ImPKJ6&A4VICjwxqNBEL>E&hP8m;C*$MMJiK9@( zSsF}bmUc>^g2Az*&+XN!qH%C-@2MUf}1>A82VUtkE0Z`HF+Ec^tHl0G`Iq3qWSV zL&k+HKO7wLs8F2wUvcH{^6v{SRnH%(P!-aTGRFN_`bX~%gvf-SMNuIHXFY$L3;wb6 z)dbelN7<%-bj=S_=F9Vqn|{}=JW;2VmGzjb%H1CHw+6eTs*#I0Rn=-8Kh_6T&F%a5 zhvuNlHmul{RfvSPVCPtHnP;iw6`oK}ua05%1rk>Q=cDg}2NG@*06jAi%2^>LPlK&2 zDrP{b3?63UAQ(j=&cV4CKNg1ivC6U}xEG3p@tv#?l8^fm-e!5i6%V2?Nn|gdizb}V z(v*Gx#>Q*-I&^|NxO43NM2^X^=h%cCdA3cwe>%j(M+9O|o0fe8y3s`sUQRW!z@Q3i zNsKDUxhfPWVA{~UF9frLq-2 zR9#D40f)MII8U;W(Y6jfL)t)Fn`?UGI+#zPOPv;Ok5{mb&FpJcpl^Ft1&832x61X? z8(&rhTFE11D&f{iC9MBnCDeP)t6_ovqjaH5vi#%>ur02sy;SDHfp7tTE_4c>!_1C1 z;1g{fa)REKI^-O-j!vRwc>%k(z`X%oz73|-M*M)aehuzB|}AUs}1h`=h~w-EWK*4MisR mg|9N-r)jOc&t@4b68?q$mC5U1Jk-J-Zds0D*t5L%TF$>@;$$5F literal 0 HcmV?d00001 diff --git a/Scripts/Migration_tool/Luma_mass_completions/__pycache__/manage_csv.cpython-310.pyc b/Scripts/Migration_tool/Luma_mass_completions/__pycache__/manage_csv.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f9281bbea98c88a52103f825f5663aa947dd166 GIT binary patch literal 378 zcmYjMK}y9i5KYqhDaF50FVRhN0TDr$`Vl@NbYU5qv=p19WLiP_-FXUEy7Ua*q+3^B z!IhJW@E^=eULKQ~=ho|#5k6mUnu*S@Aod|hoKxWmkz$H>tl&zh=!F$R@h!{ZZ*thC z3jB}I6;WMK;SrJI6C2nY-?4W-@m=T>o98r_3I@n4e9XiwdQ~J|gDMwYq^;?lAL_Q# zvrzR1^D+JOb1!dEdz99B;{nZxsI9zo)o8RGP~JKJAh(rodlJ`e<6&r>EeGd1c{Lg+ z4Iq}4GkvFngVKP7Mu(|+|1=-}jV%Gouw3oI=#T|hL@`f!%ze0KQL*a5DnK9NE^o_* Xdvrj?oSYh`#!jDcQW!EM>`?py)xBGi literal 0 HcmV?d00001 diff --git a/Scripts/Migration_tool/Luma_mass_completions/data.csv b/Scripts/Migration_tool/Luma_mass_completions/data.csv new file mode 100644 index 00000000..2b91f3fd --- /dev/null +++ b/Scripts/Migration_tool/Luma_mass_completions/data.csv @@ -0,0 +1,16 @@ +Completion Date,Email Address,Course Name +2024-04-19,norm@rsmsn.co,This is War +2024-04-20,norm+climbing@northpass.com,This is War +2024-04-21,gasssygas@gas.com,This is War +2024-04-22,boy@morrison.org,This is War +2024-04-23,norm+mtnclimb@northpass.com,This is War +2024-04-24,n,This is War +2024-04-25,jim@morrison.org,This is War +2024-04-25,nrasmussen+admincomms@northpass.com,This is War +2024-04-26,nrasmussen+test2@gainsight.com,This is War +2024-04-27,paulmiller@paulmiller.com,This is War +2024-04-28,potatobox@gas.com,This is War +2024-05-01,kfolsomtest@northpass.com,This is War +2024-05-02,biggum@gas.com,This is War +2024-05-03,aliens@destination.com,This is War +2024-05-04,y,This is War diff --git a/Scripts/Migration_tool/Luma_mass_completions/manage_csv.py b/Scripts/Migration_tool/Luma_mass_completions/manage_csv.py new file mode 100644 index 00000000..1e479eea --- /dev/null +++ b/Scripts/Migration_tool/Luma_mass_completions/manage_csv.py @@ -0,0 +1,6 @@ +import pandas as pd + +def import_as_dataframe(): + importfile = "./data.csv" + df = pd.read_csv(importfile) + return df diff --git a/Scripts/Migration_tool/Luma_mass_completions/mark_course_as_complete.py b/Scripts/Migration_tool/Luma_mass_completions/mark_course_as_complete.py new file mode 100644 index 00000000..147260d6 --- /dev/null +++ b/Scripts/Migration_tool/Luma_mass_completions/mark_course_as_complete.py @@ -0,0 +1,225 @@ +""" +Order of operations: +1. Get input of people and course +2. Create Project +3. Create Item with Course_attempt type +4. Create Course Attempt Resource with the same type. +5. Start Migration. +""" + +from sys import argv +from utils import calls +import manage_csv +from datetime import datetime, timedelta +import uuid + +baseurl = calls.BASEURL + +probject = {} +items = {} +courses = {} +people = {} +miniattempt_loads = [] +minienroll_loads = [] + + +item_types = [ + "courses", + "sections", + "activities", + "people", + "enrollment_resources", + "course_attempts", + "quiz_attempts", + "certificates", + "learning_path_attempts", +] +project_name = argv[1] + + +def get_data(): + df = manage_csv.import_as_dataframe() + df.columns = df.columns.str.lower() + row_iterator = df.iterrows() + _, last = next(row_iterator) + for i, row in row_iterator: + email = row["email address"] + course = row["course name"] + date = row["completion date"] + people_tuple = get_people(email) + if people_tuple is None: + pass + else: + course_uuid = get_courses(course) + attempt_payload = create_attempt_payload(course_uuid, people_tuple[0], date) + enrollment_payload = create_enrollment_payload( + course_uuid, people_tuple[0], date + ) + create_attempt_resource(attempt_payload) + create_enrollment_resource(enrollment_payload) + + +def get_people(email): + url = f"{baseurl}/people?filter[email][eq]={email}" + returned = calls.get(url) + if returned["data"] == []: + print("I couldn't find this user.") + else: + for api_items in returned["data"]: + if api_items["attributes"]["registration_status"] == "activated": + single_uuid = api_items["id"] + single_email = api_items["attributes"]["email"] + return (single_uuid, single_email) + else: + print(f"Person not found or activated. {email}") + + +def get_courses(course): + url = f"{baseurl}/courses?filter[name][eq]={course}" + returned = calls.get(url) + for items in returned["data"]: + course_uuid = items["id"] + course_name = items["attributes"]["name"] + print(f"Cool. Course {course_uuid} exists.") + return course_uuid + + +def create_attempt_payload(course_uuid, learner_uuid, date_str): + print(f"Creating Course Attempt Payload") + now = datetime.now() + date_format = "%Y-%m-%d %H:%M:%S" + if type(date_str) == str: + if len(date_str) >= 8 and len(date_str) <= 10: + date_str = f"{date_str} 00:00:00" + formatted_date = datetime.strptime(date_str, date_format) + formatted_date = str(formatted_date) + else: + formatted_date = datetime.strptime(date_str, date_format) + formatted_date = str(formatted_date) + mini_attempt_payload = { + "type": "course_attempt_resources", + "attributes": { + "uuid": str(uuid.uuid4()), + "display_name": f"{learner_uuid}s Attempt for course {course_uuid}", + "data": { + "learner_id": f"{learner_uuid}", + "course_id": f"{course_uuid}", + "progress": 100, + "enrolled_at": formatted_date, + "started_at": formatted_date, + "completed_at": formatted_date, + "completed_activities": [ + {"id": str(uuid.uuid4()), "completed_at": formatted_date} + ], + }, + }, + } + miniattempt_loads.append(mini_attempt_payload) + attempt_payload = { "data": miniattempt_loads } + return attempt_payload + + +def create_enrollment_payload(course_uuid, learner_uuid, date_str): + print(f"Creating Course Enrollment Payload") + now = datetime.now() + date_format = "%Y-%m-%d %H:%M:%S" + if type(date_str) == str: + if len(date_str) >= 8 and len(date_str) <= 10: + date_str = f"{date_str} 00:00:00" + formatted_date = datetime.strptime(date_str, date_format) + formatted_date = str(formatted_date) + else: + formatted_date = datetime.strptime(date_str, date_format) + formatted_date = str(formatted_date) + mini_enrollment_payload = { + "type": "enrollment_resource", + "attributes": { + "uuid": str(uuid.uuid4()), + "display_name": f"{learner_uuid}s enrollment for course {course_uuid}/", + "data": { + "enrolled_at": formatted_date, + "course_id": course_uuid, + "person_id": learner_uuid + } + } + } + minienroll_loads.append(mini_enrollment_payload) + enrollment_payload = {"data": minienroll_loads } + with open("payload.json", "w") as f: + f.write(str(enrollment_payload)) + print(enrollment_payload) + return enrollment_payload + + +def create_enrollment_resource(enrollment_payload): + item = items["enrollments"] + enrollment_url = f"{baseurl}/migration/projects/{list(probject.values())[0]}/items/{item}/enrollment_resources" + print(enrollment_url) + print(f"Enrollment Payload is: {enrollment_payload}") + enrollment_call = calls.post(enrollment_url, enrollment_payload) + print( + f"In trying the enrollment resource, the following code was returned: {enrollment_call.status_code}" + ) + + +def create_attempt_resource(attempt_payload): + item = items["course_attempts"] + attempt_url = f"{baseurl}/migration/projects/{list(probject.values())[0]}/items/{item}/course_attempt_resources" + print(attempt_url) + print(f"Attempt Payload is: {attempt_payload}") + attempt_call = calls.post(attempt_url, attempt_payload) + print( + f"In trying the attempt resource, the following code was returned: {attempt_call.status_code}" + ) + +def create_project(project_name): + proj_payload = { + "data": { + "type": "migration_projects", + "attributes": {"name": project_name}, + } + } + proj_full_url = f"{baseurl}/migration/projects" + tmp_p = calls.post(proj_full_url, proj_payload) + probject[project_name] = tmp_p["data"]["id"] + print(f"Created Project: {probject}") + + +def create_item(i_type): + print("Creating Item") + # Item Type Options: 'courses', 'sections', 'activities', 'people', 'enrollments', 'course_attempts', 'quiz_attempts', 'certificates', 'learning_path_attempts' + item_full_url = f"{baseurl}/migration/projects/{list(probject.values())[0]}/items" + item_type = i_type + print(item_type) + item_payload = { + "data": { + "attributes": {"type": item_type}, + } + } + # "type": "migration_items", + item_return = calls.post(item_full_url, item_payload) + items[item_type] = item_return["data"]["id"] + item_id = item_return["data"]["id"] + print(f"Created Item ID: { items[item_type] }") + return item_id + + +def start_migration(): + print("Starting Migration Function") + start_url = ( + f"{baseurl}/migration/projects/{list(probject.values())[0]}/start_migration" + ) + empty = "" + mig = calls.post(start_url, empty) + print(mig.text) + print(mig) + + +if __name__ == "__main__": + create_project(project_name) + create_item("course_attempts") + create_item("enrollments") + print(items) + print(probject) + get_data() + start_migration() diff --git a/Scripts/Migration_tool/Luma_mass_completions/utils/__init__.py b/Scripts/Migration_tool/Luma_mass_completions/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Scripts/Migration_tool/Luma_mass_completions/utils/__pycache__/__init__.cpython-310.pyc b/Scripts/Migration_tool/Luma_mass_completions/utils/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7a4793aee960ea86db3a5167633f7d878377bbd GIT binary patch literal 191 zcmYj~F$w}P5Jj`Hg$R2EdmHBhA{Le^!XlPK+zm@GlL?um@JL?C)>~MaRQln+&;L^l zcilo2E$KYfd{_LdDP>nIZNaE|wQ5dJ73=)N=LQ!sQNVMgsD-kK@v!G1lkrL5%JB~U z5N#;sXs4)?Wsiy3!6B1I(jqu81!w9-ASdet5UsZfaUCA7`G$DR&TQ*%nH99^3yOd; A+5i9m literal 0 HcmV?d00001 diff --git a/Scripts/Migration_tool/Luma_mass_completions/utils/__pycache__/apikeys.cpython-310.pyc b/Scripts/Migration_tool/Luma_mass_completions/utils/__pycache__/apikeys.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8941484b93c08730e5274fb71085d99b1e49555e GIT binary patch literal 227 zcmYk0O$x#=5QS4W7Qq8}0l|$y5uqTW;?iHLRNa)&h7wIOF_SDjl2>x;EnJzp^1-~} z<1xH}cDqG_w)b7t4f|cgzoG!MFc=3b$%T|rN_ve;CzWO|uYNd4GMz!ClTo=p9>!<4 z=|!(*I^Qf8+tZWSM!5UghtVT)i&TSEmZ9>9T+<~KUUBV^W?*kLEvzsB)}pe^3DCI% qkaXo0%N0Y+3s6S#Izj54kVu&kH~zrBdA#C@g3?Pqt>4DFIwoJtA3t*d literal 0 HcmV?d00001 diff --git a/Scripts/Migration_tool/Luma_mass_completions/utils/__pycache__/calls.cpython-310.pyc b/Scripts/Migration_tool/Luma_mass_completions/utils/__pycache__/calls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11e7813c973eeb02714cf5f14c7936d5a22d3d37 GIT binary patch literal 1959 zcmbW2&u`l{6vs)5lI6s9+@vT5WCPRz`{6^PVg+^xx?$;TEL*$Oh+Cx5#n419v1>~j zNiVVB1O>KhZv%Gd24u(nOS0~;f5^&Li;{Q?IiPWo<8 zW)3g2(r+YKU~aI;%533h6jazEtH4-gRaS$s#&8EUmR>_7wB5jYDNK9M_*la0(l?z) z+f5!NjJJeH#A^yR4IDVVnDJO;^)O8by(m<@B=-9-BkRlAf zAjeo)j7)H!zC^#1pD;$dD1MJ3WsiM~jv+r_Z!v2^ULr=%?Py`Q2e~^YCnT;E;~_o- z?+HG2{y@jp#Ohp`UFV}&{7xi#DNMfY?F%D)S0%~7 ze>fV3-62Q{A2Cb^TtgxKk?IYkABBT~Tu;YB%Uad4z7HM6HGC5q!F60ebDxtla^^ae zkf}>4asRFpV;>Q)efv1@Qio>PXaY4^lr6tyV}gMW>zEii$iL8W2k5Y7bXbNC(szKO z%XC;LR%`A-hPk z11H-jwmzeH(=iTFb}y^V$C&5M#5+BYcl-aun?LVz?1r=5AVQ~BEJ2rjID@&J$m?kq zC2hQDcvbvJZFpHtJM5ez2H=)O8EkTz!m?P@0V=xF2;}9~QN&Y?Nlvx9i7j;LYdAt{ z9F)> zSjWTy{-(sCf9dtwY`u2AZcd!5Qu;$@Rq6;P+1+gAEs57vDP3s{JNEc4XsIjJiqY~v zDplbFdO_9FtW5B{l2D0+t>b?@ldZ|&{_$(ekP%M650B2Y5y)Z2bB6Ejin;8Z7PJ&cRX-XQ_U_w2&!$tl^VBo zk>esD?RHS=Y;HI2KYAKCo9(Y3wD!z5=cW6boz|0`ho)i}u}qXp-=_