You are viewing an old version of this page. View the current version.
Compare with Current
View Page History
« Previous
Version 5
Next »
Use Case 1: user and items thing
Use case 1.1: Which item is associated with which user?
input:
- user email or
- user firstname and lastname
Per API: Search for all items of contact x, i) by (system) email address, ii) by contact names.
- get
/sensors/device/getItemsOfContact/{contactEmail}
OR - get
/sensors/contacts/getContactsByName/{firstName}/{lastName}
--> email address will be output, then go on with step 1
Use case 1.2: Which items have the user x with a certain role?
input:
- von use case 1.1
- get
/sensors/device/getItemsOfContact/{contactEmail}
OR - get
/sensors/contacts/getContactsByName/{firstName}/{lastName}
--> email address as output then go to step 1
- get
/sensors/contacts/getAllContactRoles
--> pick out which ID is related to which role type (e.g. Data scientist="id": 29] - filter (role) ID-based
- PI==True --> put to list
- PI==False --> go on
- ...
'''
basic documentation of sensor.awi.de REST-API can be found here: https://sensor.awi.de/api/
'''
## necessary libraries
import json
import requests
import datetime
## PROD
#sensorURL<- "https://sensor.awi.de/rest/sensors/"
## SANDBOX
sensorURL <- "https://sandbox.sensor.awi.de/rest/sensors/"
## + ================================ | xxx | ================================ + ##
'''
USE CASE 1: We are looking for a list of items that have a certain user in their contact list.
1.1.a We know the contact email address (as in sensor.awi.de) of the user.
'''
## + ================================ | xxx | ================================ + ##
email = 'marcel.nicolaus@awi.de'
## create link for API call
link = sensorURL + "device/getItemsOfContact/" + email
## calling api
answer = requests.get(link)
## the content itself, read as a json object
fullList = json.loads(answer.content)
## status of request (see httpstatuses.com/)
answer.status_code
## since the result can be 0 items, 1 item, and >1 items , we filter the item ids according the number of items and write to a list
if len(fullList) == 0:
itemList = []
elif len(fullList) == 1:
itemList = [fullList[0]['id']]
else:
itemList = [i['id'] for i in fullList]
## there we go:
print(itemList)
## + ================================ | xxx | ================================ + ##
'''
USE CASE 1: We are looking for a list of items that have a certain user in their contact list.
1.1.b We know the last name (and if necessary the first name) of the user. Aim: get a single email address.
'''
## + ================================ | xxx | ================================ + ##
## creation of the API call
link = sensorURL + 'contacts/getAllSystemContacts'
## CASE: unique last name or no contact found
## variables
lastName = 'Gerchow'
## calling api
answer = requests.get(link)
x = json.loads(answer.content)
## loop over entire list
for a in x:
if a['lastName'] == lastName:
print(a['email'])
## CASE: non-unique last name or no contact
## variables
lastName = 'Nicolaus'
firstName = 'Rita'
## calling api
answer = requests.get(link)
x = json.loads(answer.content)
## loop over entire list
for a in x:
if a['lastName'] == lastName and a['firstName'] == firstName:
print(a['email'])
## + ================================ | xxx | ================================ + ##
'''
USE CASE 1: We are looking for a list of items that have a certain user in their contact list.
1.2. We have info from 1.1 but need that user only with a certain contact role (e.g. 'Principal Investigator').
'''
## + ================================ | xxx | ================================ + ##
## which user should be searched?
## remember 'email' from 1.1?
#email = 'sandra.tippenhauer@awi.de'
## what role should be filtered?
inputRole = 'Principal Investigator'
inputRole = 'Editor'
## create empty lists
lstID, lstURN = [], []
## recycling of itemList from 1.1
for item in itemList:
link = sensorURL + "contacts/getDeviceContacts/" + str(item)
answer = requests.get(link)
x = json.loads(answer.content)
## create dictionaries to map uuids to vocables
dictRoles = {}
dictAccounts = {}
for i in x:
if isinstance(i['contact'], dict):
dictAccounts[i['contact']['@uuid']] = i['contact']['email']
if isinstance(i['vocable'], dict):
dictRoles[i['vocable']['@uuid']] = i['vocable']['generalName']
## extracting from item
user, role = [], []
for i in x:
if isinstance(i['vocable'], dict):
role.append(i['vocable']['@uuid'])
elif isinstance(i['vocable'], str):
role.append(i['vocable'])
else:
pass
##
if isinstance(i['contact'], dict):
user.append(i['contact']['@uuid'])
elif isinstance(i['contact'], str):
user.append(i['contact'])
else:
pass
## merging info from item and mapping dict
for i in range(len(user)): ## <-- could improve!!!
if dictRoles[role[i]] == inputRole and dictAccounts[user[i]] == email:
lstID.append(item)
lstURN.append(x[0]['item']['urn'])
## neat output as some sort of report ...
print(json.dumps({'user':email,
'timeOfQuery':datetime.datetime.isoformat(datetime.datetime.utcnow()),
'role':inputRole,
'urn':lstURN,
'id':lstID})
)
## ... or just as a single list if item IDs
print(lstID)
## eof
## '''
## basic documentation of sensor.awi.de REST-API can be found here: https://sensor.awi.de/api/
## '''
settingUpThings <- function(x){
mirror <- 'https://ftp.gwdg.de/pub/misc/cran'
newPackages <- x[!(x %in% installed.packages()[,'Package'])]
if(length(newPackages)){
install.packages(newPackages, dep = TRUE, repos = mirror)
}
lapply(x, library, character.only = TRUE, logical.return = TRUE)
}
libsToBeLoaded <- c('jsonlite', 'plyr', 'lubridate', 'httr')
settingUpThings(libsToBeLoaded)
## PROD
#sensorURL<- "https://sensor.awi.de/rest/sensors/"
## SANDBOX
sensorURL <- "https://sandbox.sensor.awi.de/rest/sensors/"
## + ================================ | xxx | ================================ + ##
## '''
## USE CASE 1: We are looking for a list of items that have a certain user in their contact list.
## 1.1.a We know the contact email address (as in sensor.awi.de) of the user.
## '''
## + ================================ | xxx | ================================ + ##
email <- 'marcel.nicolaus@awi.de'
## create link for API call
link <- paste0(sensorURL, "device/getItemsOfContact/", email)
## calling api
answer <- GET(link)
## the content itself, read as a json object
fullList <- content(answer, as = 'parsed')
## status of request (see httpstatuses.com/)
answer$status_code
## since the result can be 0 items, 1 item, and >1 items , we filter the item ids according the number of items and write to a list
if (length(fullList) == 0){
itemList <- list()
} else if (length(fullList) == 1){
itemList <- list(fullList[[1]]$id)
} else {
itemList <- list()
for (i in seq_along(fullList)){
itemList[[i]] <- fullList[[i]]$id
}
}
## there we go:
print(itemList)
## + ================================ | xxx | ================================ + ##
## '''
## USE CASE 1: We are looking for a list of items that have a certain user in their contact list.
## 1.1.b We know the last name (and if necessary the first name) of the user. Aim: get a single email address.
## '''
## + ================================ | xxx | ================================ + ##
## creation of the API call
link <- paste0(sensorURL,'contacts/getAllSystemContacts')
## CASE: unique last name or no contact found
## variables
lastName <- 'Gerchow'
## calling api
answer <- GET(link)
x <- content(answer, as = 'parsed')
for (i in seq_along(x)){
if ( is.null(x[[i]]$lastName) == FALSE && x[[i]]$lastName == lastName ) {
print(x[[i]]$email)
}
}
## CASE: non-unique last name or no contact
## variables
lastName <- 'Nicolaus'
firstName <- 'Rita'
## calling api
answer <- GET(link)
x <- content(answer, as = 'parsed')
## loop over entire list
for (i in seq_along(x)){
if ( is.null(x[[i]]$lastName) == FALSE && x[[i]]$lastName == lastName && x[[i]]$firstName == firstName ) {
print(x[[i]]$email)
}
}
## + ================================ | xxx | ================================ + ##
## '''
## USE CASE 1: We are looking for a list of items that have a certain user in their contact list.
## 1.2. We have info from 1.1 but need that user only with a certain contact role (e.g. 'Principal Investigator').
## '''
## + ================================ | xxx | ================================ + ##
## which user should be searched?
## remember 'email' from 1.1?
#email = 'sandra.tippenhauer@awi.de'
## what role should be filtered?
inputRole <- 'Principal Investigator'
inputRole <- 'Editor'
lstID <- NULL
lstURN <- NULL
for (item in seq_along(itemList)){
link <- paste0(sensorURL, "contacts/getDeviceContacts/", itemList[[item]])
print(link)
answer <- GET(link)
x <- content(answer, as = 'parsed')
## create dictionaries to map uuids to vocables
dictRoles <- NULL
dictAccounts <- NULL
for (i in seq_along(x)){
## print(x[[i]])
if (is.list(x[[i]]$contact) == TRUE){
dictAccounts[x[[i]]$contact$'@uuid'] <- x[[i]]$contact$email
}
if (is.list(x[[i]]$vocable) == TRUE){
dictRoles[x[[i]]$vocable$'@uuid'] <- x[[i]]$vocable$generalName
}
}
## extracting from item
user <- NULL
role <- NULL
for (i in seq_along(x)){
if (is.list(x[[i]]$vocable) == TRUE){
role <- append(role, x[[i]]$vocable$'@uuid')
} else {
role <- append(role, x[[i]]$vocable)
}
##
if (is.list(x[[i]]$contact) == TRUE){
user <- append(user, x[[i]]$contact$'@uuid')
} else {
user <- append(user, x[[i]]$contact)
}
}
## merging info from item and mapping dict
for (i in seq_along(x)){
if ( dictRoles[role[i]] == inputRole && dictAccounts[user[i]] == email){
lstID <- append(lstID, item)
lstURN <- append(lstURN, x[[1]]$item$urn)
}
}
}
## neat output as some sort of report ...
print(
toJSON(list(user = email,
timeOfQuery = now(tz = "GMT"),
role = inputRole,
urn = lstURN,
id = lstID
)
)
)
## ... or just as a single list if item IDs
print(lstID)
## eof