Re-shelve books

This commit is contained in:
Mouse Reeve 2020-01-29 00:22:48 -08:00
parent f3330ab6e7
commit dd478a3587
4 changed files with 65 additions and 8 deletions

View file

@ -111,7 +111,8 @@ class ShelveActivity(Activity):
shelf = models.ForeignKey('Shelf', on_delete=models.PROTECT)
def save(self, *args, **kwargs):
self.activity_type = 'Add'
if not self.activity_type:
self.activity_type = 'Add'
self.fedireads_type = 'Shelve'
super().save(*args, **kwargs)

View file

@ -108,6 +108,51 @@ def handle_shelve(user, book, shelf):
broadcast(user, activity, recipients)
def handle_unshelve(user, book, shelf):
''' a local user is getting a book put on their shelf '''
# update the database
row = models.ShelfBook.objects.get(book=book, shelf=shelf)
row.delete()
# send out the activitypub action
summary = '%s removed %s from %s' % (
user.username,
book.data['title'],
shelf.name
)
uuid = uuid4()
activity = {
'@context': 'https://www.w3.org/ns/activitystreams',
'id': str(uuid),
'summary': summary,
'type': 'Remove',
'actor': user.actor,
'object': {
'type': 'Document',
'name': book.data['title'],
'url': book.openlibrary_key
},
'target': {
'type': 'Collection',
'name': shelf.name,
'id': shelf.activitypub_id
}
}
recipients = get_recipients(user, 'public')
models.ShelveActivity(
uuid=uuid,
user=user,
content=activity,
shelf=shelf,
book=book,
activity_type='Remove',
).save()
broadcast(user, activity, recipients)
def handle_review(user, book, name, content, rating):
''' post a review '''
review_uuid = uuid4()

View file

@ -11,7 +11,10 @@
<img class="book-cover small" src="{% if book.cover %}/images/{{ book.cover }}{% else %}/static/images/no_cover.jpg{% endif %}">
<p class="title"><a href="{{ book.openlibrary_key }}">{{ book.data.title }}</a></p>
<p>by <a href="" class="author">{{ book.authors.first.data.name }}</a></p>
<button>start reading</button>
<form name="shelve" action="/shelve/{{ user.localname }}_currently-reading/{{ book.id }}" method="post">
<input type="hidden" name="book" value="book.id"></input>
<button type="submit">Start reading</button>
</form>
</div>
{% endfor %}
{% endif %}
@ -21,7 +24,10 @@
<img class="book-cover small" src="{% if book.cover %}/images/{{ book.cover }}{% else %}/static/images/no_cover.jpg{% endif %}">
<p class="title"><a href="{{ book.openlibrary_key }}">{{ book.data.title }}</a></p>
<p>by <a href="" class="author">{{ book.authors.first.data.name }}</a></p>
<button>done reading</button>
<form name="shelve" action="/shelve/{{ user.localname }}_read/{{ book.id }}" method="post">
<input type="hidden" name="book" value="book.id"></input>
<button type="submit">I'm done!</button>
</form>
</div>
{% endfor %}
</div>
@ -38,7 +44,7 @@
<a href="" class="author">{{ book.authors.first.data.name }}</a>
</p>
{% if not book in user_books.all %}
<form name="shelve" action="/shelve/{{ request.user.localname }}_to-read/{{ book.id }}" method="post">
<form name="shelve" action="/shelve/{{ user.localname }}_to-read/{{ book.id }}" method="post">
<input type="hidden" name="book" value="book.id"></input>
<button type="submit">Want to read</button>
</form>

View file

@ -180,12 +180,17 @@ def book_page(request, book_identifier):
@csrf_exempt
@login_required
def shelve(request, shelf_id, book_id):
def shelve(request, shelf_id, book_id, reshelve=True):
''' put a book on a user's shelf '''
# TODO: handle "reshelving"
book = models.Book.objects.get(id=book_id)
shelf = models.Shelf.objects.get(identifier=shelf_id)
api.handle_shelve(request.user, book, shelf)
desired_shelf = models.Shelf.objects.get(identifier=shelf_id)
if reshelve:
try:
current_shelf = models.Shelf.objects.get(user=request.user, book=book)
api.handle_unshelve(request.user, book, current_shelf)
except models.Shelf.DoesNotExist:
pass
api.handle_shelve(request.user, book, desired_shelf)
return redirect('/')