climify_api 1.0.27__tar.gz → 1.0.29__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. {climify_api-1.0.27 → climify_api-1.0.29}/PKG-INFO +1 -1
  2. {climify_api-1.0.27 → climify_api-1.0.29}/pyproject.toml +2 -2
  3. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/__init__.py +2 -2
  4. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/metering_points_id/get.py +71 -29
  5. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/models/__init__.py +28 -2
  6. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api.egg-info/PKG-INFO +1 -1
  7. {climify_api-1.0.27 → climify_api-1.0.29}/LICENSE +0 -0
  8. {climify_api-1.0.27 → climify_api-1.0.29}/MANIFEST.in +0 -0
  9. {climify_api-1.0.27 → climify_api-1.0.29}/README.md +0 -0
  10. {climify_api-1.0.27 → climify_api-1.0.29}/setup.cfg +0 -0
  11. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/ApiController.py +0 -0
  12. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/REST.py +0 -0
  13. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/api_client.py +0 -0
  14. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/PathBase.py +0 -0
  15. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/__init__.py +0 -0
  16. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/ApiController.py +0 -0
  17. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/__init__.py +0 -0
  18. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/__init__.py +0 -0
  19. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/buildings_id/__init__.py +0 -0
  20. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/buildings_id/get.py +0 -0
  21. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/buildings_id_devices/__init__.py +0 -0
  22. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/buildings_id_devices/get.py +0 -0
  23. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/buildings_id_metering_points/__init__.py +0 -0
  24. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/buildings_id_metering_points/get.py +0 -0
  25. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/devices_id/__init__.py +0 -0
  26. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/devices_id/get.py +0 -0
  27. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/feedback_forms_id_locations_id_responses/__init__.py +0 -0
  28. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/feedback_forms_id_locations_id_responses/get.py +0 -0
  29. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/locations_id/__init__.py +0 -0
  30. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/locations_id/get.py +0 -0
  31. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/locations_id_change_temperature/__init__.py +0 -0
  32. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/locations_id_change_temperature/post.py +0 -0
  33. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/locations_id_devices/__init__.py +0 -0
  34. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/locations_id_devices/get.py +0 -0
  35. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/locations_id_sensor_values/__init__.py +0 -0
  36. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/locations_id_sensor_values/get.py +0 -0
  37. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/maps_id/__init__.py +0 -0
  38. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/maps_id/get.py +0 -0
  39. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/maps_id_devices/__init__.py +0 -0
  40. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/maps_id_devices/get.py +0 -0
  41. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/metering_points_id/__init__.py +0 -0
  42. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/organisations_id/__init__.py +0 -0
  43. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/organisations_id/get.py +0 -0
  44. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/organisations_id_devices/__init__.py +0 -0
  45. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/organisations_id_devices/get.py +0 -0
  46. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/resources/__init__.py +0 -0
  47. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/apis/v1/paths/resources/get.py +0 -0
  48. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/auth.py +0 -0
  49. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/configuration.py +0 -0
  50. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/exceptions.py +0 -0
  51. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api/schemas.py +0 -0
  52. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api.egg-info/SOURCES.txt +0 -0
  53. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api.egg-info/dependency_links.txt +0 -0
  54. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api.egg-info/requires.txt +0 -0
  55. {climify_api-1.0.27 → climify_api-1.0.29}/src/climify_api.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: climify_api
3
- Version: 1.0.27
3
+ Version: 1.0.29
4
4
  Summary: A wrapper library for the Climify REST API
5
5
  Author-email: Climify Aps <info@climify.com>
6
6
  Project-URL: Homepage, https://gitlab.climify.com/climify/python-api-lib
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "climify_api"
9
- version = "1.0.27"
9
+ version = "1.0.29"
10
10
  keywords=['Climify','Environmental engineering']
