saviialib 0.8.0__tar.gz → 0.9.0__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.

Potentially problematic release.


This version of saviialib might be problematic. Click here for more details.

Files changed (49) hide show
  1. {saviialib-0.8.0 → saviialib-0.9.0}/PKG-INFO +1 -1
  2. {saviialib-0.8.0 → saviialib-0.9.0}/pyproject.toml +1 -1
  3. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/general_types/api/epii_api_types.py +1 -0
  4. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/api.py +2 -1
  5. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/controllers/upload_backup_to_sharepoint.py +1 -0
  6. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/use_cases/constants/upload_backup_to_sharepoint_constants.py +4 -4
  7. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/use_cases/types/upload_backup_to_sharepoint_types.py +1 -0
  8. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/use_cases/upload_backup_to_sharepoint.py +31 -8
  9. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/utils/upload_backup_to_sharepoint_utils.py +17 -8
  10. {saviialib-0.8.0 → saviialib-0.9.0}/LICENSE +0 -0
  11. {saviialib-0.8.0 → saviialib-0.9.0}/README.md +0 -0
  12. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/__init__.py +0 -0
  13. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/general_types/__init__.py +0 -0
  14. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/general_types/api/__init__.py +0 -0
  15. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/general_types/error_types/__init__.py +0 -0
  16. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/general_types/error_types/api/__init__.py +0 -0
  17. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/general_types/error_types/api/epii_api_error_types.py +0 -0
  18. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/general_types/error_types/common/__init__.py +0 -0
  19. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/general_types/error_types/common/common_types.py +0 -0
  20. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/files_client/__init__.py +0 -0
  21. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/files_client/clients/aiofiles_client.py +0 -0
  22. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/files_client/files_client.py +0 -0
  23. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/files_client/files_client_contract.py +0 -0
  24. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/files_client/types/files_client_types.py +0 -0
  25. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/ftp_client/__init__.py +0 -0
  26. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/ftp_client/clients/__init__.py +0 -0
  27. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/ftp_client/clients/aioftp_client.py +0 -0
  28. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/ftp_client/ftp_client.py +0 -0
  29. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/ftp_client/ftp_client_contract.py +0 -0
  30. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/ftp_client/types/__init__.py +0 -0
  31. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/ftp_client/types/ftp_client_types.py +0 -0
  32. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/sharepoint_client/__init__.py +0 -0
  33. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/sharepoint_client/clients/sharepoint_rest_api.py +0 -0
  34. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/sharepoint_client/sharepoint_client.py +0 -0
  35. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/sharepoint_client/sharepoint_client_contract.py +0 -0
  36. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/sharepoint_client/types/sharepoint_client_types.py +0 -0
  37. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/libs/zero_dependency/utils/datetime_utils.py +0 -0
  38. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/__init__.py +0 -0
  39. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/controllers/__init__.py +0 -0
  40. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/controllers/types/__init__.py +0 -0
  41. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/controllers/types/update_thies_data_types.py +0 -0
  42. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/controllers/types/upload_backup_to_sharepoint_types.py +0 -0
  43. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/controllers/update_thies_data.py +0 -0
  44. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/use_cases/constants/update_thies_data_constants.py +0 -0
  45. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/use_cases/types/__init__.py +0 -0
  46. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/use_cases/types/update_thies_data_types.py +0 -0
  47. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/use_cases/update_thies_data.py +0 -0
  48. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/utils/__init__.py +0 -0
  49. {saviialib-0.8.0 → saviialib-0.9.0}/src/saviialib/services/epii/utils/update_thies_data_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: saviialib
3
- Version: 0.8.0
3
+ Version: 0.9.0
4
4
  Summary: A client library for IoT projects in the RCER initiative
5
5
  License: MIT
6
6
  Author: pedropablozavalat
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "saviialib"
3
- version = "0.8.0"
3
+ version = "0.9.0"
4
4
  description = "A client library for IoT projects in the RCER initiative"
5
5
  authors = ["pedropablozavalat"]
6
6
  license = "MIT"
@@ -79,3 +79,4 @@ class EpiiSharepointBackupConfig:
79
79
  sharepoint_tenant_name: str
80
80
  sharepoint_site_name: str
81
81
  local_backup_source_path: str
82
+ destination_folders: str
@@ -53,7 +53,7 @@ class EpiiAPI:
53
53
  return response.__dict__
54
54
 
55
55
  async def upload_backup_to_sharepoint(
56
- self, local_backup_source_path: str
56
+ self, local_backup_source_path: str, destination_folders: dict[str, str]
57
57
  ) -> Dict[str, Any]:
