edu-rdm-integration 0.7.3__py3-none-any.whl → 0.8.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.
@@ -0,0 +1,25 @@
1
+ # Generated by Django 2.2.28 on 2023-12-01 20:58
2
+ from django.db import (
3
+ migrations,
4
+ )
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('uploader_client', '0001_initial'),
11
+ ('edu_rdm_integration', '0003_create_index_file_upload_status'),
12
+ ]
13
+
14
+ operations = [
15
+ migrations.CreateModel(
16
+ name='UploaderClientLog',
17
+ fields=[],
18
+ options={
19
+ 'proxy': True,
20
+ 'indexes': [],
21
+ 'constraints': [],
22
+ },
23
+ bases=('edu_rdm_integration.exportingdatasubstageuploaderclientlog', ),
24
+ ),
25
+ ]
@@ -56,6 +56,28 @@ from edu_rdm_integration.enums import (
56
56
  from edu_rdm_integration.utils import (
57
57
  get_exporting_data_stage_attachment_path,
58
58
  )
59
+ from io import (
60
+ StringIO,
61
+ )
62
+ from typing import (
63
+ Optional,
64
+ Tuple,
65
+ )
66
+
67
+ from django.db.models import (
68
+ Manager,
69
+ )
70
+ from django.utils.functional import (
71
+ cached_property,
72
+ )
73
+
74
+ from uploader_client.models import (
75
+ Entry,
76
+ )
77
+
78
+ from edu_rdm_integration.uploader_log.managers import (
79
+ UploaderClientLogManager,
80
+ )
59
81
 
60
82
 
61
83
  class CollectingDataStageStatus(TitledModelEnum):
@@ -755,3 +777,50 @@ class AbstractCollectDataCommandProgress(ReprStrPreModelMixin, BaseObjectModel):
755
777
  db_table = 'rdm_collecting_data_command_progress'
756
778
  verbose_name = 'Задача по сбору данных'
757
779
  verbose_name_plural = 'Задачи по сбору данных'
780
+
781
+
782
+ class UploaderClientLog(Entry):
783
+ """Прокси модель Загрузчика данных в витрину."""
784
+
785
+ objects = UploaderClientLogManager()
786
+ base_objects = Manager()
787
+
788
+ @cached_property
789
+ def http_method_and_url(self) -> Tuple[str, str]:
790
+ """Возвращает http-метод и url из поля запроса Entry.request."""
791
+ request = StringIO(self.request)
792
+ request_first_line = request.readline()
793
+ request.close()
794
+
795
+ method, url = request_first_line.split(' ')[:2]
796
+ if not (method and url.startswith('http')):
797
+ method = url = ''
798
+
799
+ return method.strip('[]'), url
800
+
801
+ @cached_property
802
+ def http_response_status(self) -> str:
803
+ """Статус-код запроса к витрине."""
804
+ try:
805
+ http_status = self.response.split(' ')[0].strip('[]')
806
+ except IndexError:
807
+ http_status = None
808
+ return http_status
809
+
810
+ @property
811
+ def http_method(self) -> str:
812
+ """Значение http-метода."""
813
+ return self.http_method_and_url[0]
814
+
815
+ @property
816
+ def request_url(self) -> str:
817
+ """URL запроса."""
818
+ return self.http_method_and_url[1]
819
+
820
+ @property
821
+ def request_error(self) -> Optional[str]:
822
+ """Ошибка запроса."""
823
+ return self.error
824
+
825
+ class Meta:
826
+ proxy = True
File without changes
@@ -0,0 +1,229 @@
1
+ from datetime import (
2
+ date,
3
+ datetime,
4
+ time,
5
+ timedelta,
6
+ )
7
+ from functools import (
8
+ partial,
9
+ )
10
+ from typing import (
11
+ Optional,
12
+ )
13
+
14
+ from django.db.models import (
15
+ Q,
16
+ )
17
+ from m3_ext.ui.icons import (
18
+ Icons,
19
+ )
20
+ from objectpack.actions import (
21
+ ObjectPack,
22
+ )
23
+
24
+ from educommon.objectpack.actions import (
25
+ ExtObjectRowsAction,
26
+ )
27
+ from educommon.objectpack.filters import (
28
+ BoolChoicesFilter,
29
+ ColumnFilterEngine,
30
+ DateFilterByAnnotatedField,
31
+ )
32
+ from educommon.utils.object_grid import (
33
+ add_one_row_button,
34
+ boolean_column_renderer,
35
+ )
36
+ from educommon.utils.ui import (
37
+ append_template_globals,
38
+ )
39
+
40
+ from edu_rdm_integration.models import (
41
+ UploaderClientLog,
42
+ )
43
+ from edu_rdm_integration.uploader_log.ui import (
44
+ UploaderLogInfoWindow,
45
+ )
46
+
47
+
48
+ class UploaderLogPack(ObjectPack):
49
+ """
50
+ Пак журнала Загрузчика данных в витрину.
51
+ """
52
+
53
+ title = 'Журнал логов РВД'
54
+ model = UploaderClientLog
55
+
56
+ edit_window = UploaderLogInfoWindow
57
+
58
+ _is_primary_for_model = False
59
+ can_delete = False
60
+ list_sort_order = ['-request_datetime']
61
+ _DEFAULT_PAGING_LIMIT = 35
62
+
63
+ filter_engine_clz = ColumnFilterEngine
64
+ _fd = partial(DateFilterByAnnotatedField, model)
65
+
66
+ need_check_permission = True
67
+
68
+ columns = [
69
+ {
70
+ 'header': '№ п/п',
71
+ 'data_index': 'row_number',
72
+ 'sortable': False,
73
+ 'width': 3,
74
+ },
75
+ {
76
+ 'header': 'Метод',
77
+ 'data_index': 'http_method',
78
+ 'sortable': False,
79
+ 'width': 3,
80
+ },
81
+ {
82
+ 'header': 'URL',
83
+ 'data_index': 'request_url',
84
+ 'searchable': True,
85
+ 'sortable': False,
86
+ 'width': 21,
87
+ },
88
+ {
89
+ 'header': 'Дата и время запроса',
90
+ 'data_index': 'request_datetime',
91
+ 'sortable': True,
92
+ 'filter': _fd(
93
+ 'request_datetime',
94
+ tooltip='C',
95
+ default_value=date.today() - timedelta(days=1),
96
+ editable=False,
97
+ lookup=lambda v: Q(request_datetime__gte=datetime.combine(v, time.min))
98
+ ) & _fd(
99
+ 'request_datetime',
100
+ tooltip='По',
101
+ default_value=date.today,
102
+ editable=False,
103
+ lookup=lambda v: Q(request_datetime__lte=datetime.combine(v, time.max))
104
+ ),
105
+ 'width': 11,
106
+ },
107
+ {
108
+ 'header': 'Результат',
109
+ 'data_index': 'http_response_status',
110
+ 'sortable': False,
111
+ 'width': 5,
112
+ },
113
+ {
114
+ 'header': 'Путь до файлов',
115
+ 'data_index': 'attachment_file',
116
+ 'sortable': False,
117
+ 'searchable': True,
118
+ 'width': 37,
119
+ },
120
+ {
121
+ 'header': 'ID запроса',
122
+ 'data_index': 'request_id',
123
+ 'sortable': False,
124
+ 'searchable': True,
125
+ 'width': 10,
126
+ },
127
+ {
128
+ 'header': 'Код статуса загрузки',
129
+ 'data_index': 'status_code',
130
+ 'sortable': False,
131
+ 'searchable': True,
132
+ 'width': 10,
133
+ },
134
+ {
135
+ 'header': 'Описание статуса загрузки',
136
+ 'data_index': 'status_description',
137
+ 'sortable': False,
138
+ 'searchable': True,
139
+ 'width': 10,
140
+ },
141
+ {
142
+ 'header': 'Режим эмуляции',
143
+ 'data_index': 'is_emulation',
144
+ 'sortable': False,
145
+ 'filter': BoolChoicesFilter('is_emulation'),
146
+ 'column_renderer': boolean_column_renderer(),
147
+ 'width': 5,
148
+ }
149
+ ]
150
+
151
+ def __init__(self):
152
+ """Инициализация."""
153
+ super(UploaderLogPack, self).__init__()
154
+
155
+ self.edit_window_action.perm_code = 'view'
156
+ self.replace_action('rows_action', ExtObjectRowsAction())
157
+
158
+ def get_rows_query(self, request, context):
159
+ """Возвращает кварисет для получения списка данных."""
160
+ context._row_number = int(getattr(context, 'start', 0))
161
+
162
+ return super().get_rows_query(request, context)
163
+
164
+ def get_row(self, row_id: Optional[int]) -> 'UploaderClientLog':
165
+ """Возвращает объект по идентификатору."""
166
+ if row_id:
167
+ record = self.model.base_objects.get(id=row_id)
168
+ else:
169
+ record = super().get_row(row_id)
170
+
171
+ return record
172
+
173
+ def prepare_row(self, obj, request, context):
174
+ """Установка дополнительных атрибутов объекта."""
175
+ context._row_number += 1
176
+ obj.row_number = context._row_number
177
+
178
+ return obj
179
+
180
+ def create_list_window(self, is_select_mode, request, context):
181
+ """Создание окна списка."""
182
+ win = super().create_list_window(is_select_mode, request, context)
183
+
184
+ append_template_globals(win, 'ui-js/object-grid-buttons.js')
185
+
186
+ return win
187
+
188
+ def get_list_window_params(self, params, request, context):
189
+ """Установка параметров окна списка."""
190
+ params = super().get_list_window_params(params, request, context)
191
+
192
+ params.update(
193
+ maximized=True,
194
+ )
195
+
196
+ return params
197
+
198
+ def configure_grid(self, grid, *args, **kwargs):
199
+ """Конфигурирование грида окна списка."""
200
+ super().configure_grid(grid, *args, **kwargs)
201
+
202
+ grid.url_edit = None
203
+ add_one_row_button(
204
+ 'Просмотр',
205
+ grid,
206
+ self.edit_window_action,
207
+ Icons.APPLICATION_VIEW_DETAIL,
208
+ dbl_clicked=True,
209
+ index=0,
210
+ )
211
+
212
+ def get_edit_window_params(self, params, request, context):
213
+ """Параметры окна редактирования."""
214
+ params = super().get_edit_window_params(params, request, context)
215
+
216
+ params.update(
217
+ title=f'{self.title}: Просмотр',
218
+ )
219
+
220
+ return params
221
+
222
+ def extend_menu(self, menu): # noqa D102
223
+ return menu.SubMenu(
224
+ 'Администрирование', menu.SubMenu(
225
+ 'Региональная витрина данных', menu.Item(
226
+ self.title, self.list_window_action
227
+ )
228
+ )
229
+ )
@@ -0,0 +1,10 @@
1
+ from django.apps import (
2
+ AppConfig,
3
+ )
4
+
5
+
6
+ class UploaderLoggerConfig(AppConfig): # noqa D101
7
+
8
+ name = 'regional_data_mart_integration.uploader_log'
9
+ label = 'regional_data_mart_integration_uploader_log'
10
+ verbose_name = 'Журнал логов РВД'
@@ -0,0 +1,15 @@
1
+ from m3.db import (
2
+ BaseEnumerate,
3
+ )
4
+
5
+
6
+ class RequestResultStatus(BaseEnumerate):
7
+ """Результат выполнения запроса."""
8
+
9
+ SUCCESS = 1
10
+ ERROR = 2
11
+
12
+ values = {
13
+ SUCCESS: 'Успех',
14
+ ERROR: 'Ошибка',
15
+ }
@@ -0,0 +1,100 @@
1
+ from django.db.models import (
2
+ Case,
3
+ CharField,
4
+ F,
5
+ Manager,
6
+ PositiveSmallIntegerField,
7
+ Q,
8
+ Value,
9
+ When,
10
+ )
11
+ from django.db.models.functions import (
12
+ Cast,
13
+ )
14
+
15
+ from edu_rdm_integration.uploader_log.enums import (
16
+ RequestResultStatus,
17
+ )
18
+
19
+
20
+ class UploaderClientLogManager(Manager):
21
+ """Менеджер модели журнала Загрузчика данных в витрину."""
22
+
23
+ def get_queryset(self):
24
+ """Возвращает кварисет."""
25
+ query = super().get_queryset()
26
+
27
+ result_status = Case(
28
+ When(
29
+ Q(Q(error__isnull=True) | Q(error__exact=''))
30
+ & Q(Q(response__isnull=False) & ~Q(response__exact='')),
31
+ then=Value(RequestResultStatus.SUCCESS)
32
+ ),
33
+ default=Value(RequestResultStatus.ERROR),
34
+ output_field=PositiveSmallIntegerField(),
35
+ )
36
+
37
+ query = query.annotate(
38
+ request_datetime=F('date_time'),
39
+ attachment_file=Case(
40
+ When(
41
+ request__icontains='POST',
42
+ then=F('uploader_client_log__attachment__attachment')
43
+ ),
44
+ When(
45
+ request__icontains='GET',
46
+ then=F('upload_status_request_log__upload__attachment__attachment'),
47
+ ),
48
+ default=Value('')
49
+ ),
50
+ status_code=Case(
51
+ When(
52
+ request__icontains='POST',
53
+ then=Value('', output_field=CharField())
54
+ ),
55
+ When(
56
+ request__icontains='GET',
57
+ then=Cast(
58
+ 'upload_status_request_log__status__code',
59
+ output_field=CharField()
60
+ ),
61
+ ),
62
+ default=Value('')
63
+ ),
64
+ status_description=Case(
65
+ When(
66
+ request__icontains='POST',
67
+ then=Value('', output_field=CharField()),
68
+ ),
69
+ When(
70
+ request__icontains='GET',
71
+ then=F('upload_status_request_log__status__description'),
72
+ ),
73
+ default=Value('')
74
+ ),
75
+ is_emulation=Case(
76
+ When(
77
+ request__icontains='POST',
78
+ then=F('uploader_client_log__is_emulation'),
79
+ ),
80
+ When(
81
+ request__icontains='GET',
82
+ then=F('upload_status_request_log__upload__is_emulation'),
83
+ ),
84
+ default=Value(False)
85
+ ),
86
+ request_id=Case(
87
+ When(
88
+ request__icontains='POST',
89
+ then=F('uploader_client_log__request_id')
90
+ ),
91
+ When(
92
+ request__icontains='GET',
93
+ then=F('upload_status_request_log__upload__request_id')
94
+ ),
95
+ default=Value('')
96
+ ),
97
+ result_status=result_status
98
+ )
99
+
100
+ return query
@@ -0,0 +1,64 @@
1
+ from m3_ext.ui.fields import (
2
+ ExtTextArea,
3
+ )
4
+ from objectpack.ui import (
5
+ BaseEditWindow,
6
+ )
7
+
8
+ from educommon.utils.ui import (
9
+ switch_window_in_read_only_mode,
10
+ )
11
+
12
+
13
+ class UploaderLogInfoWindow(BaseEditWindow):
14
+ """Окно просмотра лога Загрузчика данных в витрину."""
15
+
16
+ def _init_components(self):
17
+ """Инициализация компонентов окна."""
18
+ super(UploaderLogInfoWindow, self)._init_components()
19
+
20
+ self.field__request = ExtTextArea(
21
+ label='Запрос',
22
+ name='request',
23
+ anchor='100%',
24
+ height=160,
25
+ )
26
+ self.field__response = ExtTextArea(
27
+ label='Ответ',
28
+ name='response',
29
+ anchor='100%',
30
+ height=160,
31
+ )
32
+ self.field__error = ExtTextArea(
33
+ label='Ошибка',
34
+ name='request_error',
35
+ anchor='100%',
36
+ height=80,
37
+ )
38
+ self.field__attachment = ExtTextArea(
39
+ label='Вложения',
40
+ name='attachment_file',
41
+ anchor='100%',
42
+ height=40,
43
+ )
44
+
45
+ def _do_layout(self):
46
+ """Размещение компонентов окна на форме."""
47
+ super(UploaderLogInfoWindow, self)._do_layout()
48
+
49
+ self.form.items.extend((
50
+ self.field__request,
51
+ self.field__response,
52
+ self.field__error,
53
+ self.field__attachment,
54
+ ))
55
+
56
+ def set_params(self, params):
57
+ """Настройка окна."""
58
+ super(UploaderLogInfoWindow, self).set_params(params)
59
+
60
+ self.height = 'auto'
61
+ self.width = 700
62
+
63
+ switch_window_in_read_only_mode(self)
64
+ self.make_read_only()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edu-rdm-integration
3
- Version: 0.7.3
3
+ Version: 0.8.0
4
4
  Summary: Интеграция с Региональной витриной данных
5
5
  Home-page:
6
6
  Download-URL:
@@ -28,7 +28,7 @@ Requires-Dist: setuptools <69,>=47.3.1
28
28
  Requires-Dist: wheel <0.42,>=0.37.1
29
29
  Requires-Dist: transliterate <2
30
30
  Requires-Dist: Django <2.3,>=1.11
31
- Requires-Dist: educommon <4,>=3.0.0
31
+ Requires-Dist: educommon <4,>=3.6.0
32
32
  Requires-Dist: function-tools <1,>=0.8.0
33
33
  Requires-Dist: m3-db-utils <1,>=0.3.8
34
34
  Requires-Dist: uploader-client <1,>=0.2.1
@@ -289,6 +289,16 @@ Requires-Dist: uploader-client <1,>=0.2.1
289
289
 
290
290
  ### Удалено
291
291
 
292
+ ## [0.8.0] - 2023-12-05
293
+
294
+ Вынесен функционал просмотра логов РВД из ЭШ.
295
+
296
+ ### Изменено
297
+
298
+ - [EDUCLLG-7736](https://jira.bars.group/browse/EDUCLLG-7736)
299
+ MINOR Вынесен функционал просмотра логов РВД из ЭШ.
300
+
301
+
292
302
  ## [0.7.3] - 2023-12-07
293
303
 
294
304
  Исправлена аннотация в шаблоне managers.py-tpl для функции экспорта.
@@ -298,6 +308,7 @@ Requires-Dist: uploader-client <1,>=0.2.1
298
308
  - [EDUSCHL-19604](https://jira.bars.group/browse/EDUSCHL-19604)
299
309
  PATCH Исправлена аннотация в шаблоне managers.py-tpl для функции экспорта.
300
310
 
311
+
301
312
  ## [0.7.2] - 2023-12-05
302
313
 
303
314
  В метод _clean_data класса BaseCollectingFunctionTestCase добавлена возможность обрабатывать поля относящиеся к
@@ -312,6 +323,7 @@ Requires-Dist: uploader-client <1,>=0.2.1
312
323
  - [EDUSCHL-19507](https://jira.bars.group/browse/EDUSCHL-19507)
313
324
  PATCH Добавление обработки plugins_info при генерации списка данных формирования команд.
314
325
 
326
+
315
327
  ## [0.7.1] - 2023-12-02
316
328
 
317
329
  Доработано получение множества моделей на основе данных plugins_info при работе метода _get_loggable_models.
@@ -321,6 +333,7 @@ Requires-Dist: uploader-client <1,>=0.2.1
321
333
  - [EDUSCHL-19576](https://jira.bars.group/browse/EDUSCHL-20954)
322
334
  PATCH Доработано получение множества моделей на основе данных plugins_info при работе метода _get_loggable_models.
323
335
 
336
+
324
337
  ## [0.7.0] - 2023-12-02
325
338
 
326
339
  Добавлено формирование логов для последующего скачивания.
@@ -5,7 +5,7 @@ edu_rdm_integration/consts.py,sha256=chOsPOOY4_JLzN-8idg-VjbLWSlp6r3maFWqnvUsapg
5
5
  edu_rdm_integration/entities.py,sha256=mAjsYlcIbemo4xT5CSCr4payZubiBHB7Rb3Ow1CVsy0,14552
6
6
  edu_rdm_integration/enums.py,sha256=fnDPz6pwOYWS6vp65IAExbpDzn2q9U3_9GGyuf4B468,4876
7
7
  edu_rdm_integration/mapping.py,sha256=bwa2fJCbV4YjQcAgRrgT3hgM6dJhr_uBtQgx3L3F2Ck,473
8
- edu_rdm_integration/models.py,sha256=eUlR0DUIXcvr2yy_b0GZA6Jv__X9_iWyUsJhDMKwFDk,24976
8
+ edu_rdm_integration/models.py,sha256=EqLDzsmuSLRcVbAPgySMRhnuRtgKFQaOri4ffl2sEKE,26702
9
9
  edu_rdm_integration/signals.py,sha256=3eRlpkDcFCF6TN80-QM8yBYLcyozzcmoPjz6r4_ApWg,73
10
10
  edu_rdm_integration/storages.py,sha256=o5WqUG7SnkeuMt-z8spUi-IraivST-7KHzfY-M3v7FA,6807
11
11
  edu_rdm_integration/utils.py,sha256=vjme0N6tEXnHt6SaqjavZshjwc-mVv4X3Pz37a5YgTw,7092
@@ -134,10 +134,17 @@ edu_rdm_integration/management/commands/export_entities_data.py,sha256=Mas1zwsH-
134
134
  edu_rdm_integration/migrations/0001_initial.py,sha256=toNuYoHZePe5wJ6AKEW9oPOdt2OefmxDEDDJGYQIrFk,18719
135
135
  edu_rdm_integration/migrations/0002_init_data_uploadstatus.py,sha256=kht966YNuDbC3qTGrcWswJPsVuAtNO59Ck15G2eS2bU,944
136
136
  edu_rdm_integration/migrations/0003_create_index_file_upload_status.py,sha256=TiLnqQ8bxkVI7sRa5-D3JQ6jopFYDoH1ytSxmU6USUo,735
137
+ edu_rdm_integration/migrations/0004_uploaderclientlog.py,sha256=Llw_cqPpYJSrbEuEsFraUWKrBSq_tFbGzTlO2DnqOKg,626
137
138
  edu_rdm_integration/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
- edu_rdm_integration-0.7.3.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
139
- edu_rdm_integration-0.7.3.dist-info/METADATA,sha256=dHBj9zCUB1ItOamUJwryZtnvS7SpyILsA9uCs51JCOc,44816
140
- edu_rdm_integration-0.7.3.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
141
- edu_rdm_integration-0.7.3.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
142
- edu_rdm_integration-0.7.3.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
143
- edu_rdm_integration-0.7.3.dist-info/RECORD,,
139
+ edu_rdm_integration/uploader_log/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
+ edu_rdm_integration/uploader_log/actions.py,sha256=CIFfmft5m7Nnl_9Drw7FdCVWr9htKJcbcimb4Dcl3EQ,6568
141
+ edu_rdm_integration/uploader_log/apps.py,sha256=tYJj4-sDlq8fLOSvw18L_yys7SILpTKWNmE2Qug6GnE,265
142
+ edu_rdm_integration/uploader_log/enums.py,sha256=rgSO3BL2rh2xpfm0Pt4waQW8fB1VMJLdsGmr3SXwH_U,266
143
+ edu_rdm_integration/uploader_log/managers.py,sha256=Oe2R1G2toEdaEh9ftU1_5s9-t_VFIXgR0TlvbIZyosk,3166
144
+ edu_rdm_integration/uploader_log/ui.py,sha256=i3q4dNYiKPcZMP3QgbKFD0aTysBntXE-Hu_B6nSjrYU,1789
145
+ edu_rdm_integration-0.8.0.dist-info/LICENSE,sha256=uw43Gjjj-1vXWCItfSrNDpbejnOwZMrNerUh8oWbq8Q,3458
146
+ edu_rdm_integration-0.8.0.dist-info/METADATA,sha256=gzs_8o4A12ziXqhjwWP4BBwN5h3yma-2xSk1vQDVuzY,45107
147
+ edu_rdm_integration-0.8.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
148
+ edu_rdm_integration-0.8.0.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
149
+ edu_rdm_integration-0.8.0.dist-info/top_level.txt,sha256=nRJV0O14UtNE-jGIYG03sohgFnZClvf57H5m6VBXe9Y,20
150
+ edu_rdm_integration-0.8.0.dist-info/RECORD,,