diff --git a/meraki/api/camera.py b/meraki/api/camera.py index f05a3d4..f1c97b3 100644 --- a/meraki/api/camera.py +++ b/meraki/api/camera.py @@ -5,7 +5,7 @@ class Camera(object): def __init__(self, session): super(Camera, self).__init__() self._session = session - + def getDeviceCameraAnalyticsLive(self, serial: str): @@ -24,7 +24,7 @@ def getDeviceCameraAnalyticsLive(self, serial: str): resource = f'/devices/{serial}/camera/analytics/live' return self._session.get(metadata, resource) - + def getDeviceCameraAnalyticsOverview(self, serial: str, **kwargs): @@ -56,7 +56,7 @@ def getDeviceCameraAnalyticsOverview(self, serial: str, **kwargs): params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} return self._session.get(metadata, resource, params) - + def getDeviceCameraAnalyticsRecent(self, serial: str, **kwargs): @@ -85,7 +85,7 @@ def getDeviceCameraAnalyticsRecent(self, serial: str, **kwargs): params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} return self._session.get(metadata, resource, params) - + def getDeviceCameraAnalyticsZones(self, serial: str): @@ -104,7 +104,7 @@ def getDeviceCameraAnalyticsZones(self, serial: str): resource = f'/devices/{serial}/camera/analytics/zones' return self._session.get(metadata, resource) - + def getDeviceCameraAnalyticsZoneHistory(self, serial: str, zoneId: str, **kwargs): @@ -139,7 +139,7 @@ def getDeviceCameraAnalyticsZoneHistory(self, serial: str, zoneId: str, **kwargs params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} return self._session.get(metadata, resource, params) - + def getDeviceCameraCustomAnalytics(self, serial: str): @@ -158,7 +158,7 @@ def getDeviceCameraCustomAnalytics(self, serial: str): resource = f'/devices/{serial}/camera/customAnalytics' return self._session.get(metadata, resource) - + def updateDeviceCameraCustomAnalytics(self, serial: str, **kwargs): @@ -185,7 +185,7 @@ def updateDeviceCameraCustomAnalytics(self, serial: str, **kwargs): payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.put(metadata, resource, payload) - + def generateDeviceCameraSnapshot(self, serial: str, **kwargs): @@ -211,7 +211,7 @@ def generateDeviceCameraSnapshot(self, serial: str, **kwargs): payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.post(metadata, resource, payload) - + def getDeviceCameraQualityAndRetention(self, serial: str): @@ -230,7 +230,7 @@ def getDeviceCameraQualityAndRetention(self, serial: str): resource = f'/devices/{serial}/camera/qualityAndRetention' return self._session.get(metadata, resource) - + def updateDeviceCameraQualityAndRetention(self, serial: str, **kwargs): @@ -271,7 +271,7 @@ def updateDeviceCameraQualityAndRetention(self, serial: str, **kwargs): payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.put(metadata, resource, payload) - + def getDeviceCameraSense(self, serial: str): @@ -290,7 +290,7 @@ def getDeviceCameraSense(self, serial: str): resource = f'/devices/{serial}/camera/sense' return self._session.get(metadata, resource) - + def updateDeviceCameraSense(self, serial: str, **kwargs): @@ -318,7 +318,7 @@ def updateDeviceCameraSense(self, serial: str, **kwargs): payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.put(metadata, resource, payload) - + def getDeviceCameraSenseObjectDetectionModels(self, serial: str): @@ -337,7 +337,7 @@ def getDeviceCameraSenseObjectDetectionModels(self, serial: str): resource = f'/devices/{serial}/camera/sense/objectDetectionModels' return self._session.get(metadata, resource) - + def getDeviceCameraVideoSettings(self, serial: str): @@ -356,7 +356,7 @@ def getDeviceCameraVideoSettings(self, serial: str): resource = f'/devices/{serial}/camera/video/settings' return self._session.get(metadata, resource) - + def updateDeviceCameraVideoSettings(self, serial: str, **kwargs): @@ -381,7 +381,7 @@ def updateDeviceCameraVideoSettings(self, serial: str, **kwargs): payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.put(metadata, resource, payload) - + def getDeviceCameraVideoLink(self, serial: str, **kwargs): @@ -406,7 +406,7 @@ def getDeviceCameraVideoLink(self, serial: str, **kwargs): params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} return self._session.get(metadata, resource, params) - + def getDeviceCameraWirelessProfiles(self, serial: str): @@ -425,7 +425,7 @@ def getDeviceCameraWirelessProfiles(self, serial: str): resource = f'/devices/{serial}/camera/wirelessProfiles' return self._session.get(metadata, resource) - + def updateDeviceCameraWirelessProfiles(self, serial: str, ids: dict): @@ -450,7 +450,7 @@ def updateDeviceCameraWirelessProfiles(self, serial: str, ids: dict): payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.put(metadata, resource, payload) - + def getNetworkCameraQualityRetentionProfiles(self, networkId: str): @@ -469,7 +469,7 @@ def getNetworkCameraQualityRetentionProfiles(self, networkId: str): resource = f'/networks/{networkId}/camera/qualityRetentionProfiles' return self._session.get(metadata, resource) - + def createNetworkCameraQualityRetentionProfile(self, networkId: str, name: str, **kwargs): @@ -503,7 +503,7 @@ def createNetworkCameraQualityRetentionProfile(self, networkId: str, name: str, payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.post(metadata, resource, payload) - + def getNetworkCameraQualityRetentionProfile(self, networkId: str, qualityRetentionProfileId: str): @@ -524,7 +524,7 @@ def getNetworkCameraQualityRetentionProfile(self, networkId: str, qualityRetenti resource = f'/networks/{networkId}/camera/qualityRetentionProfiles/{qualityRetentionProfileId}' return self._session.get(metadata, resource) - + def updateNetworkCameraQualityRetentionProfile(self, networkId: str, qualityRetentionProfileId: str, **kwargs): @@ -560,7 +560,7 @@ def updateNetworkCameraQualityRetentionProfile(self, networkId: str, qualityRete payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.put(metadata, resource, payload) - + def deleteNetworkCameraQualityRetentionProfile(self, networkId: str, qualityRetentionProfileId: str): @@ -581,7 +581,7 @@ def deleteNetworkCameraQualityRetentionProfile(self, networkId: str, qualityRete resource = f'/networks/{networkId}/camera/qualityRetentionProfiles/{qualityRetentionProfileId}' return self._session.delete(metadata, resource) - + def getNetworkCameraSchedules(self, networkId: str): @@ -600,7 +600,7 @@ def getNetworkCameraSchedules(self, networkId: str): resource = f'/networks/{networkId}/camera/schedules' return self._session.get(metadata, resource) - + def createNetworkCameraWirelessProfile(self, networkId: str, name: str, ssid: dict, **kwargs): @@ -627,7 +627,7 @@ def createNetworkCameraWirelessProfile(self, networkId: str, name: str, ssid: di payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.post(metadata, resource, payload) - + def getNetworkCameraWirelessProfiles(self, networkId: str): @@ -646,7 +646,7 @@ def getNetworkCameraWirelessProfiles(self, networkId: str): resource = f'/networks/{networkId}/camera/wirelessProfiles' return self._session.get(metadata, resource) - + def getNetworkCameraWirelessProfile(self, networkId: str, wirelessProfileId: str): @@ -667,7 +667,7 @@ def getNetworkCameraWirelessProfile(self, networkId: str, wirelessProfileId: str resource = f'/networks/{networkId}/camera/wirelessProfiles/{wirelessProfileId}' return self._session.get(metadata, resource) - + def updateNetworkCameraWirelessProfile(self, networkId: str, wirelessProfileId: str, **kwargs): @@ -696,7 +696,7 @@ def updateNetworkCameraWirelessProfile(self, networkId: str, wirelessProfileId: payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.put(metadata, resource, payload) - + def deleteNetworkCameraWirelessProfile(self, networkId: str, wirelessProfileId: str): @@ -717,7 +717,7 @@ def deleteNetworkCameraWirelessProfile(self, networkId: str, wirelessProfileId: resource = f'/networks/{networkId}/camera/wirelessProfiles/{wirelessProfileId}' return self._session.delete(metadata, resource) - + def getOrganizationCameraBoundariesAreasByDevice(self, organizationId: str, **kwargs): @@ -748,7 +748,7 @@ def getOrganizationCameraBoundariesAreasByDevice(self, organizationId: str, **kw params.pop(k.strip()) return self._session.get(metadata, resource, params) - + def getOrganizationCameraBoundariesLinesByDevice(self, organizationId: str, **kwargs): @@ -779,7 +779,7 @@ def getOrganizationCameraBoundariesLinesByDevice(self, organizationId: str, **kw params.pop(k.strip()) return self._session.get(metadata, resource, params) - + def getOrganizationCameraCustomAnalyticsArtifacts(self, organizationId: str): @@ -798,7 +798,7 @@ def getOrganizationCameraCustomAnalyticsArtifacts(self, organizationId: str): resource = f'/organizations/{organizationId}/camera/customAnalytics/artifacts' return self._session.get(metadata, resource) - + def createOrganizationCameraCustomAnalyticsArtifact(self, organizationId: str, **kwargs): @@ -823,7 +823,7 @@ def createOrganizationCameraCustomAnalyticsArtifact(self, organizationId: str, * payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.post(metadata, resource, payload) - + def getOrganizationCameraCustomAnalyticsArtifact(self, organizationId: str, artifactId: str): @@ -844,7 +844,7 @@ def getOrganizationCameraCustomAnalyticsArtifact(self, organizationId: str, arti resource = f'/organizations/{organizationId}/camera/customAnalytics/artifacts/{artifactId}' return self._session.get(metadata, resource) - + def deleteOrganizationCameraCustomAnalyticsArtifact(self, organizationId: str, artifactId: str): @@ -865,7 +865,7 @@ def deleteOrganizationCameraCustomAnalyticsArtifact(self, organizationId: str, a resource = f'/organizations/{organizationId}/camera/customAnalytics/artifacts/{artifactId}' return self._session.delete(metadata, resource) - + def getOrganizationCameraDetectionsHistoryByBoundaryByInterval(self, organizationId: str, boundaryIds: list, total_pages=1, direction='next', **kwargs): @@ -901,7 +901,7 @@ def getOrganizationCameraDetectionsHistoryByBoundaryByInterval(self, organizatio params.pop(k.strip()) return self._session.get_pages(metadata, resource, params, total_pages, direction) - + def getOrganizationCameraOnboardingStatuses(self, organizationId: str, **kwargs): @@ -933,7 +933,7 @@ def getOrganizationCameraOnboardingStatuses(self, organizationId: str, **kwargs) params.pop(k.strip()) return self._session.get(metadata, resource, params) - + def updateOrganizationCameraOnboardingStatuses(self, organizationId: str, **kwargs): @@ -959,7 +959,7 @@ def updateOrganizationCameraOnboardingStatuses(self, organizationId: str, **kwar payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.put(metadata, resource, payload) - + def getOrganizationCameraPermissions(self, organizationId: str): @@ -978,7 +978,7 @@ def getOrganizationCameraPermissions(self, organizationId: str): resource = f'/organizations/{organizationId}/camera/permissions' return self._session.get(metadata, resource) - + def getOrganizationCameraPermission(self, organizationId: str, permissionScopeId: str): @@ -999,7 +999,7 @@ def getOrganizationCameraPermission(self, organizationId: str, permissionScopeId resource = f'/organizations/{organizationId}/camera/permissions/{permissionScopeId}' return self._session.get(metadata, resource) - + def getOrganizationCameraRoles(self, organizationId: str): @@ -1018,7 +1018,7 @@ def getOrganizationCameraRoles(self, organizationId: str): resource = f'/organizations/{organizationId}/camera/roles' return self._session.get(metadata, resource) - + def createOrganizationCameraRole(self, organizationId: str, name: str, **kwargs): @@ -1046,7 +1046,7 @@ def createOrganizationCameraRole(self, organizationId: str, name: str, **kwargs) payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.post(metadata, resource, payload) - + def getOrganizationCameraRole(self, organizationId: str, roleId: str): @@ -1067,7 +1067,7 @@ def getOrganizationCameraRole(self, organizationId: str, roleId: str): resource = f'/organizations/{organizationId}/camera/roles/{roleId}' return self._session.get(metadata, resource) - + def deleteOrganizationCameraRole(self, organizationId: str, roleId: str): @@ -1088,7 +1088,7 @@ def deleteOrganizationCameraRole(self, organizationId: str, roleId: str): resource = f'/organizations/{organizationId}/camera/roles/{roleId}' return self._session.delete(metadata, resource) - + def updateOrganizationCameraRole(self, organizationId: str, roleId: str, **kwargs): @@ -1118,4 +1118,3 @@ def updateOrganizationCameraRole(self, organizationId: str, roleId: str, **kwarg payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} return self._session.put(metadata, resource, payload) - diff --git a/meraki/rest_session.py b/meraki/rest_session.py index 697ff4e..da31987 100644 --- a/meraki/rest_session.py +++ b/meraki/rest_session.py @@ -6,12 +6,52 @@ from datetime import datetime import requests +from requests.utils import to_key_val_list +from requests.compat import basestring, urlencode from meraki.__init__ import __version__ from meraki.common import * from meraki.config import * +def encode_params(_, data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, "read"): + return data + elif hasattr(data, "__iter__"): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, "__iter__"): + vs = [vs] + for v in vs: + if v is not None and not isinstance(v, dict): + result.append( + ( + k.encode("utf-8") if isinstance(k, str) else k, + v.encode("utf-8") if isinstance(v, str) else v, + ) + ) + else: + for k_1, v_1 in v.items(): + result.append( + ( + (k + k_1).encode("utf-8") if isinstance(k, str) else k_1, + (v + v_1).encode("utf-8") if isinstance(v, str) else v_1, + ) + ) + return urlencode(result, doseq=True) + else: + return data + +requests.models.RequestEncodingMixin._encode_params = encode_params + def user_agent_extended(be_geo_id, caller): # Generate extended portion of the User-Agent user_agent = dict()