58
58
  """Migrate a backup folder from Home assistant to Sharepoint directory.
59
59
  Args:
@@ -70,6 +70,7 @@ class EpiiAPI:
70
70
  sharepoint_tenant_id=self.sharepoint_tenant_id,
71
71
  sharepoint_tenant_name=self.sharepoint_tenant_name,
72
72
  local_backup_source_path=local_backup_source_path,
73
+ destination_folders=destination_folders
73
74
  )
74
75
 
75
76
  controller = UploadBackupToSharepointController(
@@ -34,6 +34,7 @@ class UploadBackupToSharepointController:
34
34
  sharepoint_tenant_id=input.config.sharepoint_tenant_id,
35
35
  ),
36
36
  local_backup_source_path=input.config.local_backup_source_path,
37
+ destination_folders=input.config.destination_folders
37
38
  )
38
39
  )
39
40
 
@@ -1,5 +1,5 @@
1
+ import logging
2
+
1
3
  SHAREPOINT_BASE_URL = "/sites/uc365_CentrosyEstacionesRegionalesUC/Shared%20Documents/General/Test_Raspberry"
2
- DESTINATION_FOLDERS = {
3
- "CAM1": "Camaras_Trampa",
4
- "RECORDS1": "Grabaciones",
5
- }
4
+
5
+ LOGGER = logging.getLogger(__package__)
@@ -6,3 +6,4 @@ from saviialib.general_types.api.epii_api_types import SharepointConfig
6
6
  class UploadBackupToSharepointUseCaseInput:
7
7
  sharepoint_config: SharepointConfig
8
8
  local_backup_source_path: str
9
+ destination_folders: dict
@@ -28,12 +28,14 @@ from saviialib.services.epii.utils.upload_backup_to_sharepoint_utils import (
28
28
  from .types.upload_backup_to_sharepoint_types import (
29
29
  UploadBackupToSharepointUseCaseInput,
30
30
  )
31
+ from .constants.upload_backup_to_sharepoint_constants import LOGGER
31
32
 
32
33
 
33
34
  class UploadBackupToSharepointUsecase:
34
35
  def __init__(self, input: UploadBackupToSharepointUseCaseInput):
35
36
  self.sharepoint_config = input.sharepoint_config
36
37
  self.local_backup_source_path = input.local_backup_source_path
38
+ self.destination_folders = input.destination_folders
37
39
  self.grouped_files_by_folder = self._extract_filesnames_by_folder()
38
40
  self.files_client = self._initialize_files_client()
39
41
  self.total_files = sum(
@@ -82,7 +84,7 @@ class UploadBackupToSharepointUsecase:
82
84
 
83
85
  async with sharepoint_client:
84
86
  try:
85
- destination_folder = c.DESTINATION_FOLDERS.get(folder_name, folder_name)
87
+ destination_folder = self.destination_folders.get(folder_name, folder_name)
86
88
  folder_url = f"{c.SHAREPOINT_BASE_URL}/{destination_folder}"
87
89
  args = SpUploadFileArgs(
88
90
  folder_relative_url=folder_url,
@@ -103,14 +105,14 @@ class UploadBackupToSharepointUsecase:
103
105
  f"[BACKUP] Uploading file '{file_name}' from '{folder_name}' "
104
106
  )
105
107
  self.log_history.append(uploading_message)
106
- print(uploading_message)
108
+ LOGGER.debug(uploading_message)
107
109
  file_path = os.path.join(self.local_backup_source_path, folder_name, file_name)
108
110
  file_content = await self.files_client.read(ReadArgs(file_path, mode="rb"))
109
111
  uploaded, error_message = await self.export_file_to_sharepoint(
110
112
  folder_name, file_name, file_content
111
113
  )
112
114
  result_message = show_upload_result(uploaded, file_name)
113
- print(result_message)
115
+ LOGGER.debug(result_message)
114
116
  self.log_history.append(result_message)
115
117
  return {
116
118
  "parent_folder": folder_name,
@@ -126,7 +128,7 @@ class UploadBackupToSharepointUsecase:
126
128
  f"[BACKUP] Retrying upload for {len(failed_files)} failed files... 🚨"
127
129
  )
128
130
  self.log_history.append(retry_message)
129
- print(retry_message)
131
+ LOGGER.debug(retry_message)
130
132
  for file in failed_files:
131
133
  tasks.append(
132
134
  self.upload_and_log_progress_task(
@@ -142,7 +144,7 @@ class UploadBackupToSharepointUsecase:
142
144
  "[BACKUP] All files uploaded successfully after retry."
143
145
  )
144
146
  self.log_history.append(successful_upload_retry)
145
- print(successful_upload_retry)
147
+ LOGGER.debug(successful_upload_retry)
146
148
  self._save_log_history()
147
149
  return parse_execute_response(results)
148
150
 
@@ -150,16 +152,37 @@ class UploadBackupToSharepointUsecase:
150
152
  """Exports all files from the local backup folder to SharePoint cloud."""
151
153
  tasks = []
152
154
  start_time = time()
155
+
156
+ # Check if the local path exists in the main directory
153
157
  if not directory_exists(self.local_backup_source_path):
154
158
  raise BackupSourcePathError(
155
159
  reason=f"'{self.local_backup_source_path}' doesn't exist."
156
160
  )
161
+
162
+ # Check if the current folder only have files.
163
+ for item in os.listdir(self.local_backup_source_path):
164
+ folder_included = item in self.destination_folders.keys()
165
+ is_file = not os.path.isdir(os.path.join(self.local_backup_source_path, item))
166
+ if not folder_included and not is_file:
167
+ raise BackupSourcePathError(
168
+ reason=(
169
+ f"'{item}' must be included in the destination folders dictionary",
170
+ )
171
+ )
172
+ elif folder_included and is_file:
173
+ print(folder_included, is_file)
174
+ raise BackupSourcePathError(
175
+ reason=(
176
+ f"'{item}' must be a directory.",
177
+ )
178
+ )
179
+
157
180
  if self.total_files == 0:
158
181
  no_files_message = (
159
182
  f"[BACKUP] {self.local_backup_source_path} has no files ⚠️"
160
183
  )
161
184
  self.log_history.append(no_files_message)
162
- print(no_files_message)
185
+ LOGGER.debug(no_files_message)
163
186
  raise BackupEmptyError
164
187
  # Create task for each file stored in the the local backup folder.
165
188
  for folder_name in self.grouped_files_by_folder:
@@ -168,14 +191,14 @@ class UploadBackupToSharepointUsecase:
168
191
  == 0
169
192
  ):
170
193
  empty_folder_message = f"[BACKUP] The folder '{folder_name}' is empty ⚠️"
171
- print(empty_folder_message)
194
+ LOGGER.debug(empty_folder_message)
172
195
  self.log_history.append(empty_folder_message)
173
196
  continue
174
197
  extracting_files_message = (
175
198
  "[BACKUP]" + f" Extracting files from '{folder_name} ".center(15, "*")
176
199
  )
177
200
  self.log_history.append(extracting_files_message)
178
- print(extracting_files_message)
201
+ LOGGER.debug(extracting_files_message)
179
202
  for file_name in self.grouped_files_by_folder[folder_name]:
180
203
  tasks.append(self.upload_and_log_progress_task(folder_name, file_name))
181
204
 
@@ -1,6 +1,12 @@
1
1
  import re
2
2
  from typing import List, Dict, Optional
3
3
  import os
4
+ from saviialib.general_types.error_types.api.epii_api_error_types import (
5
+ BackupSourcePathError,
6
+ )
7
+ from saviialib.services.epii.use_cases.constants.upload_backup_to_sharepoint_constants import (
8
+ LOGGER,
9
+ )
4
10
 
5
11
 
6
12
  def extract_error_information(error: str) -> Optional[Dict[str, str]]:
@@ -24,7 +30,7 @@ def explain_status_code(status_code: int) -> str:
24
30
 
25
31
 
26
32
  def extract_error_message(results: List[Dict], success: float) -> str:
27
- print(
33
+ LOGGER.info(
28
34
  "[BACKUP] Not all files uploaded ⚠️\n"
29
35
  f"[BACKUP] Files failed to upload: {(1 - success):.2%}"
30
36
  )
@@ -52,9 +58,9 @@ def extract_error_message(results: List[Dict], success: float) -> str:
52
58
 
53
59
  # Summary
54
60
  for code, items in grouped_errors.items():
55
- print(f"[BACKUP] Status code {code} - {explain_status_code(int(code))}")
61
+ LOGGER.info(f"[BACKUP] Status code {code} - {explain_status_code(int(code))}")
56
62
  for item in items:
57
- print(
63
+ LOGGER.info(
58
64
  f"[BACKUP] File {item['file_name']}, url: {item['url']}, message: {item['message']}"
59
65
  )
60
66
 
@@ -63,11 +69,14 @@ def extract_error_message(results: List[Dict], success: float) -> str:
63
69
 
64
70
 
65
71
  def parse_execute_response(results: List[Dict]) -> Dict[str, List[str]]:
66
- return {
67
- "new_files": len(
68
- [item["file_name"] for item in results if item.get("uploaded")]
69
- ),
70
- }
72
+ try:
73
+ return {
74
+ "new_files": len(
75
+ [item["file_name"] for item in results if item.get("uploaded")]
76
+ ),
77
+ }
78
+ except (IsADirectoryError, AttributeError, ConnectionError) as error:
79
+ raise BackupSourcePathError(reason=error)
71
80
 
72
81
 
73
82
  def show_upload_result(uploaded: bool, file_name: str) -> str:
File without changes
File without changes