elody 0.0.167__py3-none-any.whl → 0.0.169__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.
elody/csv.py CHANGED
@@ -152,6 +152,7 @@ class CSVMultiObject(CSVParser):
152
152
  self.external_file_sources = (
153
153
  external_file_sources if external_file_sources else []
154
154
  )
155
+ self.line_numbers = []
155
156
  self.__fill_objects_from_csv()
156
157
  self.__rename_top_level_fields()
157
158
 
@@ -161,6 +162,24 @@ class CSVMultiObject(CSVParser):
161
162
  def get_errors(self):
162
163
  return self.errors
163
164
 
165
+ def get_line_numbers(self):
166
+ return self.line_numbers
167
+
168
+ def get_line_number(self, entity_identifier=None, mediafile_identifier=None):
169
+ for line_number, line_info in enumerate(self.line_numbers, start=1):
170
+ if (
171
+ entity_identifier
172
+ and line_info.get("entity_identifier") != entity_identifier
173
+ ):
174
+ continue
175
+ if (
176
+ mediafile_identifier
177
+ and line_info.get("mediafile_identifier") != mediafile_identifier
178
+ ):
179
+ continue
180
+ return line_number
181
+ return None
182
+
164
183
  def set_error(self, type, errors):
165
184
  self.errors[type] = errors
166
185
 
@@ -191,7 +210,27 @@ class CSVMultiObject(CSVParser):
191
210
  def __fill_objects_from_csv(self):
192
211
  indexed_dict = dict()
193
212
  external_mediafiles_ids = []
194
- for row in self.reader:
213
+ for row_number, row in enumerate(self.reader, start=1):
214
+ normalized_mapping = {
215
+ key.lstrip("?"): value for key, value in self.index_mapping.items()
216
+ }
217
+ entity_identifier_column = normalized_mapping.get("entities")
218
+ mediafile_identifier_column = normalized_mapping.get("mediafiles")
219
+ entity_identifier = (
220
+ row.get(entity_identifier_column) if entity_identifier_column else None
221
+ )
222
+ mediafile_identifier = (
223
+ row.get(mediafile_identifier_column)
224
+ if mediafile_identifier_column
225
+ else None
226
+ )
227
+ self.line_numbers.append(
228
+ {
229
+ "line": row_number,
230
+ "entity_identifier": entity_identifier,
231
+ "mediafile_identifier": mediafile_identifier,
232
+ }
233
+ )
195
234
  mandatory_columns = [
196
235
  v for k, v in self.index_mapping.items() if not k.startswith("?")
197
236
  ]
@@ -254,7 +293,6 @@ class CSVMultiObject(CSVParser):
254
293
  key not in self.index_mapping.values()
255
294
  or self.include_indexed_field
256
295
  ) and self.__field_allowed(type, key, value):
257
- # Map the metadata field to a unified key if applicable
258
296
  metadata_info = self.metadata_field_mapping.get(key, {})
259
297
  if metadata_info.get("target") == type or not metadata_info:
