Skip to content

Commit 835e706

Browse files
Merge branch 'main' into feature/TED-1168
2 parents ac57fea + 2d992ec commit 835e706

45 files changed

Lines changed: 956 additions & 345 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
uvicorn[standard]
1+
uvicorn[standard]

requirements.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ deepdiff~=5.7.0
55
jinja2~=3.1.2
66
python-dotenv~=0.19.2
77
pymongo~=4.0.1
8-
apache-airflow==2.4.3
8+
apache-airflow~=2.5.1
99
hvac==0.11.2
1010
SPARQLWrapper==1.8.5
1111
pandas==1.5.1
@@ -25,4 +25,5 @@ ordered-set~=4.0.2
2525
json2html~=1.3.0
2626
minio~=7.1.1
2727
certifi
28-
networkx~=2.8.8
28+
networkx~=2.8.8
29+
shortuuid~=1.0.11

sonar-project.properties

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ sonar.links.scm=https://github.com/OP-TED/ted-rdf-conversion-pipeline
2323
sonar.links.issue=https://github.com/OP-TED/ted-rdf-conversion-pipeline/issues
2424

2525
sonar.tests=tests
26-
# sonar.login=67bcbf1aefb992993fdd45b78fb4977a05be39b9
2726
# sonar.host.url=https://sonarcloud.io
2827

2928
sonar.python.pylint=/usr/local/bin/pylint

ted_sws/core/model/lazy_object.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import abc
2+
from typing import Optional, Any
3+
4+
5+
class LazyObjectFieldsLoaderABC(abc.ABC):
6+
7+
@abc.abstractmethod
8+
def load_lazy_field(self, source_object: Any, property_field: property) -> Any:
9+
"""
10+
11+
:param source_object:
12+
:param property_field:
13+
:return:
14+
"""
15+
16+
@abc.abstractmethod
17+
def remove_lazy_field(self, source_object: Any, property_field: property):
18+
"""
19+
20+
:param source_object:
21+
:param property_field:
22+
:return:
23+
"""
24+
25+
26+
class LazyObjectABC(abc.ABC):
27+
28+
@abc.abstractmethod
29+
def set_lazy_object_fields_loader(self, lazy_object_fields_loader: LazyObjectFieldsLoaderABC):
30+
"""
31+
32+
:param lazy_object_fields_loader:
33+
:return:
34+
"""
35+
36+
@abc.abstractmethod
37+
def get_lazy_object_fields_loader(self) -> Optional[LazyObjectFieldsLoaderABC]:
38+
"""
39+
40+
:return:
41+
"""
42+
43+
def load_lazy_field(self, property_field: property):
44+
"""
45+
46+
:param property_field:
47+
:return:
48+
"""
49+
if self.get_lazy_object_fields_loader():
50+
return self.get_lazy_object_fields_loader().load_lazy_field(source_object=self,
51+
property_field=property_field)
52+
return None
53+
54+
def remove_lazy_field(self, property_field: property):
55+
"""
56+
57+
:param property_field:
58+
:return:
59+
"""
60+
if self.get_lazy_object_fields_loader():
61+
self.get_lazy_object_fields_loader().remove_lazy_field(source_object=self,
62+
property_field=property_field)

ted_sws/core/model/metadata.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,31 @@ class NormalisedMetadata(Metadata):
8282
xsd_version: str
8383

8484

85+
class NormalisedMetadataView(Metadata):
86+
title: str
87+
long_title: str
88+
notice_publication_number: str
89+
publication_date: str
90+
ojs_issue_number: str
91+
ojs_type: str
92+
city_of_buyer: Optional[str]
93+
name_of_buyer: Optional[str]
94+
original_language: Optional[str]
95+
country_of_buyer: Optional[str]
96+
eu_institution: Optional[bool]
97+
document_sent_date: Optional[str]
98+
deadline_for_submission: Optional[str]
99+
notice_type: str
100+
form_type: str
101+
place_of_performance: Optional[List[str]]
102+
extracted_legal_basis_directive: Optional[str]
103+
legal_basis_directive: str
104+
form_number: str
105+
eforms_subtype: str
106+
xsd_version: str
107+
108+
109+
85110
class TEDMetadata(Metadata):
86111
"""
87112
Stores notice original metadata

ted_sws/core/model/notice.py

Lines changed: 76 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from __future__ import annotations
1414

1515
import abc
16+
from abc import ABC
1617
from datetime import datetime
1718
from enum import IntEnum
1819
from functools import total_ordering
@@ -21,6 +22,7 @@
2122
from pydantic import Field
2223

2324
from ted_sws.core.model import PropertyBaseModel
25+
from ted_sws.core.model.lazy_object import LazyObjectABC, LazyObjectFieldsLoaderABC
2426
from ted_sws.core.model.manifestation import METSManifestation, RDFManifestation, XMLManifestation, \
2527
RDFValidationManifestation, SPARQLTestSuiteValidationReport, SHACLTestSuiteValidationReport, \
2628
XPATHCoverageValidationReport, XMLValidationManifestation, ValidationSummaryReport
@@ -142,7 +144,26 @@ def update_status_to(self, new_status):
142144
"""
143145

