mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2024-11-27 12:01:14 +00:00
Adds update logic to connectors
This commit is contained in:
parent
2d875b5575
commit
b824841cb3
3 changed files with 33 additions and 7 deletions
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue