DouglasElliman & other scripts
This commit is contained in:
@ -26,5 +26,14 @@ Workflows Demo
|
||||
* Service Hub is a HUBSPOT product
|
||||
* She got stuck on a workflow
|
||||
* CIP Exam, it should trigger for all learners not just a specific one
|
||||
* But she is getting a trigger for "enter UID" which she doesn't want to do.
|
||||
* But she is getting a trigger for "enter UID" which she doesn't want to do
|
||||
* This should be for everyone.
|
||||
|
||||
## 11/08/2022
|
||||
### Monthly Sync with Georgina
|
||||
* Setup an incredible workflow in Hubspot
|
||||
* NP activation link
|
||||
* Dropped into Hubspot > goes in contact field
|
||||
* Wants to explore gamification and badging
|
||||
* Self gratification
|
||||
* Wants to mimic duolingo
|
||||
|
||||
@ -96,7 +96,7 @@ They feel like this has been talked about for a longtime. Just waiting for a GO
|
||||
* But Winter reports are coming soon around the G2 Reporting Course
|
||||
* Make sure the script is run to remove people from G2 group!
|
||||
|
||||
## 10/24/2022
|
||||
## 10/24/2022o
|
||||
### Weekly Check in
|
||||
* Katlin's numbers/metrics presentation was really good
|
||||
* Everyone super impressed with numbers
|
||||
@ -140,3 +140,16 @@ They feel like this has been talked about for a longtime. Just waiting for a GO
|
||||
* Erin saw a certificate webinar - "How to build out a certificate program?"
|
||||
* Mentioned having an interactive quizzes that are more than just True/False.
|
||||
* Should we add a quiz at the activity with the most or least amount of engagement?
|
||||
|
||||
## 11/07/2022
|
||||
### Erin is now the main POC for the Academy
|
||||
* New email going out this week for the academy
|
||||
* Wants to keep an eye on the numbers
|
||||
* Northpass analytics workflow:
|
||||
* She tries to check daily - quick glimpse
|
||||
* School Activity
|
||||
* Course Progress
|
||||
* Course Popularity
|
||||
* Goal for today: finish all the quizzes for the Profile Performance and Lead Management.
|
||||
* Something that's difficult: Each section has limited information so you can only create so many questions per section, goal of 3 questions per section.
|
||||
* She likes how easy it is to change the questions.
|
||||
|
||||
@ -20,5 +20,5 @@
|
||||
|
||||
* How are they going to change their business model?
|
||||
* 2k per head, minimum 10 people clients
|
||||
* Break that 2k into small chunks and charge x * 10 or x*20 depending on the number of people
|
||||
* Break that 2k into small chunks and charge x * 10 or *20 depending on the number of people
|
||||
|
||||
|
||||
@ -126,3 +126,38 @@ Okta SSO - Ted, Security Team
|
||||
* Tedd is sending the correct information at the first email, but upon the second email, he is sending this SAML stuff, and the wrong email is being sent.
|
||||
* Kaitlyn to write up what Tedd needs to do to get the correct email.
|
||||
|
||||
## 11/07/2022
|
||||
### Weekly Monday Sync
|
||||
* Lizzy's items:
|
||||
* First and foremost - SSO - will Lizzy/Kaitlyn's plan work? It should!
|
||||
* Anyone who is deactivated according to Northpass will not be able to login unless they are reactivated
|
||||
* Kaitlyn suggests we just delete everyone
|
||||
* This way we can start totally fresh with these users
|
||||
* Users without an SSO UID have never been activated or entered Northpass
|
||||
* Active, current users will not be affected at all.
|
||||
* Lizzy is referencing a few "one offs" whose training material is now in a different account? ie. Carmen Macias
|
||||
* Criteria for deletion: Deactivated with no SSO UID
|
||||
* For new people, do we have to wait for their activation to add them to a group?
|
||||
* You could add them on Friday and add them to their group upon invitation.
|
||||
* There is a high "no show" rate, so they need to be added that Monday of the first class.
|
||||
* If these no-shows are removed from Okta, they will be removed from Northpass and/or inable to access Northpass.
|
||||
* Pre-adding them to the group just takes away an extra step on Monday, because when they activate on Monday, they will just slot into their pre-created group.
|
||||
|
||||
### Chapin & Shala from Pal Onboading
|
||||
* Pal Onboaring might be a black box/grey area of who owns it
|
||||
* Chapin works in Pal Engagement
|
||||
* Shala, VP of Marketplace and Ops (Chapin reports to Shala)
|
||||
* Fill rates, engagement, etc is all under their purview.
|
||||
* Pals have a webapp for onboarding training and then a mobile app
|
||||
* Most Pal notifications are via email.
|
||||
* Lizzy had given an update/presentation about Northpass at their ops meeting
|
||||
* This is for the Visit Success team
|
||||
* They fulfill Pals Visits
|
||||
* This generated some interest from various teams, such as the above.
|
||||
|
||||
### Mini/Becca Care Center items
|
||||
* Stef Owens, sowens@papa.com, Group: New Hire 10/31, Course 6.1 & 6.2
|
||||
* What she is not seeing - some course updates
|
||||
* She is going in through Okta, entering Northpass, and clicking "Learner Mode"
|
||||
* Some new course versions and various items are not updating to her end.
|
||||
* Publishing continues to be confusing for Becca
|
||||
|
||||
@ -78,11 +78,12 @@ Kayla personal email: klambie@sympatico.ca
|
||||
* Check whether a certificate is expired and then have them retake the course
|
||||
* These are bonuses to their existing experience
|
||||
|
||||
* [ ] Separate Page with Completed Courses
|
||||
* [ ] Retake Course button leads to certificate pdf
|
||||
* [ ] Retake Course > View Certificate
|
||||
* [ ] Most/all Courses are 1 year expirations - all will be same length
|
||||
* [ ] Learner completes course with milestone, after 1 year, recert course becomes availble
|
||||
* [X] Separate Page with Completed Courses
|
||||
* [X] Retake Course button leads to certificate pdf
|
||||
* [X] Retake Course > View Certificate
|
||||
* [X] Most/all Courses are 1 year expirations - all will be same length
|
||||
* [X] Learner completes course with milestone, after 1 year, recert course becomes availble
|
||||
|
||||
* Last thing: VP of clinical brought up - how easy is it to make content accessible to a group for a sub group?
|
||||
|
||||
|
||||
|
||||
@ -65,4 +65,24 @@
|
||||
## 10/26/2022
|
||||
### Weekly Content Sync
|
||||
* Krystal needs to pull down some content and resources due to recent legistlation.
|
||||
*
|
||||
|
||||
## 11/07/2022
|
||||
### Free Form Courses & Changing the End of Course Screen
|
||||
* Free Form Courses:
|
||||
* Good news! The drivers are referring back to the resources (which is what we wanted)
|
||||
* Bad News! They have to start from the beginning to find their resources.
|
||||
* Will free form courses mess up the end of course screen?
|
||||
* Once they are on the last activity, if there is no EOC screen, where should they go?
|
||||
* Charlie: should the screen "hey, you have new resources available!" exist?
|
||||
* Charlie: They could end up on the course overview page once they complete the resource, so they can review some courses.
|
||||
* Charlie: Scenario: activity 2 out of 3, they hit next, see activity 3, hit continue, they go to the cover page and see that activity 2 and 3 are complete, but 1 aren't.
|
||||
* The text ones with many activities need to be figured out.
|
||||
* Krystal meets with them twice a week, so this needs to happen ASAP.
|
||||
* Charlie promised to mock up two experience before the end of the week so that Krystal can share with the team.
|
||||
* Two functionalities:
|
||||
* 1.Continue buttons _always_ goes back to the course overview page so drivers can select a new activity
|
||||
* 2.End of Course screen is skipped and people go back to the cover page at the end - OR - go back to resources home.
|
||||
* Other feedback?
|
||||
* Yes, video reosurces are not playing nicely with iOS.
|
||||
* After the video is over, it takes over the entire screen and is hard to exit.
|
||||
|
||||
|
||||
@ -137,7 +137,7 @@ Other Hot topics in the Netherlands:
|
||||
* Needs info on events
|
||||
* Upcoming on the global level
|
||||
|
||||
## 9/22/2022
|
||||
## 09/22/2022
|
||||
* Banner Width smaller
|
||||
* Mobile view search bar becomes too short - Phone view
|
||||
* Chevron Carousel is okay for many courses
|
||||
@ -174,7 +174,26 @@ These are new notes to test an update function
|
||||
* Item 4
|
||||
* Item Item
|
||||
|
||||
|----
|
||||
## 11/07/2022
|
||||
### Meeting Heading: Topics for discussion
|
||||
* This is an item
|
||||
* This is another item
|
||||
* Here are some things that need to be done:
|
||||
* Item 1
|
||||
* Item 2
|
||||
* Item 3
|
||||
* Discussion points
|
||||
* More discussion points
|
||||
|
||||
### New Heading
|
||||
This is more text
|
||||
This is yet again more text but longer
|
||||
* To do item
|
||||
* To Three item
|
||||
|
||||
|
||||
|
||||
|
||||
## Tasks
|
||||
|
||||
- [X] Need to Hide some courses for an offline assesment
|
||||
@ -219,3 +238,5 @@ Figma file questions
|
||||
They need more training and enablement They will follow up for Figma files and setting those up for design
|
||||
,[Name](2022-10-17_name.md)
|
||||
|
||||
notes = notes.read()
|
||||
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
import io
|
||||
from datetime import date
|
||||
import markdown
|
||||
from re import search
|
||||
import re
|
||||
# import pypandoc and/or panflute
|
||||
|
||||
rootdir = "/Users/normrasmussen/Documents/Northpass/CustomerNotes/"
|
||||
rootdir = "/Users/normrasmussen/Documents/Northpass/Scripts/API_Notes/SampleNotes/"
|
||||
#meetingstart = "##"
|
||||
#meetingend = "##"
|
||||
#rx = r'{}.*?{}'.format(re.escape(meetingstart), re.escape(meetingend))
|
||||
@ -18,29 +19,26 @@ def findheadings():
|
||||
headingsarray.append(headings)
|
||||
print(headingsarray)
|
||||
|
||||
def pullnotes():
|
||||
date1 = "!*!"
|
||||
#"[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}"
|
||||
date2 = "!@#"
|
||||
#"[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}"
|
||||
#range = r'{}.*?{}'.format(re.escape(date1), re.escape(date2))
|
||||
with open(rootdir + "G2/G2.md", "r") as myfile:
|
||||
file = myfile.read()
|
||||
print(file[file.find(date1)+len(date1):file.rfind(date2)])
|
||||
#print(chunk)
|
||||
|
||||
def pullnotes2():
|
||||
inRecordingMode = False
|
||||
file = "rootdir + Talkspace/Talkspace.md"
|
||||
for line in file:
|
||||
if not inRecordingMode:
|
||||
if line.startswith(r'\d+/\d+/\d'):
|
||||
inRecordingMode = True
|
||||
elif line.startswith(r'\d+/\d+/\d'):
|
||||
inRecordingMode = False
|
||||
else:
|
||||
yield line
|
||||
# From StackOverflow:
|
||||
def noteSections(rootdir):
|
||||
today = date.today()
|
||||
today = today.strftime("%m/%d/%Y")
|
||||
dateregex = "^[0-9]{1,2}\\/[0-9]{1,2}\\/[0-9]{4}$"
|
||||
with open(rootdir+"Flink.md", "r") as f:
|
||||
notes_flag = False
|
||||
notes = ''
|
||||
for line in f:
|
||||
if line.startswith(f"## {today}"):
|
||||
notes_flag = True
|
||||
elif notes_flag:
|
||||
notes += line
|
||||
if not line.strip(): break
|
||||
mdConvert(rootdir, notes)
|
||||
|
||||
def mdConvert(rootdir, notes):
|
||||
conversion = markdown.markdown(notes)
|
||||
print(notes)
|
||||
|
||||
if __name__ == "__main__":
|
||||
pullnotes()
|
||||
noteSections(rootdir)
|
||||
|
||||
|
||||
100
Scripts/API_Tests/assignCoursetoGroups.py
Normal file
100
Scripts/API_Tests/assignCoursetoGroups.py
Normal file
@ -0,0 +1,100 @@
|
||||
import requests
|
||||
|
||||
apiKey = "Bknf8kidbluRfcKu3m3lKoxS8"
|
||||
groups = [
|
||||
"Armonk",
|
||||
"Babylon",
|
||||
"Bayside",
|
||||
"Bedford",
|
||||
"Cutchogue",
|
||||
"East Hampton",
|
||||
"East Setauket",
|
||||
"Executive",
|
||||
"Farmingville",
|
||||
"Franklin Square",
|
||||
"Garden City",
|
||||
"Great Neck",
|
||||
"Greenport",
|
||||
"Hampton Bays",
|
||||
"Hamptons",
|
||||
"Huntington",
|
||||
"Huntington Station",
|
||||
"Katonah",
|
||||
"Locust Valley",
|
||||
"Long Beach",
|
||||
"Long Island",
|
||||
"Long Island City",
|
||||
"Manhasset",
|
||||
"Manhattan",
|
||||
"Massapequa Park",
|
||||
"Mattituck",
|
||||
"Merrick",
|
||||
"Montauk",
|
||||
"New Hyde Park",
|
||||
"New York",
|
||||
"North Fork",
|
||||
"Ocean Beach",
|
||||
"Plainview",
|
||||
"Port Washington",
|
||||
"Queens",
|
||||
"Quogue",
|
||||
"Rockville Centre",
|
||||
"Roslyn",
|
||||
"Sag Harbor",
|
||||
"Sayville",
|
||||
"Scarsdale",
|
||||
"Sea Cliff",
|
||||
"Smithtown",
|
||||
"Southampton",
|
||||
"Syosset",
|
||||
"Westchester",
|
||||
"Westhampton Beach"
|
||||
]
|
||||
|
||||
def findgroupIDs(apiKey, groups):
|
||||
groupuuids = []
|
||||
badGroups = []
|
||||
for group in groups:
|
||||
url = "https://api.northpass.com/v2/groups?filter[name][eq]="
|
||||
headers = {
|
||||
"accept": "application/json",
|
||||
"X-Api-Key": apiKey
|
||||
}
|
||||
response = requests.get(url + group, headers=headers)
|
||||
response = response.json()
|
||||
try:
|
||||
response = response["data"][0]["id"]
|
||||
groupuuids.append(response)
|
||||
except:
|
||||
badGroups.append(group)
|
||||
finally:
|
||||
pass
|
||||
#print(badGroups)
|
||||
#print(groupuuids)
|
||||
assignCourse(apiKey,url, groupuuids)
|
||||
|
||||
def assignCourse(apiKey, url, groupuuids):
|
||||
for group in groupuuids:
|
||||
try:
|
||||
url = f"https://api.northpass.com/v2/groups/{group}/relationships/courses"
|
||||
courseuuid = "10e9b174-cbad-4caa-b0ff-1a7338f2345a"
|
||||
headers = {
|
||||
"accept": "application/json",
|
||||
"content-type": "application/json",
|
||||
"X-Api-Key": apiKey
|
||||
}
|
||||
payload = {"data": [
|
||||
{
|
||||
"type": "courses",
|
||||
"id": courseuuid
|
||||
}
|
||||
]}
|
||||
print(f"Group {group} successfully accepted the course")
|
||||
response = requests.post(url, json=payload, headers=headers)
|
||||
except:
|
||||
print(f"Group {group} does not have that course, yet")
|
||||
finally:
|
||||
pass
|
||||
|
||||
if __name__ == "__main__":
|
||||
findgroupIDs(apiKey, groups)
|
||||
39
Scripts/API_Tests/getuuid_from_email.py
Normal file
39
Scripts/API_Tests/getuuid_from_email.py
Normal file
@ -0,0 +1,39 @@
|
||||
import requests
|
||||
|
||||
baseUrlname = "https://api.northpass.com/v2/people?filter[name][eq]="
|
||||
baseUrlemail = "https://api.northpass.com/v2/people?filter[email][eq]="
|
||||
apiKey = "JRDpCGQ7vSRiva6t5OkWDr5eJ" #This is for G2
|
||||
|
||||
def getfromName(baseUrlname, apiKey):
|
||||
name = "Adam Nelson"
|
||||
url = baseUrlname + f"{name}"
|
||||
headers = {
|
||||
"accept": "*/*",
|
||||
"x-api-key": apiKey,
|
||||
"content-type": "application/json",
|
||||
}
|
||||
response = requests.get(url, headers=headers)
|
||||
response = response.json()
|
||||
print(response)
|
||||
uuid = response["data"][0]["id"]
|
||||
print("Learner ID:" )
|
||||
print(uuid)
|
||||
|
||||
def getfromEmail(baseUrlemail, apiKey):
|
||||
email = "norm+g2test@northpass.com"
|
||||
#email = "aaron.rodgers@corpay.com"
|
||||
url = baseUrlemail + f"{email}"
|
||||
headers = {
|
||||
"accept": "*/*",
|
||||
"x-api-key": apiKey,
|
||||
"content-type": "application/json",
|
||||
}
|
||||
response = requests.get(url, headers=headers)
|
||||
response = response.json()
|
||||
print(response)
|
||||
uuid = response["data"][0]["id"]
|
||||
print("Learner ID:" )
|
||||
|
||||
if __name__ == "__main__":
|
||||
getfromEmail(baseUrlemail, apiKey)
|
||||
#getfromName(baseUrl, apiKey)
|
||||
51
Scripts/G2_Unenroll/fix_unenroll.py
Normal file
51
Scripts/G2_Unenroll/fix_unenroll.py
Normal file
@ -0,0 +1,51 @@
|
||||
import requests
|
||||
import os
|
||||
from datetime import date
|
||||
import pandas as pd
|
||||
|
||||
basecsv = "/Users/normrasmussen/Documents/Northpass/Scripts/G2_Unenroll/g2mca.csv"
|
||||
|
||||
def mainFunc(basecsv):
|
||||
readData = pd.read_csv(
|
||||
basecsv,
|
||||
index_col=False,
|
||||
)
|
||||
try:
|
||||
readData.loc[
|
||||
readData['Course Name'].isin(['G2 Profile Anatomy'])]
|
||||
try:
|
||||
readData.loc[
|
||||
readData['Course Name'].isin('Profile Performance & Lead Management')]
|
||||
except:
|
||||
print("Profile Course Failed")
|
||||
try:
|
||||
readData.loc[
|
||||
readData['Course Name'].isin('Review Tracking & Brand Building')]
|
||||
except:
|
||||
print("Review Course Failed")
|
||||
try:
|
||||
readData.loc[
|
||||
readData['Course Name'].isin('The Review Rundown')]
|
||||
extractedList = readData.loc[
|
||||
readData['Attempt Start'].isnull(),
|
||||
'Learner Name'].tolist()
|
||||
print(extractedList)
|
||||
except:
|
||||
print("Review Rundown failed")
|
||||
# newList = [*set(extractedList)]
|
||||
#findUuids(newList, readData)
|
||||
except:
|
||||
print("Not Working")
|
||||
|
||||
#def findUuids(newList, readData):
|
||||
# try:
|
||||
# for name in newList:
|
||||
# uuidList = readData.loc[
|
||||
# readData['Learner Name'] == name),
|
||||
# 'uuid'.tolist()]
|
||||
# print(uuidList)
|
||||
# except:
|
||||
# print("An error occured")
|
||||
|
||||
if __name__ == "__main__":
|
||||
mainFunc(basecsv)
|
||||
1957
Scripts/G2_Unenroll/g2mca.csv
Normal file
1957
Scripts/G2_Unenroll/g2mca.csv
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
7
Todos.md
7
Todos.md
@ -10,3 +10,10 @@
|
||||
* [ ] (Talkspace) [10/27/2022] Pull report of all users in NPP with activated/deactived status
|
||||
* [ ] (Wildhealth) [10/31/2022] Pass PTO information onto Brian so he knows about the support tickets from Baeleigh & WildHealth.
|
||||
* [ ] (Wildhealth) [10/31/2022] Update Branding on WPG - Abby to send new logo and Norm to figure out colors/branding for styling.
|
||||
* [ ] (Aiim) [11/08/2022] Send DV Accredible Interface with Badging and Certs. Aiim uses accredible.
|
||||
* [ ] (Aiim) [11/08/2022] Create a QBR report for next month's meeting. Analytics, product info. Review usage, etc.
|
||||
* [ ] (Amyris) [11/08/2022] Setup Quarterly Looker Pull of MCA to be sent to Nicole. Year to Date, MCA. Next one in January.
|
||||
* [ ] (SwiftMedical) [11/08/2022] Create Tabs & categories on catalog page - deciding on design.
|
||||
* [ ] (Talkspace) [11/08/2022] If a course a is at 100% and is a 1099 course, remove from dashboard
|
||||
* [ ] (Talkspace) [11/08/2022] Remove Footer Completely no Dash no LPs
|
||||
* [ ] (Talkspace) [11/08/2022] Add Training@talkspace.com to footer
|
||||
|
||||
Reference in New Issue
Block a user