144146

145-
class Notice(WorkExpression):
147+
class LazyWorkExpression(WorkExpression, LazyObjectABC, ABC):
148+
_lazy_object_fields_loader: LazyObjectFieldsLoaderABC = None
149+
150+
def set_lazy_object_fields_loader(self, lazy_object_fields_loader: LazyObjectFieldsLoaderABC):
151+
"""
152+
153+
:param lazy_object_fields_loader:
154+
:return:
155+
"""
156+
self._lazy_object_fields_loader = lazy_object_fields_loader
157+
158+
def get_lazy_object_fields_loader(self) -> Optional[LazyObjectFieldsLoaderABC]:
159+
"""
160+
161+
:return:
162+
"""
163+
return self._lazy_object_fields_loader
164+
165+
166+
class Notice(LazyWorkExpression):
146167
"""
147168
A TED notice in any of its forms across the TED-SWS pipeline. This class is conceptualised as a merger of Work
148169
and Expression in the FRBR class hierarchy and is connected to some of its Manifestations.
@@ -161,36 +182,70 @@ class Notice(WorkExpression):
161182
The original XML manifestation of the notice as downloaded from the TED website.
162183
163184
"""
164-
_status: NoticeStatus = NoticeStatus.RAW # PrivateAttr(default=NoticeStatus.RAW)
185+
_status: NoticeStatus = NoticeStatus.RAW
165186
ted_id: str = Field(..., allow_mutation=False)
166-
original_metadata: Optional[TEDMetadata] = None
167-
xml_manifestation: XMLManifestation = Field(..., allow_mutation=False)
187+
_original_metadata: Optional[TEDMetadata] = None
188+
_xml_manifestation: Optional[XMLManifestation] = None
168189
_normalised_metadata: Optional[NormalisedMetadata] = None
169190
_preprocessed_xml_manifestation: Optional[XMLManifestation] = None
170191
_distilled_rdf_manifestation: Optional[RDFManifestation] = None
171192
_rdf_manifestation: Optional[RDFManifestation] = None
172193
_mets_manifestation: Optional[METSManifestation] = None
173-
xml_metadata: Optional[XMLMetadata] = None
194+
_xml_metadata: Optional[XMLMetadata] = None
174195
validation_summary: Optional[ValidationSummaryReport] = None
175196

197+
@property
198+
def original_metadata(self) -> Optional[TEDMetadata]:
199+
if self._original_metadata is None:
200+
self.load_lazy_field(property_field=Notice.original_metadata)
201+
return self._original_metadata
202+
203+
@property
204+
def xml_manifestation(self) -> XMLManifestation:
205+
if self._xml_manifestation is None:
206+
self.load_lazy_field(property_field=Notice.xml_manifestation)
207+
return self._xml_manifestation
208+
209+
def set_original_metadata(self, ted_metadata: TEDMetadata):
210+
self._original_metadata = ted_metadata
211+
212+
def set_xml_manifestation(self, xml_manifestation: XMLManifestation):
213+
self._xml_manifestation = xml_manifestation
214+
215+
@property
216+
def xml_metadata(self) -> XMLMetadata:
217+
if self._xml_metadata is None:
218+
self.load_lazy_field(property_field=Notice.xml_metadata)
219+
return self._xml_metadata
220+
176221
@property
177222
def preprocessed_xml_manifestation(self) -> XMLManifestation:
223+
if self._preprocessed_xml_manifestation is None:
224+
self.load_lazy_field(property_field=Notice.preprocessed_xml_manifestation)
178225
return self._preprocessed_xml_manifestation
179226

180227
@property
181228
def distilled_rdf_manifestation(self) -> RDFManifestation:
229+
if self._distilled_rdf_manifestation is None:
230+
self.load_lazy_field(property_field=Notice.distilled_rdf_manifestation)
182231
return self._distilled_rdf_manifestation
183232