260
298
  case_insensitive = metadata_info.get(
@@ -268,7 +306,7 @@ class CSVMultiObject(CSVParser):
268
306
  if options and value not in options:
269
307
  if "invalid_value" not in self.get_errors():
270
308
  self.set_error("invalid_value", list())
271
- message = f'{get_error_code(ErrorCode.INVALID_VALUE, get_write())} | value:{value} | options:{options} - The value "{value}" is invalid, these are the valid values: {options}'
309
+ message = f'{get_error_code(ErrorCode.INVALID_VALUE, get_write())} | value:{value} | options:{options}| line_number:{row_number} - The value "{value}" is invalid, these are the valid values: {options}'
272
310
  self.get_errors()["invalid_value"].append(message)
273
311
 
274
312
  indexed_dict[type][id]["metadata"].append(
elody/error_codes.py CHANGED
@@ -27,7 +27,7 @@ class ErrorCode(Enum):
27
27
  XTENANT_HAS_NO_TENANT_DEFENING_ENTITY = ("1007", ["x_tenant_id"])
28
28
  INSUFFICIENT_PERMISSIONS_WITHOUT_VARS = ("1008", [])
29
29
  NO_GLOBAL_ROLES = ("1009", [])
30
- NO_PERMISSION_TO_TENANT = ("1010", ["tenant_id"])
30
+ NO_PERMISSION_TO_TENANT = ("1010", ["tenant_id", "line_number"])
31
31
  XTENANT_NOT_FOUND = ("1011", ["x_tenant_id"])
32
32
  NO_DOWNLOAD_PERMISSION = ("1012", [])
33
33
 
@@ -71,8 +71,8 @@ class ErrorCode(Enum):
71
71
  INVALID_FORMAT_FOR_TYPE = ("5013", ["type"])
72
72
  NO_METADATA_AVAILABLE_FOR_ITEM = ("5014", ["id"])
73
73
  INVALID_ACCEPT_HEADER = ("5015", [])
74
- INVALID_VALUE = ("5016", ["value", "options"])
75
- ITEM_WITH_VALUE_FOR_KEY_NOT_FOUND = ("5017", ["key", "value"])
74
+ INVALID_VALUE = ("5016", ["value", "options", "line_number"])
75
+ ITEM_WITH_VALUE_FOR_KEY_NOT_FOUND = ("5017", ["key", "value", "line_number"])
76
76
 
77
77
  # Filter error codes
78
78
  NO_MATCHER_FOR_FILTER_REQUEST = ("6001", [])
@@ -89,13 +89,13 @@ class ErrorCode(Enum):
89
89
  # Arches error codes
90
90
  ARCHES_ERROR = ("11000", ["error"])
91
91
  ARCHES_CONNECTION_UNAVAILABLE = ("11001", [])
92
- ARCHES_RECORD_NOT_FOUND = ("11002", ["error_message", "arches_id"])
92
+ ARCHES_RECORD_NOT_FOUND = ("11002", ["error_message", "arches_id", "backend"])
93
93
  ARCHES_RECORD_MISSING_DATA = ("11003", ["arches_id"])
94
94
  ARCHES_RECORD_MISSING_DATA_DC_PUBLISHER = ("11004", ["arches_id"])
95
95
  ARCHES_UNABLE_TO_CREATE_RELATION = ("11005", ["type", "value"])
96
96
 
97
97
  # Digipolis error codes
98
- NO_PERMISSION_TO_CREATE_INSTIUTION = ("12000", ["institution"])
98
+ NO_PERMISSION_TO_CREATE_INSTIUTION = ("12000", ["institution", "line_number"])
99
99
  INSTITUTION_HAS_MISSING_DATA = ("12001", ["institution"])
100
100
  INSTITUTION_NOT_FOUND = ("12002", [])
101
101
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: elody
3
- Version: 0.0.167
3
+ Version: 0.0.169
4
4
  Summary: elody SDK for Python
5
5
  Author-email: Inuits <developers@inuits.eu>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -1,8 +1,8 @@
1
1
  __init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  elody/__init__.py,sha256=d0Q6Fn44e7wFfLabDOBxpcJ1DPKWlFunGYDUBmO-4hA,22
3
3
  elody/client.py,sha256=VFjUUaE9edtK1XuAF5T3ayem2UEBr-Anww8AhITYLdI,8575
4
- elody/csv.py,sha256=zk16zWx8lzQ42TrbHunngdaartNe14Bfe1-uIQqemDg,14197
5
- elody/error_codes.py,sha256=YYCr0nUGAODKfcpLk0nOdyauj-s26lVEbbUAMRwZjHc,4037
4
+ elody/csv.py,sha256=_GrDLzx86QEKtXeC35fJtlYQzI3F4tnZWD6ZoLq7-1I,15679
5
+ elody/error_codes.py,sha256=J4H4HwnHm1v_mNvC3GqRe0aehf_wvvNBEC8bz0m7BZs,4108
6
6
  elody/exceptions.py,sha256=5KSw2sPCZz3lDIJX4LiR2iL9n4m4KIil04D1d3X5rd0,968
7
7
  elody/job.py,sha256=QnN6Q45yqRimziqJX9SHrTVFVvky5mAc1WEza9ia8_w,2811
8
8
  elody/loader.py,sha256=Mr7zyP5DP5psYerf2-DnP90GiqtFlKZpcLIPD7P4pSU,5242
@@ -40,8 +40,8 @@ tests/data.py,sha256=Q3oxduf-E3m-Z5G_p3fcs8jVy6g10I7zXKL1m94UVMI,2906
40
40
  tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  tests/unit/test_csv.py,sha256=NQaOhehfQ4GuXku0Y1SA8DYjJeqqidbF50zEHAi8RZA,15923
42
42
  tests/unit/test_utils.py,sha256=g63szcEZyHhCOtrW4BnNbcgVca3oYPIOLjBdIzNwwN0,8784
43
- elody-0.0.167.dist-info/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
44
- elody-0.0.167.dist-info/METADATA,sha256=WDR9F0wh7qfGMhJcggMEBW073X4s0OEZJZZYioPn68g,23336
45
- elody-0.0.167.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
46
- elody-0.0.167.dist-info/top_level.txt,sha256=E0mImupLj0KmtUUCXRYEoLDRaSkuiGaOIIseAa0oQ-M,21
47
- elody-0.0.167.dist-info/RECORD,,
43
+ elody-0.0.169.dist-info/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
44
+ elody-0.0.169.dist-info/METADATA,sha256=93fhBR_FTxjD4itq3pXkxFIfkD2OjSatN3XySi5r8Fk,23336
45
+ elody-0.0.169.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
46
+ elody-0.0.169.dist-info/top_level.txt,sha256=E0mImupLj0KmtUUCXRYEoLDRaSkuiGaOIIseAa0oQ-M,21
47
+ elody-0.0.169.dist-info/RECORD,,