saviialib 0.8.0__py3-none-any.whl → 0.9.0__py3-none-any.whl
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.
- saviialib/general_types/api/epii_api_types.py +1 -0
- saviialib/services/epii/api.py +2 -1
- saviialib/services/epii/controllers/upload_backup_to_sharepoint.py +1 -0
- saviialib/services/epii/use_cases/constants/upload_backup_to_sharepoint_constants.py +4 -4
- saviialib/services/epii/use_cases/types/upload_backup_to_sharepoint_types.py +1 -0
- saviialib/services/epii/use_cases/upload_backup_to_sharepoint.py +31 -8
- saviialib/services/epii/utils/upload_backup_to_sharepoint_utils.py +17 -8
- {saviialib-0.8.0.dist-info → saviialib-0.9.0.dist-info}/METADATA +1 -1
- {saviialib-0.8.0.dist-info → saviialib-0.9.0.dist-info}/RECORD +11 -11
- {saviialib-0.8.0.dist-info → saviialib-0.9.0.dist-info}/LICENSE +0 -0
- {saviialib-0.8.0.dist-info → saviialib-0.9.0.dist-info}/WHEEL +0 -0
saviialib/services/epii/api.py
CHANGED
|
@@ -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(
|
|
@@ -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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
61
|
+
LOGGER.info(f"[BACKUP] Status code {code} - {explain_status_code(int(code))}")
|
|
56
62
|
for item in items:
|
|
57
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
saviialib/__init__.py,sha256=TMsEY8OOjo9KOz-0jf3QBh6WFOhCY07Rd7W2PK7C-1A,253
|
|
2
2
|
saviialib/general_types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
3
|
saviialib/general_types/api/__init__.py,sha256=jXhoMlbSv7UCizW_Fm2mqR_3n99qkocVwg6CF7s3w7w,145
|
|
4
|
-
saviialib/general_types/api/epii_api_types.py,sha256=
|
|
4
|
+
saviialib/general_types/api/epii_api_types.py,sha256=_3Q20yOTHn8Vmsx-fn_FR9XF2P719KobFrklxsdDr1U,2324
|
|
5
5
|
saviialib/general_types/error_types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
saviialib/general_types/error_types/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
7
|
saviialib/general_types/error_types/api/epii_api_error_types.py,sha256=j1b2gE8zRTlh4gCB4kf9-JNlBzcZ9AmMKxRiFVbSqQ0,2722
|
|
@@ -26,24 +26,24 @@ saviialib/libs/sharepoint_client/sharepoint_client_contract.py,sha256=xqNHzCjp7G
|
|
|
26
26
|
saviialib/libs/sharepoint_client/types/sharepoint_client_types.py,sha256=OmPlCJ9rLrAFBeG6aDp5cxMiQ5BZlDyGVx5S4GN4aqg,414
|
|
27
27
|
saviialib/libs/zero_dependency/utils/datetime_utils.py,sha256=NFPHxOTuCtfkYjUnsbRqw9ZK87UGAK-Eira2CwG8rJ8,754
|
|
28
28
|
saviialib/services/epii/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
29
|
-
saviialib/services/epii/api.py,sha256=
|
|
29
|
+
saviialib/services/epii/api.py,sha256=rAiyf6sumaW9DIdqT5KKGMk0iIP6_tnN2__oLIuDuiI,3488
|
|
30
30
|
saviialib/services/epii/controllers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
31
|
saviialib/services/epii/controllers/types/__init__.py,sha256=xzky-oTSojLNkWETp_k8a4dcXYvYSQY0VhWo23Yhb8U,195
|
|
32
32
|
saviialib/services/epii/controllers/types/update_thies_data_types.py,sha256=Id86QaFt6A2EJgHJvmm3rvWGUkT2SM8D5OTxZGS-aTs,380
|
|
33
33
|
saviialib/services/epii/controllers/types/upload_backup_to_sharepoint_types.py,sha256=k_vfqI4UfdSS62HY5pi8eq2PxYXRp4LexDgRB3V2lrc,400
|
|
34
34
|
saviialib/services/epii/controllers/update_thies_data.py,sha256=5vi-CEXV9maCTHgyZRnGs8zlc2xkEQ3TJMVza4xr-Qw,4334
|
|
35
|
-
saviialib/services/epii/controllers/upload_backup_to_sharepoint.py,sha256=
|
|
35
|
+
saviialib/services/epii/controllers/upload_backup_to_sharepoint.py,sha256=l3oBiPU1GHYuVI8LCnDQhY_2xH7bqiQzJ4lB_is4VAM,3754
|
|
36
36
|
saviialib/services/epii/use_cases/constants/update_thies_data_constants.py,sha256=38f2WKV-zBO9O-CV8mh3tW3MFMiaJrrv4_FfQiyHApc,275
|
|
37
|
-
saviialib/services/epii/use_cases/constants/upload_backup_to_sharepoint_constants.py,sha256=
|
|
37
|
+
saviialib/services/epii/use_cases/constants/upload_backup_to_sharepoint_constants.py,sha256=zkQLcI2ZIhGVGOcb-i-XCTdIcX78U4nAhpXPNenBjow,167
|
|
38
38
|
saviialib/services/epii/use_cases/types/__init__.py,sha256=u6fyodOEJE2j6FMqJux40Xf9ccYAi-UUYxqT-Kzc0kE,199
|
|
39
39
|
saviialib/services/epii/use_cases/types/update_thies_data_types.py,sha256=BoT6N9YoVw3f8Cyb88T7fJTCCnkVybOh1K1u2fJ3X7k,419
|
|
40
|
-
saviialib/services/epii/use_cases/types/upload_backup_to_sharepoint_types.py,sha256=
|
|
40
|
+
saviialib/services/epii/use_cases/types/upload_backup_to_sharepoint_types.py,sha256=rvuhJnjsCQpuNz5UO_0lGMR_KJRybNdq_11Be9ZaY1U,267
|
|
41
41
|
saviialib/services/epii/use_cases/update_thies_data.py,sha256=WLBpdAUkxAL_XdDnc49scmst1xMjrdScjr6Cmgg3UEE,6494
|
|
42
|
-
saviialib/services/epii/use_cases/upload_backup_to_sharepoint.py,sha256=
|
|
42
|
+
saviialib/services/epii/use_cases/upload_backup_to_sharepoint.py,sha256=3XrkE2LNw3DRP3FA0SVpdD4AnCIL6uBSA-9sctjfKyw,9144
|
|
43
43
|
saviialib/services/epii/utils/__init__.py,sha256=cYt2tvq65_OMjFaqb8-CCC7IGCQgFd4ziEUWJV7s1iY,98
|
|
44
44
|
saviialib/services/epii/utils/update_thies_data_utils.py,sha256=EpjYWXqyHxJ-dO3MHhdXp-rGV7WyUckeFko-nnfnNac,555
|
|
45
|
-
saviialib/services/epii/utils/upload_backup_to_sharepoint_utils.py,sha256=
|
|
46
|
-
saviialib-0.
|
|
47
|
-
saviialib-0.
|
|
48
|
-
saviialib-0.
|
|
49
|
-
saviialib-0.
|
|
45
|
+
saviialib/services/epii/utils/upload_backup_to_sharepoint_utils.py,sha256=4psc4EHpgnuiOVc0Tn_PR2mDsDh774ERbhIewSwYSZg,3422
|
|
46
|
+
saviialib-0.9.0.dist-info/LICENSE,sha256=NWpf6b38xgBWPBo5HZsCbdfp9hZSliEbRqWQgm0fkOo,1076
|
|
47
|
+
saviialib-0.9.0.dist-info/METADATA,sha256=WnSLd2VoJRXqhypq0NXow8eqQ8Pu9swBbSn9oX5BPhc,4082
|
|
48
|
+
saviialib-0.9.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
49
|
+
saviialib-0.9.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|