184233
@property
185234
def normalised_metadata(self) -> NormalisedMetadata:
235+
if self._normalised_metadata is None:
236+
self.load_lazy_field(property_field=Notice.normalised_metadata)
186237
return self._normalised_metadata
187238

188239
@property
189240
def rdf_manifestation(self) -> RDFManifestation:
241+
if self._rdf_manifestation is None:
242+
self.load_lazy_field(property_field=Notice.rdf_manifestation)
190243
return self._rdf_manifestation
191244

192245
@property
193246
def mets_manifestation(self) -> METSManifestation:
247+
if self._mets_manifestation is None:
248+
self.load_lazy_field(property_field=Notice.mets_manifestation)
194249
return self._mets_manifestation
195250

196251
def get_rdf_validation(self) -> Optional[List[RDFValidationManifestation]]:
@@ -225,7 +280,7 @@ def set_xml_metadata(self, xml_metadata: XMLMetadata):
225280
:param xml_metadata:
226281
:return:
227282
"""
228-
self.xml_metadata = xml_metadata
283+
self._xml_metadata = xml_metadata
229284
self.update_status_to(NoticeStatus.INDEXED)
230285

231286
def set_preprocessed_xml_manifestation(self, preprocessed_xml_manifestation: XMLManifestation):
@@ -283,8 +338,8 @@ def _check_status_is_validated(self) -> bool:
283338
284339
:return:
285340
"""
286-
if self._rdf_manifestation and self._distilled_rdf_manifestation and self.xml_manifestation:
287-
if self._distilled_rdf_manifestation.is_validated() and self.xml_manifestation.is_validated():
341+
if self.rdf_manifestation and self.distilled_rdf_manifestation and self.xml_manifestation:
342+
if self.distilled_rdf_manifestation.is_validated() and self.xml_manifestation.is_validated():
288343
return True
289344
return False
290345

@@ -299,7 +354,7 @@ def set_rdf_validation(self, rdf_validation: Union[SPARQLTestSuiteValidationRepo
299354
if not self.rdf_manifestation:
300355
raise ValueError("Cannot set the RDF validation of a non-existent RDF manifestation")
301356

302-
self._rdf_manifestation.add_validation(validation=rdf_validation)
357+
self.rdf_manifestation.add_validation(validation=rdf_validation)
303358

304359
def set_distilled_rdf_validation(self, rdf_validation: Union[SPARQLTestSuiteValidationReport,
305360
SHACLTestSuiteValidationReport]):
@@ -308,10 +363,10 @@ def set_distilled_rdf_validation(self, rdf_validation: Union[SPARQLTestSuiteVali
308363
:param rdf_validation:
309364
:return:
310365
"""
311-
if not self._distilled_rdf_manifestation:
366+
if not self.distilled_rdf_manifestation:
312367
raise ValueError("Cannot set the RDF validation of a non-existent RDF manifestation")
313368

314-
self._distilled_rdf_manifestation.add_validation(validation=rdf_validation)
369+
self.distilled_rdf_manifestation.add_validation(validation=rdf_validation)
315370

316371
if self._check_status_is_validated():
317372
self.update_status_to(NoticeStatus.VALIDATED)
@@ -424,13 +479,22 @@ def update_status_to(self, new_status: NoticeStatus):
424479
raise UnsupportedStatusTransition(
425480
f"Unsupported transition from state {self._status} to state {new_status}.")
426481
elif self._status > new_status:
427-
# TODO: implement delete actions
428482
self._status = new_status
483+
if new_status < NoticeStatus.INDEXED:
484+
self.remove_lazy_field(Notice.xml_metadata)
485+
self._xml_metadata = None
429486
if new_status < NoticeStatus.NORMALISED_METADATA:
487+
self.remove_lazy_field(Notice.normalised_metadata)
430488
self._normalised_metadata = None
489+
#TODO: preprocessed_xml_manifestation is the same as xml_manifestation
490+
# if delete preprocessed xml manifestation will delete xml_manifestation
491+
# in future remove _preprocessed_xml_manifestation field from model
431492
self._preprocessed_xml_manifestation = None
432493
if new_status < NoticeStatus.TRANSFORMED:
494+
self.remove_lazy_field(Notice.rdf_manifestation)
495+
self.remove_lazy_field(Notice.distilled_rdf_manifestation)
433496
self._rdf_manifestation = None
434497
self._distilled_rdf_manifestation = None
435498
if new_status < NoticeStatus.PACKAGED:
499+
self.remove_lazy_field(Notice.mets_manifestation)
436500
self._mets_manifestation = None

0 commit comments

Comments
 (0)