diff --git a/ConsoleSnippets.py b/ConsoleSnippets.py index 0bf6c11..12a9dc8 100644 --- a/ConsoleSnippets.py +++ b/ConsoleSnippets.py @@ -1,4 +1,3 @@ -from http import client import mimetypes import os import sys @@ -20,23 +19,76 @@ onspring = OnspringClient(url, key) def main(): - match sys.argv[1].lower(): - case 'connect': - PrintCanConnect(onspring) - case 'getapps': - PrintGetApps(onspring) - case 'getappbyid': - PrintGetAppById(onspring, 195) - case 'getappsbyids': - PrintGetAppsByIds(onspring, [195, 240]) - case 'savefile': - PrintSaveFile( - onspring, - 'C:\\Users\\sfree\\OneDrive\\Desktop\\Test Attachment.txt', - 60, - 6989 - ) + if not len(sys.argv) > 1: + print('No valid command given') + return + command = sys.argv[1].lower() + + if command =='connect': + PrintCanConnect(onspring) + + if command == 'getapps': + PrintGetApps(onspring) + + if command == 'getappbyid': + PrintGetAppById(onspring, 195) + + if command == 'getappsbyids': + PrintGetAppsByIds(onspring, [195, 240]) + + if command == 'savefile': + PrintSaveFile( + onspring, + 'C:\\Users\\sfree\\OneDrive\\Desktop\\Test Attachment.txt', + 60, + 6989 + ) + + if command == 'getrecordsbyappid': + PrintGetRecordsByAppId(onspring, 195) + return + + if command == 'getrecordbyid': + PrintGetRecordById(onspring, 195, 5) + return + + if command == 'deleterecord': + PrintDeleteRecord(onspring, 195, sys.argv[2]) + return + + if command == 'getrecordsbyids': + PrintGetRecordsByIds(onspring, 195, [1, 2], [6983, 6984]) + return + + if command == 'queryrecords': + fieldId = 6983 + operator = 'eq' + value = '\'Test Task 5\'' + PrintQueryRecords(onspring, 195, f'{fieldId} {operator} {value}') + return + + if command == 'addrecord': + + fields = [ + RecordFieldValue(6983, 'A New Test Task'), + RecordFieldValue(6984, 'This is a test task.') + ] + + PrintAddOrUpdateRecord(onspring, 195, fields) + return + + if command == 'updaterecord': + + fields = [ + RecordFieldValue(6983, 'Updated'), + RecordFieldValue(6984, 'Updated') + ] + + PrintAddOrUpdateRecord(onspring, 195, fields, 60) + return + + print('No valid command given') return #connectivity @@ -119,6 +171,110 @@ def PrintGetRecordsByAppId(client: OnspringClient, appId: int): print('----') +def PrintGetRecordById(client: OnspringClient, appId: int, recordId: int, fieldIds: list[int]=[], dataFormat: str=DataFormat.Raw.name): + + request = GetRecordByIdRequest( + appId, + recordId, + fieldIds, + dataFormat) + + response = client.GetRecordById(request) + + print(f'Status Code: {response.statusCode}') + print('----') + print(f'AppId: {response.data.appId}') + print(f'RecordId: {response.data.recordId}') + print('--') + + for field in response.data.fields: + print(f'Type: {field.type}') + print(f'FieldId: {field.fieldId}') + print(f'Value: {GetResultValueString(field)}') + print('--') + + print('----') + +def PrintDeleteRecord(client: OnspringClient, appId: int, recordId: int): + + response = client.DeleteRecordById(appId, recordId) + + print(f'Status Code: {response.statusCode}') + print(f'Message: {response.message}') + +def PrintGetRecordsByIds(client: OnspringClient, appId: int, recordIds: list[int], fieldIds: list[int]=[], dataFormat: str=DataFormat.Raw.name): + + request = GetBatchRecordsRequest( + appId, + recordIds, + fieldIds, + dataFormat) + + response = client.GetRecordsByIds(request) + + print(f'Status Code: {response.statusCode}') + print(f'Count: {response.data.count}') + print('----') + + for record in response.data.records: + print(f'AppId: {record.appId}') + print(f'RecordId: {record.recordId}') + print('--') + + for field in record.fields: + print(f'Type: {field.type}') + print(f'FieldId: {field.fieldId}') + print(f'Value: {GetResultValueString(field)}') + print('--') + + print('----') + + +def PrintQueryRecords(client: OnspringClient, appId: int, filter: str, fieldIds: list[int]=[], dataFormat: str=DataFormat.Raw.name, pagingRequest: PagingRequest=PagingRequest(1,50)): + + request = QueryRecordsRequest( + appId, + filter, + fieldIds, + dataFormat, + pagingRequest) + + response = client.QueryRecords(request) + + print(f'Status Code: {response.statusCode}') + print(f'Page Size: {response.data.pageSize}') + print(f'Page Number: {response.data.pageNumber}') + print(f'Total Pages: {response.data.totalPages}') + print(f'Total Records: {response.data.totalRecords}') + print('----') + + for record in response.data.records: + print(f'AppId: {record.appId}') + print(f'RecordId: {record.recordId}') + print('--') + + for field in record.fields: + print(f'Type: {field.type}') + print(f'FieldId: {field.fieldId}') + print(f'Value: {GetResultValueString(field)}') + print('--') + + print('----') + +def PrintAddOrUpdateRecord(client: OnspringClient, appId: int, fields: list[RecordFieldValue], recordId: int=None): + + record = Record( + appId, + fields, + recordId) + + response = client.AddOrUpdateRecord(record) + + print(response.status_code) + print(response.text) + print(response.request.body) + + # files def PrintSaveFile(client: OnspringClient, filePath: str, recordId: int, fieldId: int, notes: str=None, modifiedDate: datetime=None): diff --git a/Models.py b/Models.py index 096836b..2da649c 100644 --- a/Models.py +++ b/Models.py @@ -1,6 +1,8 @@ import datetime import uuid +from requests import Response + from Enums import * from decimal import Decimal from datetime import datetime @@ -9,13 +11,12 @@ from Helpers import parseDate # generic class ApiResponse: - def __init__(self, statusCode=None, data=None, message=None, headers=None, responseText=None): + def __init__(self, statusCode=None, data=None, message=None, raw=None): self.statusCode = statusCode self.isSuccessful = int(statusCode) < 400 self.data = data self.message = message - self.headers=None - self.responseText = responseText + self.raw = raw class PagingRequest: def __init__(self, pageNumber: int, pageSize: int): @@ -218,7 +219,7 @@ class ScoringGroupListValue: # record specific class RecordFieldValue: - def __init__(self, type: str, fieldId: int, value: str): + def __init__(self, fieldId: int, value: str, type: str=None): self.type = type self.fieldId = fieldId self.value = value @@ -389,7 +390,7 @@ class RecordFieldValue: return None class Record: - def __init__(self, appId: int, recordId: int, fields: list[RecordFieldValue]): + def __init__(self, appId: int, fields: list[RecordFieldValue], recordId: int=None): self.appId = appId self.recordId = recordId self.fields = fields @@ -402,10 +403,42 @@ class GetRecordsByAppRequest: self.pageSize = pagingRequest.pageSize self.pageNumber = pagingRequest.pageNumber -class GetRecordsByAppResponse: +class QueryRecordsRequest: + def __init__(self, appId: int, filter: str, fieldIds: list[int]=[], dataFormat: str=DataFormat.Raw.name, pagingRequest: PagingRequest=PagingRequest(1,50)): + self.appId = appId + self.filter = filter + self.fieldIds = fieldIds + self.dataFormat = dataFormat + self.pagingRequest = pagingRequest + +class GetRecordsResponse: def __init__(self, pageNumber: int, pageSize: int, totalPages: int, totalRecords: int, records: list[Record]): self.pageNumber = pageNumber self.pageSize = pageSize self.totalPages = totalPages self.totalRecords = totalRecords - self.records = records \ No newline at end of file + self.records = records + +class GetRecordByIdRequest: + def __init__(self, appId: int, recordId: int, fieldIds: list[int]=[], dataFormat: str=DataFormat.Raw.name): + self.appId = appId + self.recordId = recordId + self.fieldIds = fieldIds + self.dataFormat = dataFormat + +class GetBatchRecordsRequest: + def __init__(self, appId: int, recordIds: list[int], fieldIds: list[int]=[], dataFormat: str=DataFormat.Raw.name): + self.appId = appId + self.recordIds = recordIds + self.fieldIds = fieldIds + self.dataFormat = dataFormat + +class GetBatchRecordsResponse: + def __init__(self, count: int, records: list[Record]): + self.count = count + self.records = records + +class AddOrUpdateRecordResponse: + def __init__(self, id: int, warnings: list[str]=[]): + self.id = id + self.warnings = warnings \ No newline at end of file diff --git a/OnspringClient.py b/OnspringClient.py index 06cab14..f705d22 100644 --- a/OnspringClient.py +++ b/OnspringClient.py @@ -1,3 +1,4 @@ +from urllib import response import requests import json import re @@ -44,15 +45,13 @@ class OnspringClient: return ApiResponse( response.status_code, message='Invalid paging information', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 401: return ApiResponse( response.status_code, message='Unauthorized request', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 200: @@ -81,13 +80,11 @@ class OnspringClient: return ApiResponse( response.status_code, data, - headers=response.headers, - responseText=response.text) + raw=response) return ApiResponse( response.status_code, - headers=response.headers, - responseText=response.text) + raw=response) def GetAppById(self, appId: int): @@ -103,24 +100,21 @@ class OnspringClient: return ApiResponse( response.status_code, message='Unauthorized request', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 403: return ApiResponse( response.status_code, message='Client does not have read access to the app', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 404: return ApiResponse( response.status_code, message='App could not be found', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 200: @@ -136,13 +130,11 @@ class OnspringClient: return ApiResponse( response.status_code, data, - headers=response.headers, - responseText=response.text) + raw=response) return ApiResponse( response.status_code, - headers=response.headers, - responseText=response.text) + raw=response) def GetAppsByIds(self, appIds: list): @@ -169,16 +161,14 @@ class OnspringClient: return ApiResponse( response.status_code, message='Unauthorized request', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 403: return ApiResponse( response.status_code, message='Client does not have read access to the app', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 200: @@ -204,13 +194,11 @@ class OnspringClient: return ApiResponse( response.status_code, data, - headers=response.headers, - responseText=response.text) + raw=response) return ApiResponse( response.status_code, - headers=response.headers, - responseText=response.text) + raw=response) # field methods @@ -228,24 +216,21 @@ class OnspringClient: return ApiResponse( response.status_code, message='Unauthorized request', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 403: return ApiResponse( response.status_code, message='Client does not have read access to the field', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 404: return ApiResponse( response.status_code, message='Field could not be found', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 200: @@ -265,13 +250,11 @@ class OnspringClient: return ApiResponse( response.status_code, data, - headers=response.headers, - responseText=response.text) + raw=response) return ApiResponse( response.status_code, - headers=response.headers, - responseText=response.text) + raw=response) def GetFieldsByIds(self, fieldIds: list): @@ -298,24 +281,21 @@ class OnspringClient: return ApiResponse( response.status_code, message='Unauthorized request', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 403: return ApiResponse( response.status_code, message='Client does not have read access to the field(s)', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 404: return ApiResponse( response.status_code, message='Field(s) could not be found', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 200: @@ -345,13 +325,11 @@ class OnspringClient: return ApiResponse( response.status_code, data, - headers=response.headers, - responseText=response.text) + raw=response) return ApiResponse( response.status_code, - headers=response.headers, - responseText=response.text) + raw=response) def GetFieldsByAppId(self, appId: int, pagingRequest=PagingRequest(1, 50)): @@ -370,16 +348,14 @@ class OnspringClient: return ApiResponse( response.status_code, message='Invalid paging information', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 401: return ApiResponse( response.status_code, message='Unauthorized request', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 200: @@ -412,13 +388,11 @@ class OnspringClient: return ApiResponse( response.status_code, data, - headers=response.headers, - responseText=response.text) + raw=response) return ApiResponse( response.status_code, - headers=response.headers, - responseText=response.text) + raw=response) # file methods @@ -440,32 +414,28 @@ class OnspringClient: return ApiResponse( response.status_code, message='Request is invalid based on underlying data', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 401: return ApiResponse( response.status_code, message='Unauthorized request', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 403: return ApiResponse( response.status_code, message='Client does not have read access to the file', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 404: return ApiResponse( response.status_code, message='File could not be found', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 200: @@ -488,13 +458,11 @@ class OnspringClient: return ApiResponse( response.status_code, data, - headers=response.headers, - responseText=response.text) + raw=response) return ApiResponse( response.status_code, - headers=response.headers, - responseText=response.text) + raw=response) def DeleteFileById(self, recordId: int, fieldId: int, fileId: int): @@ -514,16 +482,14 @@ class OnspringClient: return ApiResponse( response.status_code, message='Request is invalid based on underlying data', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 401: return ApiResponse( response.status_code, message='Unauthorized request', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 403 or response.status_code == 404: @@ -532,29 +498,25 @@ class OnspringClient: return ApiResponse( response.status_code, message=jsonResponse.get('message'), - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 500: return ApiResponse( response.status_code, message='File could not be deleted due to internal error', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 204: return ApiResponse( response.status_code, message='File deleted successfully', - headers=response.headers, - responseText=response.text) + raw=response) return ApiResponse( response.status_code, - headers=response.headers, - responseText=response.text) + raw=response) def GetFileById(self, recordId: int, fieldId: int, fileId: int): @@ -574,16 +536,14 @@ class OnspringClient: return ApiResponse( response.status_code, message='Request is invalid based on underlying data', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 401: return ApiResponse( response.status_code, message='Unauthorized request', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 403 or response.status_code == 404: @@ -592,8 +552,7 @@ class OnspringClient: return ApiResponse( response.status_code, message=jsonResponse.get('message'), - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 200: @@ -607,7 +566,7 @@ class OnspringClient: if result: fileName = re.sub('filename=|\'|;', '', result) else: - fileName = None + fileName = 'OnspringFile' file = File( fileName, @@ -620,14 +579,12 @@ class OnspringClient: return ApiResponse( response.status_code, data, - headers=response.headers, - responseText=response.text) + raw=response) return ApiResponse( response.status_code, - headers=response.headers, - responseText=response.text) + raw=response) def SaveFile(self, saveFileRequest: SaveFileRequest): @@ -659,16 +616,14 @@ class OnspringClient: return ApiResponse( response.status_code, message='Request is invalid based on underlying data', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 401: return ApiResponse( response.status_code, message='Unauthorized request', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code in [403,404,500]: @@ -677,8 +632,7 @@ class OnspringClient: return ApiResponse( response.status_code, message=jsonResponse.get('message'), - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 201: @@ -689,13 +643,11 @@ class OnspringClient: return ApiResponse( response.status_code, data, - headers=response.headers, - responseText=response.text) + raw=response) return ApiResponse( response.status_code, - headers=response.headers, - responseText=response.text) + raw=response) # list methods @@ -720,8 +672,7 @@ class OnspringClient: return ApiResponse( response.status_code, message='Unauthorized request', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code in [403,404]: @@ -730,8 +681,7 @@ class OnspringClient: return ApiResponse( response.status_code, message=jsonResponse.get('message'), - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 201: @@ -743,8 +693,7 @@ class OnspringClient: response.status_code, data, message='New list value successfully added', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 200: @@ -756,13 +705,11 @@ class OnspringClient: response.status_code, data, message='Existing list value successfully updated', - headers=response.headers, - responseText=response.text) + raw=response) return ApiResponse( response.status_code, - headers=response.headers, - responseText=response.text) + raw=response) def DeleteListItem(self, listId: int, itemId: uuid): @@ -778,8 +725,7 @@ class OnspringClient: return ApiResponse( response.status_code, message='Unauthorized request', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 403: @@ -788,29 +734,25 @@ class OnspringClient: return ApiResponse( response.status_code, message=jsonResponse.get('message'), - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 404: return ApiResponse( response.status_code, message='List/item could not be found', - headers=response.headers, - responseText=response.text) + raw=response) if response.status_code == 204: return ApiResponse( response.status_code, message='Item deleted successfully', - headers=response.headers, - responseText=response.text) + raw=response) return ApiResponse( response.status_code, - headers=response.headers, - responseText=response.text) + raw=response) # record methods @@ -818,13 +760,8 @@ class OnspringClient: endpoint = GetRecordsByAppIdEndpoint(self.baseUrl, getRecordsByAppRequest.appId) - # use request object as key-value pairs for params params = getRecordsByAppRequest.__dict__ - - # remove appId from params del params['appId'] - - # convert list of fieldIds to string of comma separated values params['fieldIds'] = ",".join([str(i) for i in params['fieldIds']]) response = requests.request( @@ -833,6 +770,29 @@ class OnspringClient: headers=self.headers, params=params) + if response.status_code == 400: + + return ApiResponse( + response.status_code, + message='Invalid paging information/size of the data requested was too large.', + raw=response) + + if response.status_code == 401: + + return ApiResponse( + response.status_code, + message='Unauthorized request', + raw=response) + + if response.status_code == 403: + + jsonResponse = dict(response.json()) + + return ApiResponse( + response.status_code, + message=jsonResponse.get('message'), + raw=response) + if response.status_code == 200: jsonResponse = dict(response.json()) @@ -847,17 +807,17 @@ class OnspringClient: record = Record( item.get('appId'), - item.get('recordId'), - fields) + fields, + item.get('recordId')) for field in item.get('fieldData'): field = dict(field) field = RecordFieldValue( - field.get('type'), field.get('fieldId'), - field.get('value')) + field.get('value'), + field.get('type')) fields.append(field) @@ -865,7 +825,293 @@ class OnspringClient: records.append(record) - data = GetRecordsByAppResponse( + data = GetRecordsResponse( + jsonResponse.get('pageNumber'), + jsonResponse.get('pageSize'), + jsonResponse.get('totalPages'), + jsonResponse.get('totalRecords'), + records) + + return ApiResponse( + response.status_code, + data, + raw=response) + + return ApiResponse( + response.status_code, + raw=response) + + def GetRecordById(self, getRecordByIdRequest: GetRecordByIdRequest): + + endpoint = GetRecordByIdEndpoint(self.baseUrl, getRecordByIdRequest.appId, getRecordByIdRequest.recordId) + + params = getRecordByIdRequest.__dict__ + del params['appId'] + del params['recordId'] + params['fieldIds'] = ",".join([str(i) for i in params['fieldIds']]) + + response = requests.request( + 'GET', + endpoint, + headers=self.headers, + params=params) + + if response.status_code == 401: + + return ApiResponse( + response.status_code, + message='Unauthorized request', + raw=response) + + if response.status_code == 403: + + jsonResponse = dict(response.json()) + + return ApiResponse( + response.status_code, + message=jsonResponse.get('message'), + raw=response) + + if response.status_code == 404: + + return ApiResponse( + response.status_code, + message='Record could not be found', + raw=response) + + if response.status_code == 200: + + jsonResponse = dict(response.json()) + + fields = [] + + for field in jsonResponse.get('fieldData'): + + field = dict(field) + + field = RecordFieldValue( + field.get('fieldId'), + field.get('value'), + field.get('type')) + + fields.append(field) + + data = Record( + jsonResponse.get('appId'), + fields, + jsonResponse.get('recordId')) + + return ApiResponse( + response.status_code, + data, + raw=response) + + return ApiResponse( + response.status_code, + raw=response) + + def DeleteRecordById(self, appId: int, recordId: int): + + endpoint = DeleteRecordByIdEndpoint(self.baseUrl, appId, recordId) + + response = requests.request( + 'DELETE', + endpoint, + headers=self.headers) + + if response.status_code == 401: + + return ApiResponse( + response.status_code, + message='Unauthorized request', + raw=response) + + if response.status_code == 403: + + jsonResponse = dict(response.json()) + + return ApiResponse( + response.status_code, + message=jsonResponse.get('message'), + raw=response) + + if response.status_code == 404: + + return ApiResponse( + response.status_code, + message='Record could not be found', + raw=response) + + if response.status_code == 204: + + return ApiResponse( + response.status_code, + message='Record deleted successfully', + raw=response) + + return ApiResponse( + response.status_code, + raw=response) + + def GetRecordsByIds(self, getBatchRecordsRequest: GetBatchRecordsRequest): + + endpoint = GetRecordsByIdsEndpoint(self.baseUrl) + + self.headers['Content-Type'] = 'application/json' + + requestData = json.dumps(getBatchRecordsRequest.__dict__) + + response = requests.request( + 'POST', + endpoint, + headers=self.headers, + data=requestData) + + if response.status_code == 400: + + return ApiResponse( + response.status_code, + message='Batch request is invalid/size of the data requested was too large.', + raw=response) + + if response.status_code == 401: + + return ApiResponse( + response.status_code, + message='Unauthorized request', + raw=response) + + if response.status_code == 403: + + jsonResponse = dict(response.json()) + + return ApiResponse( + response.status_code, + message=jsonResponse.get('message'), + raw=response) + + if response.status_code == 200: + + jsonResponse = dict(response.json()) + + records = [] + + for item in jsonResponse.get('items'): + + item = dict(item) + + fields = [] + + record = Record( + item.get('appId'), + fields, + item.get('recordId'),) + + for field in item.get('fieldData'): + + field = dict(field) + + field = RecordFieldValue( + field.get('fieldId'), + field.get('value'), + field.get('type')) + + fields.append(field) + + record.fields = fields + + records.append(record) + + data = GetBatchRecordsResponse( + jsonResponse.get('count'), + records) + + return ApiResponse( + response.status_code, + data, + raw=response) + + return ApiResponse( + response.status_code, + raw=response) + + def QueryRecords(self, queryRecordsRequest: QueryRecordsRequest): + + endpoint = QueryRecordsEndpoint(self.baseUrl) + + self.headers['Content-Type'] = 'application/json' + + requestData = queryRecordsRequest.__dict__ + + params = requestData.get('pagingRequest').__dict__ + + del requestData['pagingRequest'] + + requestData = json.dumps(requestData) + + response = requests.request( + 'POST', + endpoint, + headers=self.headers, + data=requestData, + params=params) + + if response.status_code == 400: + + return ApiResponse( + response.status_code, + message='Query request is invalid/size of the data requested was too large.', + raw=response) + + if response.status_code == 401: + + return ApiResponse( + response.status_code, + message='Unauthorized request', + raw=response) + + if response.status_code == 403: + + jsonResponse = dict(response.json()) + + return ApiResponse( + response.status_code, + message=jsonResponse.get('message'), + raw=response) + + if response.status_code == 200: + + jsonResponse = dict(response.json()) + + records = [] + + for item in jsonResponse.get('items'): + + item = dict(item) + + fields = [] + + record = Record( + item.get('appId'), + fields, + item.get('recordId')) + + for field in item.get('fieldData'): + + field = dict(field) + + field = RecordFieldValue( + field.get('fieldId'), + field.get('value'), + field.get('type')) + + fields.append(field) + + record.fields = fields + + records.append(record) + + data = GetRecordsResponse( jsonResponse.get('pageNumber'), jsonResponse.get('pageSize'), jsonResponse.get('totalPages'), @@ -877,36 +1123,35 @@ class OnspringClient: data, headers=response.headers, responseText=response.text) - - def GetRecordById(self, appId: int, recordId: int): - endpoint = GetRecordByIdEndpoint(self.baseUrl, appId, recordId) + return ApiResponse( + response.status_code, + raw=response) - return - - def DeleteRecordById(self, appId: int, recordId: int): - - endpoint = DeleteRecordByIdEndpoint(self.baseUrl, appId, recordId) - - return - - def GetRecordsByIds(self): - - endpoint = GetRecordsByIdsEndpoint(self.baseUrl) - - return - - def QueryRecords(self): - - endpoint = GetRecordsByIdsEndpoint(self.baseUrl) - - return - - def AddOrUpdateRecord(self): + def AddOrUpdateRecord(self, record: Record): endpoint = AddOrUpdateRecordEndpoint(self.baseUrl) - return + self.headers['Content-Type'] = 'application/json' + + dictFields = [] + + for field in record.fields: + field = field.__dict__ + del field['type'] + dictFields.append(field) + + record.fields = dictFields + + requestData = json.dumps(record.__dict__) + + response = requests.request( + 'PUT', + endpoint, + headers=self.headers, + data=requestData) + + return response def DeleteRecordsByIds(self):