@@ -294,7 +294,7 @@ def set_work(self, work: "Work | None"):
294294 if work :
295295 work .editions .add (self )
296296
297- def merge_to (self , to_item : "Edition | None" ): # type: ignore[reportIncompatibleMethodOverride]
297+ def merge_to (self , to_item ):
298298 super ().merge_to (to_item )
299299 if to_item :
300300 if self .merge_title ():
@@ -314,45 +314,24 @@ def delete(self, *args, **kwargs):
314314 self .set_work (None )
315315 return super ().delete (* args , ** kwargs )
316316
317- def update_linked_items_from_external_resource (self , resource ):
318- """add Work from resource.metadata['work'] if not yet"""
319- links = resource .required_resources + resource .related_resources
320- for w in links :
321- if w .get ("model" ) == "Work" :
322- work_res = ExternalResource .objects .filter (
323- id_type = w ["id_type" ], id_value = w ["id_value" ]
324- ).first ()
325- if work_res :
326- work = work_res .item
327- if not work :
328- logger .warning (f"Unable to find work for { work_res } " )
329- else :
330- logger .warning (
331- f"Unable to find resource for { w ['id_type' ]} :{ w ['id_value' ]} "
332- )
333- work = Work .objects .filter (
334- primary_lookup_id_type = w ["id_type" ],
335- primary_lookup_id_value = w ["id_value" ],
336- ).first ()
337- if work :
338- w = self .get_work ()
339- if w :
340- if w != work :
341- w .log_action (
342- {"!link_and_merge" : [str (self ), str (resource )]}
343- )
344- logger .info (
345- f"Merging { work } to { w } when fetching from { resource } "
346- )
347- work .merge_to (w )
348- else :
349- self .set_work (work )
350-
351- def merge_data_from_external_resource (
352- self , p : "ExternalResource" , ignore_existing_content : bool = False
353- ):
354- super ().merge_data_from_external_resource (p , ignore_existing_content )
355- self .merge_title ()
317+ def process_fetched_item (self , fetched , link_type ):
318+ if link_type == ExternalResource .LinkType .PARENT and isinstance (fetched , Work ):
319+ w = self .get_work ()
320+ if w :
321+ if w == fetched :
322+ return False
323+ w .log_action ({"!merge_on_fetch" : [str (self ), str (fetched )]})
324+ logger .info (f"Merging { fetched } to { w } when fetched { self } ." )
325+ fetched .merge_to (w )
326+ else :
327+ self .set_work (fetched )
328+ return True
329+ return False
330+
331+ def normalize_metadata (self , override_resources = []):
332+ r = super ().normalize_metadata (override_resources )
333+ r |= self .merge_title ()
334+ return r
356335
357336 def merge_title (self ) -> bool :
358337 # Edition should have only one title, so extra titles will be merged to other_title, return True if updated
@@ -491,13 +470,13 @@ def lookup_id_type_choices(cls):
491470 ]
492471 return [(i .value , i .label ) for i in id_types ]
493472
494- def merge_to (self , to_item : "Work | None" ): # type: ignore[reportIncompatibleMethodOverride]
473+ def merge_to (self , to_item ):
495474 super ().merge_to (to_item )
496475 if not to_item :
497476 return
498477 for edition in self .editions .all ():
499478 edition .set_work (to_item )
500- to_item .language = uniq (to_item .language + self .language ) # type: ignore
479+ to_item .language = uniq (to_item .language + self .language )
501480 to_item .localized_title = uniq (to_item .localized_title + self .localized_title )
502481 to_item .save ()
503482
@@ -515,29 +494,6 @@ def cover_image_url(self):
515494 e = next (filter (lambda e : e .cover_image_url , self .editions .all ()), None )
516495 return e .cover_image_url if e else None
517496
518- def update_linked_items_from_external_resource (self , resource ):
519- """add Edition from resource.metadata['required_resources'] if not yet"""
520- links = resource .required_resources + resource .related_resources
521- for e in links :
522- if e .get ("model" ) == "Edition" :
523- edition_res = ExternalResource .objects .filter (
524- id_type = e ["id_type" ], id_value = e ["id_value" ]
525- ).first ()
526- if edition_res :
527- edition = edition_res .item
528- if not edition :
529- logger .warning (f"Unable to find edition for { edition_res } " )
530- else :
531- logger .warning (
532- f"Unable to find resource for { e ['id_type' ]} :{ e ['id_value' ]} "
533- )
534- edition = Edition .objects .filter (
535- primary_lookup_id_type = e ["id_type" ],
536- primary_lookup_id_value = e ["id_value" ],
537- ).first ()
538- if edition :
539- edition .set_work (self )
540-
541497 def to_indexable_doc (self ):
542498 return {} # no index for Work, for now
543499
0 commit comments