diff --git a/fedireads/books_manager.py b/fedireads/books_manager.py index 915d95cc..c476f579 100644 --- a/fedireads/books_manager.py +++ b/fedireads/books_manager.py @@ -2,14 +2,13 @@ import importlib from fedireads import models -from fedireads.connectors.settings import CONNECTORS def get_or_create_book(key): ''' pull up a book record by whatever means possible ''' try: book = models.Book.objects.select_subclasses().get( - local_key=key + fedireads_key=key ) return book except models.Book.DoesNotExist: @@ -32,6 +31,7 @@ def get_connector(book=None): else: connector_info = models.Connector.objects.first() - classname = CONNECTORS[connector_info.name]['classname'] - connector = importlib.import_module(classname) - return connector.Connector() + connector = importlib.import_module( + 'fedireads.connectors.%s' % connector_info.connector_file + ) + return connector.Connector(connector_info.identifier) diff --git a/fedireads/connectors/abstract_connector.py b/fedireads/connectors/abstract_connector.py index 7e83b734..a0f8aa22 100644 --- a/fedireads/connectors/abstract_connector.py +++ b/fedireads/connectors/abstract_connector.py @@ -2,19 +2,14 @@ from abc import ABC, abstractmethod from fedireads import models -from fedireads.connectors import CONNECTORS class AbstractConnector(ABC): ''' generic book data connector ''' - def __init__(self, connector_name): + def __init__(self, identifier): # load connector settings - settings = CONNECTORS.get(connector_name) - if not settings: - raise ValueError('No connector with name "%s"' % connector_name) - - info = models.Connector.objects.get(name=settings['db_name']) + info = models.Connector.objects.get(identifier=identifier) self.model = info self.url = info.base_url diff --git a/fedireads/connectors/openlibrary.py b/fedireads/connectors/openlibrary.py index a83a7d63..0f69a79d 100644 --- a/fedireads/connectors/openlibrary.py +++ b/fedireads/connectors/openlibrary.py @@ -10,8 +10,8 @@ from .abstract_connector import AbstractConnector, SearchResult class Connector(AbstractConnector): ''' instantiate a connector for OL ''' - def __init__(self): - super().__init__('OpenLibrary') + def __init__(self, identifier): + super().__init__(identifier) def search(self, query): @@ -140,3 +140,4 @@ class Connector(AbstractConnector): def update_book(self, book_obj): pass + diff --git a/fedireads/connectors/settings.py b/fedireads/connectors/settings.py index 9a0103f0..a56b2cf2 100644 --- a/fedireads/connectors/settings.py +++ b/fedireads/connectors/settings.py @@ -1,7 +1,3 @@ ''' settings book data connectors ''' -CONNECTORS = { - 'OpenLibrary': { - 'db_name': 'OpenLibrary', - 'classname': 'fedireads.connectors.openlibrary', - }, -} + +CONNECTORS = ['openlibrary', 'fedireads'] diff --git a/fedireads/migrations/0020_auto_20200327_2236.py b/fedireads/migrations/0020_auto_20200327_2335.py similarity index 66% rename from fedireads/migrations/0020_auto_20200327_2236.py rename to fedireads/migrations/0020_auto_20200327_2335.py index 7292e34c..511b1bed 100644 --- a/fedireads/migrations/0020_auto_20200327_2236.py +++ b/fedireads/migrations/0020_auto_20200327_2335.py @@ -1,7 +1,8 @@ -# Generated by Django 3.0.3 on 2020-03-27 22:36 +# Generated by Django 3.0.3 on 2020-03-27 23:35 from django.db import migrations, models import django.db.models.deletion +import fedireads.models.book class Migration(migrations.Migration): @@ -17,20 +18,24 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_date', models.DateTimeField(auto_now_add=True)), ('updated_date', models.DateTimeField(auto_now=True)), - ('name', models.CharField(max_length=255, unique=True)), + ('identifier', models.CharField(max_length=255, unique=True)), + ('connector_file', models.CharField(choices=[('openlibrary', 'Openlibrary'), ('fedireads', 'Fedireads')], default='openlibrary', max_length=255)), + ('is_self', models.BooleanField(default=False)), ('api_key', models.CharField(max_length=255, null=True)), ('base_url', models.CharField(max_length=255)), ('covers_url', models.CharField(max_length=255)), ('search_url', models.CharField(max_length=255, null=True)), - ('key_name', models.CharField(max_length=255, unique=True)), + ('key_name', models.CharField(max_length=255)), ('politeness_delay', models.IntegerField(null=True)), ('max_query_count', models.IntegerField(null=True)), ('query_count', models.IntegerField(default=0)), ('query_count_expiry', models.DateTimeField(auto_now_add=True)), ], - options={ - 'abstract': False, - }, + ), + migrations.RenameField( + model_name='book', + old_name='local_key', + new_name='fedireads_key', ), migrations.RenameField( model_name='book', @@ -41,6 +46,10 @@ class Migration(migrations.Migration): model_name='book', name='local_edits', ), + migrations.AddConstraint( + model_name='connector', + constraint=models.CheckConstraint(check=models.Q(connector_file__in=fedireads.models.book.ConnectorFiles), name='connector_file_valid'), + ), migrations.AddField( model_name='book', name='connector', diff --git a/fedireads/models/book.py b/fedireads/models/book.py index 9edf5933..9f52a1f1 100644 --- a/fedireads/models/book.py +++ b/fedireads/models/book.py @@ -8,17 +8,28 @@ from fedireads.settings import DOMAIN from fedireads.utils.fields import JSONField, ArrayField from fedireads.utils.models import FedireadsModel +from fedireads.connectors.settings import CONNECTORS + +ConnectorFiles = models.TextChoices('ConnectorFiles', CONNECTORS) class Connector(FedireadsModel): ''' book data source connectors ''' - name = models.CharField(max_length=255, unique=True) + identifier = models.CharField(max_length=255, unique=True) + connector_file = models.CharField( + max_length=255, + default='openlibrary', + choices=ConnectorFiles.choices + ) + # is this a connector to your own database, should only be true if + # the connector_file is `fedireads` + is_self = models.BooleanField(default=False) api_key = models.CharField(max_length=255, null=True) base_url = models.CharField(max_length=255) covers_url = models.CharField(max_length=255) search_url = models.CharField(max_length=255, null=True) - key_name = models.CharField(max_length=255, unique=True) + key_name = models.CharField(max_length=255) politeness_delay = models.IntegerField(null=True) #seconds max_query_count = models.IntegerField(null=True) @@ -27,13 +38,21 @@ class Connector(FedireadsModel): # when to reset the query count back to 0 (ie, after 1 day) query_count_expiry = models.DateTimeField(auto_now_add=True) + class Meta: + constraints = [ + models.CheckConstraint( + check=models.Q(connector_file__in=ConnectorFiles), + name='connector_file_valid' + ) + ] + class Book(FedireadsModel): ''' a generic book, which can mean either an edition or a work ''' # these identifiers apply to both works and editions openlibrary_key = models.CharField(max_length=255, unique=True, null=True) librarything_key = models.CharField(max_length=255, unique=True, null=True) - local_key = models.CharField(max_length=255, unique=True, default=uuid4) + fedireads_key = models.CharField(max_length=255, unique=True, default=uuid4) misc_identifiers = JSONField(null=True) # info about where the data comes from and where/if to sync diff --git a/fedireads/outgoing.py b/fedireads/outgoing.py index f204888b..e2d99563 100644 --- a/fedireads/outgoing.py +++ b/fedireads/outgoing.py @@ -232,7 +232,7 @@ def handle_tag(user, book, name): def handle_untag(user, book, name): ''' tag a book ''' - book = models.Book.objects.get(local_key=book) + book = models.Book.objects.get(fedireads_key=book) tag = models.Tag.objects.get(name=name, book=book, user=user) tag_activity = activitypub.get_remove_tag(tag) tag.delete() diff --git a/fedireads/templates/book.html b/fedireads/templates/book.html index 74777a19..b337f552 100644 --- a/fedireads/templates/book.html +++ b/fedireads/templates/book.html @@ -5,7 +5,7 @@
{{ book.title }}by {% include 'snippets/authors.html' with book=book %}
Edition of {{ book.parent_work.title }}
{% endif %} + {% if book.parent_work %}Edition of {{ book.parent_work.title }}
{% endif %}- {{ book.title }} + {{ book.title }}
by {% include 'snippets/authors.html' with book=book %} diff --git a/fedireads/templates/snippets/create_status.html b/fedireads/templates/snippets/create_status.html index bd3efbcf..70bc9fef 100644 --- a/fedireads/templates/snippets/create_status.html +++ b/fedireads/templates/snippets/create_status.html @@ -4,7 +4,7 @@