Adds update logic to connectors

This commit is contained in:
Mouse Reeve 2021-12-05 12:37:19 -08:00
parent 2d875b5575
commit b824841cb3
3 changed files with 33 additions and 7 deletions

View file

@ -111,7 +111,7 @@ class AbstractConnector(AbstractMinimalConnector):
return existing.default_edition return existing.default_edition
return existing return existing
# load the json # load the json data from the remote data source
data = self.get_book_data(remote_id) data = self.get_book_data(remote_id)
if self.is_work_data(data): if self.is_work_data(data):
try: try:
@ -150,23 +150,32 @@ class AbstractConnector(AbstractMinimalConnector):
"""this allows connectors to override the default behavior""" """this allows connectors to override the default behavior"""
return get_data(remote_id) return get_data(remote_id)
def create_edition_from_data(self, work, edition_data): def create_edition_from_data(self, work, edition_data, instance=None):
"""if we already have the work, we're ready""" """if we already have the work, we're ready"""
mapped_data = dict_from_mappings(edition_data, self.book_mappings) mapped_data = dict_from_mappings(edition_data, self.book_mappings)
mapped_data["work"] = work.remote_id mapped_data["work"] = work.remote_id
edition_activity = activitypub.Edition(**mapped_data) edition_activity = activitypub.Edition(**mapped_data)
edition = edition_activity.to_model(model=models.Edition, overwrite=False) edition = edition_activity.to_model(
edition.connector = self.connector model=models.Edition, overwrite=False, instance=instance
edition.save() )
# if we're updating an existing instance, we don't need to load authors
if instance:
return edition
if not edition.connector:
edition.connector = self.connector
edition.save(broadcast=False, update_fields=["connector"])
for author in self.get_authors_from_data(edition_data): for author in self.get_authors_from_data(edition_data):
edition.authors.add(author) edition.authors.add(author)
# use the authors from the work if none are found for the edition
if not edition.authors.exists() and work.authors.exists(): if not edition.authors.exists() and work.authors.exists():
edition.authors.set(work.authors.all()) edition.authors.set(work.authors.all())
return edition return edition
def get_or_create_author(self, remote_id): def get_or_create_author(self, remote_id, instance=None):
"""load that author""" """load that author"""
existing = models.Author.find_existing_by_remote_id(remote_id) existing = models.Author.find_existing_by_remote_id(remote_id)
if existing: if existing:
@ -181,7 +190,20 @@ class AbstractConnector(AbstractMinimalConnector):
return None return None
# this will dedupe # this will dedupe
return activity.to_model(model=models.Author, overwrite=False) return activity.to_model(
model=models.Author, overwrite=False, instance=instance
)
def update_author_from_remote(self, obj):
"""load the remote data from this connector and add it to an existing author"""
remote_id = obj.getattr(self, "generated_remote_link_field")
return self.get_or_create_author(remote_id, instance=obj)
def update_book_from_remote(self, obj):
"""load the remote data from this connector and add it to an existing book"""
remote_id = obj.getattr(self, "generated_remote_link_field")
data = self.get_book_data(remote_id)
return self.create_edition_from_data(obj.parent_work, data, instance=obj)
@abstractmethod @abstractmethod
def is_work_data(self, data): def is_work_data(self, data):

View file

@ -11,6 +11,8 @@ from .connector_manager import ConnectorException
class Connector(AbstractConnector): class Connector(AbstractConnector):
"""instantiate a connector for inventaire""" """instantiate a connector for inventaire"""
generated_remote_link_field = "inventaire_link"
def __init__(self, identifier): def __init__(self, identifier):
super().__init__(identifier) super().__init__(identifier)

View file

@ -12,6 +12,8 @@ from .openlibrary_languages import languages
class Connector(AbstractConnector): class Connector(AbstractConnector):
"""instantiate a connector for OL""" """instantiate a connector for OL"""
generated_remote_link_field = "openlibrary_link"
def __init__(self, identifier): def __init__(self, identifier):
super().__init__(identifier) super().__init__(identifier)