documente_shared 0.1.80__py3-none-any.whl → 0.1.81__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 documente_shared might be problematic. Click here for more details.
- documente_shared/application/payloads.py +14 -0
- documente_shared/domain/entities/in_memory_result.py +15 -11
- documente_shared/domain/entities/processing_case.py +14 -24
- documente_shared/domain/entities/processing_case_item.py +4 -1
- documente_shared/infrastructure/repositories/http_processing_case.py +11 -4
- {documente_shared-0.1.80.dist-info → documente_shared-0.1.81.dist-info}/METADATA +1 -1
- {documente_shared-0.1.80.dist-info → documente_shared-0.1.81.dist-info}/RECORD +8 -7
- {documente_shared-0.1.80.dist-info → documente_shared-0.1.81.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def camel_to_snake_key(name: str) -> str:
|
|
5
|
+
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
|
|
6
|
+
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
|
|
7
|
+
|
|
8
|
+
def camel_to_snake(data: dict | list) -> dict | list:
|
|
9
|
+
if isinstance(data, dict):
|
|
10
|
+
return {camel_to_snake_key(k): camel_to_snake(v) for k, v in data.items()}
|
|
11
|
+
elif isinstance(data, list):
|
|
12
|
+
return [camel_to_snake(item) for item in data]
|
|
13
|
+
else:
|
|
14
|
+
return data
|
|
@@ -11,6 +11,7 @@ from documente_shared.application.files import (
|
|
|
11
11
|
class InMemoryDocument(object):
|
|
12
12
|
file_path: Optional[str] = None
|
|
13
13
|
file_bytes: Optional[bytes] = None
|
|
14
|
+
file_base64: Optional[str] = None
|
|
14
15
|
|
|
15
16
|
@property
|
|
16
17
|
def is_valid(self) -> bool:
|
|
@@ -18,13 +19,7 @@ class InMemoryDocument(object):
|
|
|
18
19
|
|
|
19
20
|
@property
|
|
20
21
|
def has_content(self) -> bool:
|
|
21
|
-
return bool(self.file_bytes)
|
|
22
|
-
|
|
23
|
-
@property
|
|
24
|
-
def file_key(self) -> Optional[str]:
|
|
25
|
-
if not self.file_path:
|
|
26
|
-
return None
|
|
27
|
-
return remove_slash_from_path(self.file_path)
|
|
22
|
+
return bool(self.file_bytes) or bool(self.file_base64)
|
|
28
23
|
|
|
29
24
|
@property
|
|
30
25
|
def file_name(self) -> Optional[str]:
|
|
@@ -32,20 +27,29 @@ class InMemoryDocument(object):
|
|
|
32
27
|
return None
|
|
33
28
|
return get_filename_from_path(self.file_path)
|
|
34
29
|
|
|
30
|
+
@property
|
|
31
|
+
def file_key(self) -> Optional[str]:
|
|
32
|
+
return self.file_name
|
|
33
|
+
|
|
35
34
|
@property
|
|
36
35
|
def is_procesable(self) -> bool:
|
|
37
36
|
return self.is_valid and self.has_content
|
|
38
37
|
|
|
39
38
|
@property
|
|
40
39
|
def to_dict(self) -> dict:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
'
|
|
44
|
-
|
|
40
|
+
data = dict()
|
|
41
|
+
if self.file_path:
|
|
42
|
+
data['file_path'] = remove_slash_from_path(self.file_path)
|
|
43
|
+
if self.file_bytes:
|
|
44
|
+
data['file_bytes'] = self.file_bytes.decode('utf-8')
|
|
45
|
+
if self.file_base64:
|
|
46
|
+
data['file_base64'] = self.file_base64
|
|
47
|
+
return data
|
|
45
48
|
|
|
46
49
|
@classmethod
|
|
47
50
|
def from_dict(cls, data: dict):
|
|
48
51
|
return cls(
|
|
49
52
|
file_path=data.get('file_path'),
|
|
50
53
|
file_bytes=data.get('file_bytes'),
|
|
54
|
+
file_base64=data.get('file_base64'),
|
|
51
55
|
)
|
|
@@ -96,37 +96,18 @@ class ProcessingCase(object):
|
|
|
96
96
|
|
|
97
97
|
@property
|
|
98
98
|
def to_persist_dict(self) -> dict:
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
self,
|
|
103
|
-
new_instance: 'ProcessingCase',
|
|
104
|
-
properties: List[str] = None,
|
|
105
|
-
):
|
|
106
|
-
instance_properties = properties or [
|
|
107
|
-
'label',
|
|
108
|
-
'status',
|
|
109
|
-
'category',
|
|
110
|
-
'enqueued_at',
|
|
111
|
-
'started_at',
|
|
112
|
-
'failed_at',
|
|
113
|
-
'feedback',
|
|
114
|
-
'completed_at',
|
|
115
|
-
'metadata',
|
|
116
|
-
'items',
|
|
99
|
+
persist_data = self.to_dict
|
|
100
|
+
persist_data["items"] = [
|
|
101
|
+
item.to_persist_dict for item in self.items
|
|
117
102
|
]
|
|
118
|
-
|
|
119
|
-
property_value = getattr(new_instance, _property)
|
|
120
|
-
if not hasattr(self, _property):
|
|
121
|
-
continue
|
|
122
|
-
setattr(self, _property, property_value)
|
|
123
|
-
return self
|
|
103
|
+
return persist_data
|
|
124
104
|
|
|
125
105
|
@classmethod
|
|
126
106
|
def from_dict(cls, data: dict) -> 'ProcessingCase':
|
|
127
107
|
return cls(
|
|
128
108
|
uuid=data.get('uuid'),
|
|
129
109
|
name=data.get('label'),
|
|
110
|
+
tenant_slug=data.get('tenant_slug'),
|
|
130
111
|
status=ProcessingStatus.from_value(data.get('status')),
|
|
131
112
|
case_type=(
|
|
132
113
|
ProcessingCaseType.from_value(data.get('category'))
|
|
@@ -143,3 +124,12 @@ class ProcessingCase(object):
|
|
|
143
124
|
for item_dict in data.get('items', [])
|
|
144
125
|
],
|
|
145
126
|
)
|
|
127
|
+
|
|
128
|
+
@classmethod
|
|
129
|
+
def from_persist_dict(cls, data: dict) -> 'ProcessingCase':
|
|
130
|
+
instance = cls.from_dict(data)
|
|
131
|
+
instance.items = [
|
|
132
|
+
ProcessingCaseItem.from_persist_dict(item_dict)
|
|
133
|
+
for item_dict in data.get('items', [])
|
|
134
|
+
]
|
|
135
|
+
return instance
|
|
@@ -205,7 +205,10 @@ class ProcessingCaseItem(object):
|
|
|
205
205
|
case_id=data.get('case_id'),
|
|
206
206
|
digest=data.get('digest'),
|
|
207
207
|
status=ProcessingStatus.from_value(data.get('status')),
|
|
208
|
-
document=
|
|
208
|
+
document=(
|
|
209
|
+
InMemoryDocument.from_dict(data.get('document'))
|
|
210
|
+
if data.get('document') else None
|
|
211
|
+
),
|
|
209
212
|
document_type=(
|
|
210
213
|
ProcessingDocumentType.from_value(data.get('document_type'))
|
|
211
214
|
if data.get('document_type') else None
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
from typing import List, Optional
|
|
3
3
|
|
|
4
|
+
from documente_shared.application.payloads import camel_to_snake
|
|
4
5
|
from documente_shared.domain.entities.processing_case import ProcessingCase
|
|
5
6
|
from documente_shared.domain.entities.processing_case_filters import ProcessingCaseFilters
|
|
6
7
|
from documente_shared.domain.repositories.processing_case import ProcessingCaseRepository
|
|
@@ -15,7 +16,9 @@ class HttpProcessingCaseRepository(
|
|
|
15
16
|
def find(self, uuid: str, include_items: bool = False) -> Optional[ProcessingCase]:
|
|
16
17
|
response = self.session.get(f"{self.api_url}/v1/processing-cases/{uuid}/")
|
|
17
18
|
if response.status_code == 200:
|
|
18
|
-
|
|
19
|
+
response_json = response.json()
|
|
20
|
+
instance_data = response_json.get('data', {})
|
|
21
|
+
return ProcessingCase.from_persist_dict(camel_to_snake(instance_data))
|
|
19
22
|
return None
|
|
20
23
|
|
|
21
24
|
def persist(self, instance: ProcessingCase) -> ProcessingCase:
|
|
@@ -25,7 +28,10 @@ class HttpProcessingCaseRepository(
|
|
|
25
28
|
)
|
|
26
29
|
if response.status_code not in [200, 201]:
|
|
27
30
|
raise Exception(f'Error persisting processing case: {response.text}')
|
|
28
|
-
|
|
31
|
+
|
|
32
|
+
response_json = response.json()
|
|
33
|
+
instance_data = response_json.get('data', {})
|
|
34
|
+
return ProcessingCase.from_persist_dict(camel_to_snake(instance_data))
|
|
29
35
|
|
|
30
36
|
def remove(self, instance: ProcessingCase):
|
|
31
37
|
self.session.delete(f"{self.api_url}/v1/processing-cases/{instance.uuid}/")
|
|
@@ -39,8 +45,9 @@ class HttpProcessingCaseRepository(
|
|
|
39
45
|
)
|
|
40
46
|
if response.status_code == 200:
|
|
41
47
|
raw_response = response.json()
|
|
48
|
+
instaces_data = raw_response.get('data', [])
|
|
42
49
|
return [
|
|
43
|
-
ProcessingCase.
|
|
44
|
-
for
|
|
50
|
+
ProcessingCase.from_persist_dict(item_data)
|
|
51
|
+
for item_data in camel_to_snake(instaces_data)
|
|
45
52
|
]
|
|
46
53
|
return []
|
|
@@ -3,6 +3,7 @@ documente_shared/application/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
|
|
|
3
3
|
documente_shared/application/digest.py,sha256=Um6E8WfFri2_lly4RFWydJyvSfPZGFcOX-opEOzDCWc,172
|
|
4
4
|
documente_shared/application/exceptions.py,sha256=lQM8m7wmI9OTLGva0gd7s7YT7ldaTk_Ln4t32PpzNf8,654
|
|
5
5
|
documente_shared/application/files.py,sha256=ADiWi6Mk3YQGx3boGsDqdb5wk8qmabkGRy7bhNFa1OY,649
|
|
6
|
+
documente_shared/application/payloads.py,sha256=s6SjaNN18_aQ6IL083Zq2J8thRCZ_zC2sn7hkfjK_Go,453
|
|
6
7
|
documente_shared/application/query_params.py,sha256=JscPqFBx28p-x9i2g6waY7Yl4FQM1zn2zSbEoTrkK1k,3938
|
|
7
8
|
documente_shared/application/time_utils.py,sha256=_fxgh8VoGPkdsft47COJ16vFwt8pMbHIJCgDFHLSlrU,435
|
|
8
9
|
documente_shared/application/timezone.py,sha256=NHpzTzOPD_fWQiJ4BrRqt_TIDs5XyB5ZMR7x8vUk8gQ,183
|
|
@@ -12,10 +13,10 @@ documente_shared/domain/constants.py,sha256=NG5BGaXBr_FnzudjTRPxpDpyiSDdaB_PLCdl
|
|
|
12
13
|
documente_shared/domain/entities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
14
|
documente_shared/domain/entities/document.py,sha256=AthTUyA-QZE3WAT7lMoKVr_Z8mO_3qERuCnZge0DTLQ,12595
|
|
14
15
|
documente_shared/domain/entities/document_metadata.py,sha256=ygyFIC5qwxlm8DUM5kvVFny9zJfPQS8vNLM2br5XsQ8,2353
|
|
15
|
-
documente_shared/domain/entities/in_memory_result.py,sha256=
|
|
16
|
-
documente_shared/domain/entities/processing_case.py,sha256=
|
|
16
|
+
documente_shared/domain/entities/in_memory_result.py,sha256=0sLNUrovKFQx4M-E9e4DrAiVgch2i4AKA-9BQBRaeI8,1482
|
|
17
|
+
documente_shared/domain/entities/processing_case.py,sha256=59fhosBfKh9ijWRDTkdN9agV3Qa_AIwjHEWU6FBPF4k,4978
|
|
17
18
|
documente_shared/domain/entities/processing_case_filters.py,sha256=FgyxB4mQb0nEGjIbUB9OiazkKL4yHRRC6bvmjD5NT8k,1915
|
|
18
|
-
documente_shared/domain/entities/processing_case_item.py,sha256=
|
|
19
|
+
documente_shared/domain/entities/processing_case_item.py,sha256=5BqKAv56R3tba0_rPdYtiTCpJ9ytP-JEjkCZgr1cjh0,9660
|
|
19
20
|
documente_shared/domain/entities/processing_case_item_filters.py,sha256=-cAQTSWOepMMcGCBg2X3dd0W_8XHuBTlvOB1d-3sVVM,1971
|
|
20
21
|
documente_shared/domain/entities/processing_event.py,sha256=m1O0gcNaE_SszeIhxM3uYPHSpyOUmize6mfRw1_bYZo,1723
|
|
21
22
|
documente_shared/domain/enums/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -33,10 +34,10 @@ documente_shared/infrastructure/repositories/__init__.py,sha256=47DEQpj8HBSa-_TI
|
|
|
33
34
|
documente_shared/infrastructure/repositories/dynamo_document.py,sha256=_Yp4gtA-n-hJ2w2wAM5BMCs2Mf46Q2Kq3eHqlxudkL4,1443
|
|
34
35
|
documente_shared/infrastructure/repositories/dynamo_processing_case.py,sha256=IoIHtlaEe4G5TqIV9IvG45a3HRBVHLfNC9sSgQjabUk,1464
|
|
35
36
|
documente_shared/infrastructure/repositories/dynamo_processing_case_item.py,sha256=4guM8V3YfP7kzYcuVWunGJGmXi0kSSUW8otks39g1vs,1754
|
|
36
|
-
documente_shared/infrastructure/repositories/http_processing_case.py,sha256
|
|
37
|
+
documente_shared/infrastructure/repositories/http_processing_case.py,sha256=zeGkuvF1SZMyDOUunp93fhn7lS61NQKa1GBcNF8dzZU,2251
|
|
37
38
|
documente_shared/infrastructure/repositories/http_processing_case_item.py,sha256=OSkOd7WdksS4O75uALU530kCsLkpjRTEBCmg3wg0ZFY,2110
|
|
38
39
|
documente_shared/infrastructure/s3_bucket.py,sha256=vT_yN42RFQXubtUn8ln-j13Os_-25UGClVtXg5Bkv6I,1932
|
|
39
40
|
documente_shared/infrastructure/sqs_queue.py,sha256=KZWeHZ9zmXmrxoNpOQX7GEdDhZ1knbPXgwSwFwJblGg,1504
|
|
40
|
-
documente_shared-0.1.
|
|
41
|
-
documente_shared-0.1.
|
|
42
|
-
documente_shared-0.1.
|
|
41
|
+
documente_shared-0.1.81.dist-info/METADATA,sha256=cPO-JJd3KwUjCci_9-5KKWqrDSokT-x2VCNZpoBW_Rk,881
|
|
42
|
+
documente_shared-0.1.81.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
43
|
+
documente_shared-0.1.81.dist-info/RECORD,,
|
|
File without changes
|