edu-rdm-integration 2.2.0__py3-none-any.whl → 3.0.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.
- edu_rdm_integration/collect_and_export_data/models.py +2 -2
- edu_rdm_integration/export_data/base/functions.py +6 -4
- edu_rdm_integration/export_data/base/helpers.py +41 -17
- {edu_rdm_integration-2.2.0.dist-info → edu_rdm_integration-3.0.0.dist-info}/METADATA +19 -1
- {edu_rdm_integration-2.2.0.dist-info → edu_rdm_integration-3.0.0.dist-info}/RECORD +9 -9
- {edu_rdm_integration-2.2.0.dist-info → edu_rdm_integration-3.0.0.dist-info}/LICENSE +0 -0
- {edu_rdm_integration-2.2.0.dist-info → edu_rdm_integration-3.0.0.dist-info}/WHEEL +0 -0
- {edu_rdm_integration-2.2.0.dist-info → edu_rdm_integration-3.0.0.dist-info}/namespace_packages.txt +0 -0
- {edu_rdm_integration-2.2.0.dist-info → edu_rdm_integration-3.0.0.dist-info}/top_level.txt +0 -0
@@ -39,7 +39,7 @@ class EduRdmCollectDataCommandProgress(AbstractCollectDataCommandProgress):
|
|
39
39
|
choices=CommandType.get_choices(),
|
40
40
|
)
|
41
41
|
|
42
|
-
class Meta:
|
42
|
+
class Meta(AbstractCollectDataCommandProgress.Meta):
|
43
43
|
db_table = 'edu_rdm_collecting_data_command_progress'
|
44
44
|
|
45
45
|
|
@@ -63,5 +63,5 @@ class EduRdmExportDataCommandProgress(AbstractExportDataCommandProgress):
|
|
63
63
|
choices=CommandType.get_choices(),
|
64
64
|
)
|
65
65
|
|
66
|
-
class Meta:
|
66
|
+
class Meta(AbstractExportDataCommandProgress.Meta):
|
67
67
|
db_table = 'edu_rdm_exporting_data_command_progress'
|
@@ -155,16 +155,18 @@ class BaseExportDataFunction(
|
|
155
155
|
Формирование списка строковых значений полей.
|
156
156
|
"""
|
157
157
|
ordered_fields = self.first_entity.entity.get_ordered_fields()
|
158
|
-
primary_key_fields = self.first_entity.entity.get_primary_key_fields()
|
159
|
-
foreign_key_fields = self.first_entity.entity.get_foreign_key_fields()
|
160
|
-
|
161
|
-
|
158
|
+
primary_key_fields = set(self.first_entity.entity.get_primary_key_fields())
|
159
|
+
foreign_key_fields = set(self.first_entity.entity.get_foreign_key_fields())
|
160
|
+
required_fields = set(self.first_entity.entity.get_required_fields())
|
161
|
+
hashable_fields = set(self.first_entity.entity.get_hashable_fields())
|
162
|
+
ignore_prefix_fields = set(self.first_entity.entity.get_ignore_prefix_key_fields())
|
162
163
|
|
163
164
|
field_values = self.helper.prepare_record(
|
164
165
|
entity_instance=entity_instance,
|
165
166
|
ordered_fields=ordered_fields,
|
166
167
|
primary_key_fields=primary_key_fields,
|
167
168
|
foreign_key_fields=foreign_key_fields,
|
169
|
+
required_fields=required_fields,
|
168
170
|
hashable_fields=hashable_fields,
|
169
171
|
ignore_prefix_fields=ignore_prefix_fields,
|
170
172
|
)
|
@@ -2,11 +2,11 @@ from datetime import (
|
|
2
2
|
date,
|
3
3
|
datetime,
|
4
4
|
)
|
5
|
-
from itertools import (
|
6
|
-
chain,
|
7
|
-
)
|
8
5
|
from typing import (
|
6
|
+
Any,
|
9
7
|
List,
|
8
|
+
Set,
|
9
|
+
Tuple,
|
10
10
|
Type,
|
11
11
|
)
|
12
12
|
|
@@ -55,36 +55,58 @@ class BaseExportDataFunctionHelper(WebEduFunctionHelper):
|
|
55
55
|
|
56
56
|
cryptographer = HashData(hash_algorithm=HASH_ALGORITHM)
|
57
57
|
|
58
|
+
@classmethod
|
59
|
+
def _prepare_str_field(cls, field_value: str, *, required: bool) -> str:
|
60
|
+
# Очистка строковых полей от управляющих символов
|
61
|
+
return str_without_control_chars(field_value)
|
62
|
+
|
63
|
+
@classmethod
|
64
|
+
def _prepare_datetime_field(cls, field_value: datetime, *, required: bool) -> str:
|
65
|
+
# Дату/время передаём в формате: YYYY-MM-DD hh:mm:ss
|
66
|
+
return field_value.strftime(EXPORT_DATETIME_FORMAT)
|
67
|
+
|
68
|
+
@classmethod
|
69
|
+
def _prepare_date_field(cls, field_value: date, *, required: bool) -> str:
|
70
|
+
return field_value.strftime(DATE_FORMAT)
|
71
|
+
|
72
|
+
@classmethod
|
73
|
+
def _prepare_common_field(cls, field_value: Any, *, required: bool) -> str:
|
74
|
+
return str(field_value if field_value is not None else '')
|
75
|
+
|
76
|
+
@classmethod
|
77
|
+
def _surround_with_quotes(cls, field_value: str, *, required: bool) -> str:
|
78
|
+
return f'"{field_value}"'
|
79
|
+
|
58
80
|
@classmethod
|
59
81
|
def prepare_record(
|
60
82
|
cls,
|
61
83
|
entity_instance,
|
62
|
-
ordered_fields,
|
63
|
-
primary_key_fields,
|
64
|
-
foreign_key_fields,
|
65
|
-
|
66
|
-
|
84
|
+
ordered_fields: Tuple[str, ...],
|
85
|
+
primary_key_fields: Set[str],
|
86
|
+
foreign_key_fields: Set[str],
|
87
|
+
required_fields: Set[str],
|
88
|
+
hashable_fields: Set[str],
|
89
|
+
ignore_prefix_fields: Set[str],
|
67
90
|
) -> List[str]:
|
68
91
|
"""
|
69
92
|
Формирование списка строковых значений полей.
|
70
93
|
"""
|
71
94
|
field_values = []
|
72
|
-
key_fields =
|
73
|
-
add_prefix_fields = key_fields
|
95
|
+
key_fields = primary_key_fields.union(foreign_key_fields)
|
96
|
+
add_prefix_fields = key_fields.difference(ignore_prefix_fields)
|
74
97
|
|
75
98
|
for field in ordered_fields:
|
99
|
+
required = field in required_fields
|
76
100
|
field_value = getattr(entity_instance, field)
|
77
101
|
|
78
102
|
if isinstance(field_value, str):
|
79
|
-
|
80
|
-
field_value = str_without_control_chars(field_value)
|
103
|
+
field_value = cls._prepare_str_field(field_value, required=required)
|
81
104
|
elif isinstance(field_value, datetime):
|
82
|
-
|
83
|
-
field_value = field_value.strftime(EXPORT_DATETIME_FORMAT)
|
105
|
+
field_value = cls._prepare_datetime_field(field_value, required=required)
|
84
106
|
elif isinstance(field_value, date):
|
85
|
-
field_value =
|
107
|
+
field_value = cls._prepare_date_field(field_value, required=required)
|
86
108
|
else:
|
87
|
-
field_value =
|
109
|
+
field_value = cls._prepare_common_field(field_value, required=required)
|
88
110
|
|
89
111
|
if field_value and field in add_prefix_fields:
|
90
112
|
field_value = f'{settings.RDM_EXPORT_ENTITY_ID_PREFIX}-{field_value}'
|
@@ -95,9 +117,11 @@ class BaseExportDataFunctionHelper(WebEduFunctionHelper):
|
|
95
117
|
# Экранирование двойных кавычек
|
96
118
|
field_value = field_value.replace('"', '""')
|
97
119
|
|
120
|
+
field_value = cls._surround_with_quotes(field_value, required=required)
|
121
|
+
|
98
122
|
field_values.append(field_value)
|
99
123
|
|
100
|
-
return
|
124
|
+
return field_values
|
101
125
|
|
102
126
|
def _prepare_cache_class(self) -> Type[BaseExportDataFunctionCacheStorage]:
|
103
127
|
"""
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: edu-rdm-integration
|
3
|
-
Version:
|
3
|
+
Version: 3.0.0
|
4
4
|
Summary: Интеграция с Региональной витриной данных
|
5
5
|
Home-page:
|
6
6
|
Download-URL:
|
@@ -293,6 +293,24 @@ Requires-Dist: uploader-client <1,>=0.2.1
|
|
293
293
|
|
294
294
|
### Удалено
|
295
295
|
|
296
|
+
## 3.0.0 - 2024-04-02
|
297
|
+
Расширены возможности кастомизации поведения метода `BaseExportDataFunctionHelper.prepare_record`.
|
298
|
+
|
299
|
+
### Добавлено
|
300
|
+
|
301
|
+
- [EDUCLLG-8325](https://jira.bars.group/browse/EDUCLLG-8325)
|
302
|
+
MAJOR Добавлена возможность отдельно указывать, как формировать строковое
|
303
|
+
представление полей в зависимости от их типа и обязательности. **Требуется добавить
|
304
|
+
параметр `required_fields` в метод `prepare_record` helper-а функции**.
|
305
|
+
|
306
|
+
## [2.2.1] - 2024-03-28
|
307
|
+
Исправление наследования Meta в моделях EduRdmCollectDataCommandProgress и EduRdmExportDataCommandProgress
|
308
|
+
|
309
|
+
### Исправлено
|
310
|
+
|
311
|
+
- [EDUSCHL-21569](https://jira.bars.group/browse/EDUSCHL-21569)
|
312
|
+
MINOR Перенести оставшиеся общие асинхронные задачи из ЭШ в пакет edu_rdm_integration
|
313
|
+
|
296
314
|
## [2.2.0] - 2024-03-20
|
297
315
|
|
298
316
|
Из ЭШ перенесена периодическая задача по сбору и выгрузке данных в РВД.
|
@@ -32,7 +32,7 @@ edu_rdm_integration/adapters/tests.py,sha256=MoRY-a75Ow-7EjeQYxkXWunwqTGuBMaUyEk
|
|
32
32
|
edu_rdm_integration/adapters/validators.py,sha256=LJWnCY8PtXDOj-fm3fBWjQYsHsSLfyKf_D97pqPv73s,496
|
33
33
|
edu_rdm_integration/collect_and_export_data/__init__.py,sha256=4glPgPCzAyLreBGUnUrcRPCge45XucJz5bK8VjlQBaE,82
|
34
34
|
edu_rdm_integration/collect_and_export_data/apps.py,sha256=fAcctcjxWP4Gd0Qr3YrQkMESrzga4IORWetBTy8wvHo,160
|
35
|
-
edu_rdm_integration/collect_and_export_data/models.py,sha256=
|
35
|
+
edu_rdm_integration/collect_and_export_data/models.py,sha256=TGm-hM-1aDhVcFPy0PTC3yNczoZGF4ZmIdr0Y9s8CfU,2038
|
36
36
|
edu_rdm_integration/collect_and_export_data/utils.py,sha256=uw85W_uPr7zGa9rA4Bp1nDUrOMnlz0nZ92AZAgNsRlE,3073
|
37
37
|
edu_rdm_integration/collect_and_export_data/migrations/0001_initial.py,sha256=UkoaXzh3tokZ8QdCdB09v3rRZfcHhvEwNMuj3mQIB74,4714
|
38
38
|
edu_rdm_integration/collect_and_export_data/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -94,8 +94,8 @@ edu_rdm_integration/export_data/base/caches.py,sha256=dj8LGB7TMtX3cSfp-1UB3dnzcT
|
|
94
94
|
edu_rdm_integration/export_data/base/consts.py,sha256=jLuy2y7YQ921OrEuzDld3F0k6YxgCnr5yorWBQJiLLw,519
|
95
95
|
edu_rdm_integration/export_data/base/enums.py,sha256=BSmwrkzYwEQhz9NbZCJsldY532PqgZJzxzsVk6ue0bM,93
|
96
96
|
edu_rdm_integration/export_data/base/errors.py,sha256=SaxXgKWNGG8RZQ8soFlzbX8d2_j58gWVmikzNZG1s74,291
|
97
|
-
edu_rdm_integration/export_data/base/functions.py,sha256=
|
98
|
-
edu_rdm_integration/export_data/base/helpers.py,sha256
|
97
|
+
edu_rdm_integration/export_data/base/functions.py,sha256=5LGMrAMkGu1pb03gZ8PDpx5hjuoY4B9s5yXX6qs-EiM,12785
|
98
|
+
edu_rdm_integration/export_data/base/helpers.py,sha256=MbzVIqwH_5vVRpX1KOsf3VwbzzSA395e_GLUCJv9urw,4476
|
99
99
|
edu_rdm_integration/export_data/base/managers.py,sha256=AJBBOmQbW-cnVEa3d2DCpyoNbnRxXmgpAcUCBu1rDiI,6075
|
100
100
|
edu_rdm_integration/export_data/base/presenters.py,sha256=JXh8nwyezaC-2h_TYfPPYUZRitFr9Y9Ifp-j7CaUCL0,403
|
101
101
|
edu_rdm_integration/export_data/base/requests.py,sha256=-4Kn4hSl6IuKrpd8uIYTe4gO4Dz11HLfjJXLvmf9jTk,2576
|
@@ -162,9 +162,9 @@ edu_rdm_integration/uploader_log/apps.py,sha256=tYJj4-sDlq8fLOSvw18L_yys7SILpTKW
|
|
162
162
|
edu_rdm_integration/uploader_log/enums.py,sha256=rgSO3BL2rh2xpfm0Pt4waQW8fB1VMJLdsGmr3SXwH_U,266
|
163
163
|
edu_rdm_integration/uploader_log/managers.py,sha256=y5wTSMzF9hpOpIU_A7nIafL_LBU3QEie6LAYWoB-pBQ,3203
|
164
164
|
edu_rdm_integration/uploader_log/ui.py,sha256=YM9Buqp2wxE95Wf5gvAATBzuYzDOossK1sEmvFk07cI,2110
|
165
|
-
edu_rdm_integration-
|
166
|
-
edu_rdm_integration-
|
167
|
-
edu_rdm_integration-
|
168
|
-
edu_rdm_integration-
|
169
|
-
edu_rdm_integration-
|
170
|
-
edu_rdm_integration-
|
165
|
+
edu_rdm_integration-3.0.0.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
|
166
|
+
edu_rdm_integration-3.0.0.dist-info/METADATA,sha256=_8nLJtril424bXoqc4ZJkDNchqTF30-ISQXruCBIBVA,58912
|
167
|
+
edu_rdm_integration-3.0.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
168
|
+
edu_rdm_integration-3.0.0.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
169
|
+
edu_rdm_integration-3.0.0.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
|
170
|
+
edu_rdm_integration-3.0.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
{edu_rdm_integration-2.2.0.dist-info → edu_rdm_integration-3.0.0.dist-info}/namespace_packages.txt
RENAMED
File without changes
|
File without changes
|