From c5d0e021660accf32706c34ca0146b10632c4cec Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Wed, 29 Jan 2020 01:05:27 -0800
Subject: [PATCH] openlibrary search
---
fedireads/forms.py | 43 ++++++++++++++++++
fedireads/incoming.py | 1 -
fedireads/migrations/0001_initial.py | 18 +-------
fedireads/models.py | 12 +----
fedireads/openlibrary.py | 43 +++++++++---------
fedireads/outgoing.py | 1 -
fedireads/static/images/default_avi.jpg | Bin 0 -> 6756 bytes
fedireads/static/images/no_cover.jpg | Bin 0 -> 8205 bytes
fedireads/templates/book_results.html | 13 ++++++
fedireads/templates/feed.html | 2 +
.../{results.html => user_results.html} | 0
fedireads/urls.py | 2 +-
fedireads/views.py | 15 +++---
rebuilddb.sh | 4 +-
14 files changed, 91 insertions(+), 63 deletions(-)
create mode 100644 fedireads/forms.py
create mode 100644 fedireads/static/images/default_avi.jpg
create mode 100644 fedireads/static/images/no_cover.jpg
create mode 100644 fedireads/templates/book_results.html
rename fedireads/templates/{results.html => user_results.html} (100%)
diff --git a/fedireads/forms.py b/fedireads/forms.py
new file mode 100644
index 000000000..25870fef8
--- /dev/null
+++ b/fedireads/forms.py
@@ -0,0 +1,43 @@
+''' usin django model forms '''
+from django.forms import ModelForm, PasswordInput
+
+from fedireads import models
+
+
+class LoginForm(ModelForm):
+ class Meta:
+ model = models.User
+ fields = ['username', 'password']
+ help_texts = {f: None for f in fields}
+ widgets = {
+ 'password': PasswordInput(),
+ }
+
+
+class RegisterForm(ModelForm):
+ class Meta:
+ model = models.User
+ fields = ['username', 'email', 'password']
+ help_texts = {f: None for f in fields}
+ widgets = {
+ 'password': PasswordInput(),
+ }
+
+
+class ReviewForm(ModelForm):
+ class Meta:
+ model = models.Review
+ fields = ['name', 'review_content', 'rating']
+ help_texts = {f: None for f in fields}
+ labels = {
+ 'name': 'Title',
+ 'review_content': 'Review',
+ 'rating': 'Rating (out of 5)',
+ }
+
+
+class EditUserForm(ModelForm):
+ class Meta:
+ model = models.User
+ fields = ['avatar', 'name', 'summary']
+ help_texts = {f: None for f in fields}
diff --git a/fedireads/incoming.py b/fedireads/incoming.py
index d5ebaf559..bb7b0fca4 100644
--- a/fedireads/incoming.py
+++ b/fedireads/incoming.py
@@ -193,7 +193,6 @@ def handle_incoming_create(activity):
content=activity,
activity_type='Article',
book=book,
- work=book.works.first(),
name=activity['object']['name'],
rating=activity['object']['rating'],
review_content=activity['objet']['content'],
diff --git a/fedireads/migrations/0001_initial.py b/fedireads/migrations/0001_initial.py
index 5bbe22373..962fab954 100644
--- a/fedireads/migrations/0001_initial.py
+++ b/fedireads/migrations/0001_initial.py
@@ -1,4 +1,4 @@
-# Generated by Django 3.0.2 on 2020-01-29 07:36
+# Generated by Django 3.0.2 on 2020-01-29 09:04
from django.conf import settings
import django.contrib.auth.models
@@ -109,16 +109,6 @@ class Migration(migrations.Migration):
('updated_date', models.DateTimeField(auto_now=True)),
],
),
- migrations.CreateModel(
- name='Work',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('openlibrary_key', models.CharField(max_length=255)),
- ('data', django.contrib.postgres.fields.jsonb.JSONField()),
- ('added_date', models.DateTimeField(auto_now_add=True)),
- ('updated_date', models.DateTimeField(auto_now=True)),
- ],
- ),
migrations.CreateModel(
name='Note',
fields=[
@@ -154,11 +144,6 @@ class Migration(migrations.Migration):
name='shelves',
field=models.ManyToManyField(through='fedireads.ShelfBook', to='fedireads.Shelf'),
),
- migrations.AddField(
- model_name='book',
- name='works',
- field=models.ManyToManyField(to='fedireads.Work'),
- ),
migrations.CreateModel(
name='ShelveActivity',
fields=[
@@ -180,7 +165,6 @@ class Migration(migrations.Migration):
('rating', models.IntegerField(default=0)),
('review_content', models.TextField()),
('book', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='fedireads.Book')),
- ('work', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='fedireads.Work')),
],
bases=('fedireads.activity',),
),
diff --git a/fedireads/models.py b/fedireads/models.py
index 7feecce68..47783ad1b 100644
--- a/fedireads/models.py
+++ b/fedireads/models.py
@@ -133,7 +133,6 @@ class FollowActivity(Activity):
class Review(Activity):
''' a book review '''
book = models.ForeignKey('Book', on_delete=models.PROTECT)
- work = models.ForeignKey('Work', on_delete=models.PROTECT)
name = models.CharField(max_length=255)
# TODO: validation
rating = models.IntegerField(default=0)
@@ -200,11 +199,10 @@ class ShelfBook(models.Model):
class Book(models.Model):
- ''' a non-canonical copy from open library '''
+ ''' a non-canonical copy of a work (not book) from open library '''
activitypub_id = models.CharField(max_length=255)
openlibrary_key = models.CharField(max_length=255, unique=True)
data = JSONField()
- works = models.ManyToManyField('Work')
authors = models.ManyToManyField('Author')
cover = models.ImageField(upload_to='covers/', blank=True, null=True)
shelves = models.ManyToManyField(
@@ -227,14 +225,6 @@ class Book(models.Model):
super().save(*args, **kwargs)
-class Work(models.Model):
- ''' encompassses all editions of a book '''
- openlibrary_key = models.CharField(max_length=255)
- data = JSONField()
- added_date = models.DateTimeField(auto_now_add=True)
- updated_date = models.DateTimeField(auto_now=True)
-
-
class Author(models.Model):
openlibrary_key = models.CharField(max_length=255)
data = JSONField()
diff --git a/fedireads/openlibrary.py b/fedireads/openlibrary.py
index 964792bd7..94dcde77e 100644
--- a/fedireads/openlibrary.py
+++ b/fedireads/openlibrary.py
@@ -3,10 +3,27 @@ from django.core.exceptions import ObjectDoesNotExist
from django.core.files.base import ContentFile
import requests
-from fedireads.models import Author, Book, Work
+from fedireads.models import Author, Book
from fedireads.settings import OL_URL
+def book_search(query):
+ ''' look up a book '''
+ response = requests.get('%s/search.json' % OL_URL, params={'q': query})
+ if not response.ok:
+ response.raise_for_status()
+ data = response.json()
+ results = []
+ for doc in data['docs'][:5]:
+ key = doc['key'].split('/')[-1]
+ results.append({
+ 'title': doc['title'],
+ 'olkey': key,
+ 'year': doc['first_publish_year'],
+ 'author': doc['author_name'][0],
+ })
+ return results
+
def get_or_create_book(olkey, user=None, update=False):
''' add a book '''
# TODO: check if this is a valid open library key, and a book
@@ -36,13 +53,9 @@ def get_or_create_book(olkey, user=None, update=False):
# great, we can update our book.
book.save()
- # we also need to know the author and works related to this book.
- for work_id in data['works']:
- work_id = work_id['key']
- book.works.add(get_or_create_work(work_id))
-
- for author_id in data['authors']:
- author_id = author_id['key']
+ # we also need to know the author get the cover
+ for author_blob in data['authors']:
+ author_id = author_blob['author']['key']
book.authors.add(get_or_create_author(author_id))
if len(data['covers']):
@@ -62,20 +75,6 @@ def get_cover(cover_id):
return [image_name, image_content]
-def get_or_create_work(olkey):
- ''' load em up '''
- # TODO: validate that this is a work key
- # TODO: error handling
- try:
- work = Work.objects.get(openlibrary_key=olkey)
- except ObjectDoesNotExist:
- response = requests.get(OL_URL + olkey + '.json')
- data = response.json()
- work = Work(openlibrary_key=olkey, data=data)
- work.save()
- return work
-
-
def get_or_create_author(olkey):
''' load that author '''
# TODO: validate that this is an author key
diff --git a/fedireads/outgoing.py b/fedireads/outgoing.py
index ec9b8ea05..f645b7f00 100644
--- a/fedireads/outgoing.py
+++ b/fedireads/outgoing.py
@@ -188,7 +188,6 @@ def handle_review(user, book, name, content, rating):
content=activity,
activity_type='Article',
book=book,
- work=book.works.first(),
name=name,
rating=rating,
review_content=content,
diff --git a/fedireads/static/images/default_avi.jpg b/fedireads/static/images/default_avi.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..80829abb82be7bd73f899eb9dac0805a7b13d999
GIT binary patch
literal 6756
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
KP^+X(d;MQmZEijQ
literal 0
HcmV?d00001
diff --git a/fedireads/static/images/no_cover.jpg b/fedireads/static/images/no_cover.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e6fbb3bca09d60c814c35413dcac395ada7c287f
GIT binary patch
literal 8205
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
+
+
Search results
+ {% for result in results %}
+
+ {% endfor %}
+
+
+{% endblock %}
diff --git a/fedireads/templates/feed.html b/fedireads/templates/feed.html
index 51ae43f1c..dcfea25bf 100644
--- a/fedireads/templates/feed.html
+++ b/fedireads/templates/feed.html
@@ -82,6 +82,7 @@
{{ activity.book.data.title }}
by
{{ activity.book.authors.first.data.name }}
+ {{ book.data.description }}
{% elif activity.fedireads_type == 'Review' %}
@@ -94,6 +95,7 @@
{{ activity.book.data.title }}
by
{{ activity.book.authors.first.data.name }}
+ {{ book.data.description }}
{{ activity.name }}
diff --git a/fedireads/templates/results.html b/fedireads/templates/user_results.html
similarity index 100%
rename from fedireads/templates/results.html
rename to fedireads/templates/user_results.html
diff --git a/fedireads/urls.py b/fedireads/urls.py
index 7aad76632..c551871f3 100644
--- a/fedireads/urls.py
+++ b/fedireads/urls.py
@@ -23,7 +23,7 @@ urlpatterns = [
path('logout/', views.user_logout),
path('user/', views.user_profile),
path('user//edit/', views.user_profile_edit),
- path('book/', views.book_page),
+ path('work/', views.book_page),
# internal action endpoints
path('review/', views.review),
diff --git a/fedireads/views.py b/fedireads/views.py
index 271176be1..563dd1d4a 100644
--- a/fedireads/views.py
+++ b/fedireads/views.py
@@ -26,7 +26,7 @@ def home(request):
user_books = models.Book.objects.filter(shelves__user=request.user).all()
recent_books = models.Book.objects.order_by(
'added_date'
- )[:10]
+ )[:5]
following = models.User.objects.filter(
Q(followers=request.user) | Q(id=request.user.id)
@@ -163,10 +163,8 @@ def edit_profile(request):
@login_required
def book_page(request, book_identifier):
''' info about a book '''
- book = openlibrary.get_or_create_book('/book/' + book_identifier)
- reviews = models.Review.objects.filter(
- Q(work=book.works.first()) | Q(book=book)
- )
+ book = openlibrary.get_or_create_book('/work/' + book_identifier)
+ reviews = models.Review.objects.filter(book=book)
rating = reviews.aggregate(Avg('rating'))
review_form = forms.ReviewForm()
data = {
@@ -244,9 +242,10 @@ def search(request):
query = request.GET.get('q')
if re.match(r'\w+@\w+.\w+', query):
results = [api.handle_account_search(query)]
+ template = 'user_results.html'
else:
- # TODO: book search
- results = []
+ results = openlibrary.book_search(query)
+ template = 'book_results.html'
- return TemplateResponse(request, 'results.html', {'results': results})
+ return TemplateResponse(request, template, {'results': results})
diff --git a/rebuilddb.sh b/rebuilddb.sh
index 9792e8335..6ac61b478 100755
--- a/rebuilddb.sh
+++ b/rebuilddb.sh
@@ -12,6 +12,6 @@ echo "from fedireads.models import User
User.objects.create_user('rat', 'rat@rat.com', 'ratword')
User.objects.get(id=1).followers.add(User.objects.get(id=2))" | python manage.py shell
echo "from fedireads.openlibrary import get_or_create_book
-get_or_create_book('/book/OL13549170M')
-get_or_create_book('/book/OL24738110M')" | python manage.py shell
+get_or_create_book('/work/OL1715344W')
+get_or_create_book('/work/OL102749W')" | python manage.py shell
python manage.py runserver