11
11
  authors = [
12
12
  { name="Climify Aps", email="info@climify.com" },
@@ -50,7 +50,7 @@ Homepage = "https://gitlab.climify.com/climify/python-api-lib"
50
50
  Issues = "https://gitlab.climify.com/climify/python-api-lib/-/issues"
51
51
 
52
52
  [tool.bumpver]
53
- current_version = "1.0.27"
53
+ current_version = "1.0.29"
54
54
  version_pattern = "MAJOR.MINOR.PATCH"
55
55
  commit_message = "Bump version {old_version} -> {new_version}"
56
56
  commit = true
@@ -8,12 +8,12 @@
8
8
 
9
9
  Provides a REST endpoints for Climify applications and 3rd party solutions. # noqa: E501
10
10
 
11
- The version of the OpenAPI document: 1.0.27
11
+ The version of the OpenAPI document: 1.0.29
12
12
  Generated by: https://openapi-generator.tech
13
13
  """
14
14
 
15
15
  __name__ = 'climify_api'
16
- __version__ = "1.0.27"
16
+ __version__ = "1.0.29"
17
17
 
18
18
  # import ApiClient
19
19
  from climify_api.api_client import ApiClient
@@ -112,39 +112,81 @@ class GetMeteringPointValuesById(PathBase):
112
112
  subRequestToTime = to_datetime
113
113
  subRequestFromTime = max(subRequestToTime - relativedelta(months=3), from_datetime)
114
114
 
115
- request = usedPath +\
116
- f"?dateTimeFrom={subRequestFromTime.replace(tzinfo=None).isoformat()+'Z'}" +\
117
- f"&dateTimeTo={subRequestToTime.replace(tzinfo=None).isoformat()+'Z'}"
118
-
119
- response = self.api_client.call_api(
120
- resource_path=request,
121
- method='GET',
122
- access_token=access_token,
123
- stream=stream,
124
- timeout=timeout
125
- )
126
-
127
- # Format response
128
- if not 200 <= response.status <= 299:
129
- raise ClimifyApiException(
130
- status=response.status,
131
- reason=response.reason,
132
- api_response=response
115
+ while subRequestFromTime >= from_datetime:
116
+ query_parameters = []
117
+ for name, value in (
118
+ ('dateTimeFrom', subRequestFromTime.replace(tzinfo=None).isoformat()+'Z' if subRequestFromTime else None), # Sets timezone to None, to remove +HH:MM
119
+ ('dateTimeTo', subRequestToTime.replace(tzinfo=None).isoformat()+'Z' if subRequestToTime else None)
120
+ ):
121
+ if value:
122
+ query_parameters.append(f"{name}={value}")
123
+
124
+ if len(query_parameters) > 0:
125
+ requests.append("?" + "&".join(query_parameters))
126
+
127
+ if subRequestFromTime == from_datetime:
128
+ break
129
+
130
+ subRequestToTime = subRequestFromTime - relativedelta(seconds=1)
131
+ subRequestFromTime = max(subRequestToTime - relativedelta(months=3), from_datetime)
132
+
133
+ bodies = []
134
+ for request in requests:
135
+ requestPath = usedPath+request
136
+ response = self.api_client.call_api(
137
+ resource_path=requestPath,
138
+ method='GET',
139
+ access_token=access_token,
140
+ stream=stream,
141
+ timeout=timeout
133
142
  )
134
-
135
- if skip_deserialization:
136
- return ClimifyApiResponseWithoutDeserialization(response=response)
143
+
144
+ # Format response
145
+ if not 200 <= response.status <= 299:
146
+ raise ClimifyApiException(
147
+ status=response.status,
148
+ reason=response.reason,
149
+ api_response=response
150
+ )
137
151
 
138
- # Deserialize response
139
- deserialized_body = parse_raw_as(List[SensorDataExtDto], response.data)
140
- if as_dataframe:
141
- deserialized_body = convert_values_to_dataFrame(deserialized_body)
152
+ if skip_deserialization:
153
+ bodies.append(response.data)
154
+ continue
155
+
156
+ deserialized_body = parse_raw_as(List[SensorDataExtDto],response.data) if response.data\
157
+ else []
158
+
159
+ # Sort observations on time
160
+ for sensor in deserialized_body:
161
+ sensor.data = sorted(sensor.data, key=lambda x: x.time, reverse=True)
162
+
163
+ if as_dataframe:
164
+ deserialized_body = convert_values_to_dataFrame(deserialized_body)
142
165
 
143
- api_response = ClimifyApiResponse[List[SensorDataExtDto]](
166
+ bodies.append(deserialized_body)
167
+
168
+ if skip_deserialization:
169
+ response.data = bodies
170
+ return ClimifyApiResponseWithoutDeserialization(response=response)
171
+
172
+ sensors = {}
173
+ for body in bodies:
174
+ for sensor in body:
175
+ if sensor.devId not in sensors:
176
+ sensors[sensor.devId] = sensor
177
+ continue
178
+
179
+ sensor_data = sensors[sensor.devId]
180
+ if as_dataframe:
181
+ sensor_data.data = concat([sensor_data.data, sensor.data], ignore_index=True)
182
+ else:
183
+ sensor_data.data += sensor.data
184
+
185
+ deserialized_body = list(sensors.values())
186
+
187
+ return ClimifyApiResponse[List[SensorDataExtDto]](
144
188
  response=response,
145
189
  status=response.status,
146
190
  body=deserialized_body,
147
191
  headers=response.headers
148
- )
149
-
150
- return api_response
192
+ )
@@ -4,12 +4,12 @@
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
- from datetime import datetime, date
7
+ from datetime import datetime, date, time
8
8
  from enum import Enum
9
9
  from typing import Any, Dict, List, Optional, Union
10
10
  from pandas import DataFrame
11
11
 
12
- from pydantic import BaseModel, Field, constr
12
+ from pydantic import BaseModel, Field, constr, validator
13
13
 
14
14
 
15
15
  class Error(BaseModel):
@@ -108,6 +108,30 @@ class SensorDataExtDto(BaseModel):
108
108
  arbitrary_types_allowed = True
109
109
 
110
110
 
111
+ class BuildingOperatingHourDto(BaseModel):
112
+ id: Optional[int] = None
113
+ dayOfWeek: Optional[int] = None
114
+
115
+ openTime: Optional[time] = None
116
+ closeTime: Optional[time] = None
117
+ active: Optional[bool] = None
118
+
119
+ @validator('openTime', 'closeTime', pre=True)
120
+ def parse_list_time(cls, v: Any) -> time:
121
+ if isinstance(v, list) and len(v) >= 2 and isinstance(v[0], int):
122
+ return time(v[0], v[1])
123
+
124
+ raise ValueError(f"Invalid time format: {v}")
125
+
126
+ class BuildingOperatingHourExceptionDto(BaseModel):
127
+ id: Optional[int] = None
128
+ dateFrom: Optional[date] = None
129
+ dateTo: Optional[date] = None
130
+ openTime: Optional[time] = None
131
+ closeTime: Optional[time] = None
132
+ reason: Optional[str] = None
133
+ active: Optional[bool] = None
134
+
111
135
  class BuildingDto(BaseModel):
112
136
  id: Optional[int] = None
113
137
  status: Optional[Status] = None
@@ -120,6 +144,8 @@ class BuildingDto(BaseModel):
120
144
  organisation: OrganisationDto = None
121
145
  coordinates: Optional[GeoPoint] = None
122
146
  maps: Optional[List[MapDto]] = []
147
+ buildingOperatingHours: Optional[List[BuildingOperatingHourDto]] = []
148
+ buildingOperatingHourExceptions: Optional[List[BuildingOperatingHourExceptionDto]] = []
123
149
 
124
150
 
125
151
  class LocationDto(BaseModel):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: climify_api
3
- Version: 1.0.27
3
+ Version: 1.0.29
4
4
  Summary: A wrapper library for the Climify REST API
5
5
  Author-email: Climify Aps <info@climify.com>
6
6
  Project-URL: Homepage, https://gitlab.climify.com/climify/python-api-lib
File without changes
File without changes
File without changes
File without changes