1313from __future__ import annotations
1414
1515import abc
16+ from abc import ABC
1617from datetime import datetime
1718from enum import IntEnum
1819from functools import total_ordering
2122from pydantic import Field
2223
2324from ted_sws .core .model import PropertyBaseModel
25+ from ted_sws .core .model .lazy_object import LazyObjectABC , LazyObjectFieldsLoaderABC
2426from 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