forked from mirrors/bookwyrm
Adds favorit handling
This commit is contained in:
parent
27b9326dd9
commit
a664ad3328
10 changed files with 59 additions and 8 deletions
|
@ -1,7 +1,8 @@
|
|||
''' bring activitypub functions into the namespace '''
|
||||
from .actor import get_actor
|
||||
from .collection import get_outbox, get_outbox_page, get_add, get_remove, \
|
||||
get_following, get_followers
|
||||
get_following, get_followers
|
||||
from .create import get_create
|
||||
from .follow import get_follow_request, get_unfollow, get_accept
|
||||
from .status import get_review, get_review_article, get_status, get_replies
|
||||
from .status import get_review, get_review_article, get_status, get_replies, \
|
||||
get_favorite
|
||||
|
|
|
@ -71,3 +71,14 @@ def get_replies(status, replies):
|
|||
'items': [get_status(r) for r in replies]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def get_favorite(favorite):
|
||||
''' like a post '''
|
||||
return {
|
||||
"@context": "https://www.w3.org/ns/activitystreams",
|
||||
"id": favorite.absolute_id,
|
||||
"type": "Like",
|
||||
"actor": favorite.user.actor,
|
||||
"object": favorite.status.absolute_id,
|
||||
}
|
||||
|
|
|
@ -46,6 +46,9 @@ def shared_inbox(request):
|
|||
elif activity['type'] == 'Accept':
|
||||
response = handle_incoming_follow_accept(activity)
|
||||
|
||||
elif activity['type'] == 'Like':
|
||||
response = handle_incoming_favorite(activity)
|
||||
|
||||
# TODO: Add, Undo, Remove, etc
|
||||
|
||||
return response
|
||||
|
@ -257,6 +260,20 @@ def handle_incoming_create(activity):
|
|||
return response
|
||||
|
||||
|
||||
def handle_incoming_favorite(activity):
|
||||
''' approval of your good good post '''
|
||||
try:
|
||||
status_id = activity['object'].split('/')[-1]
|
||||
status = models.Status.objects.get(id=status_id)
|
||||
liker = get_or_create_remote_user(activity['actor'])
|
||||
except (models.Status.DoesNotExist, models.User.DoesNotExist):
|
||||
return HttpResponseNotFound()
|
||||
|
||||
if not liker.local:
|
||||
status.favorites.add(liker)
|
||||
return HttpResponse()
|
||||
|
||||
|
||||
def handle_incoming_accept(activity):
|
||||
''' someone is accepting a follow request '''
|
||||
# our local user
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Generated by Django 3.0.3 on 2020-02-19 07:25
|
||||
# Generated by Django 3.0.3 on 2020-02-19 08:04
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
@ -18,7 +18,6 @@ class Migration(migrations.Migration):
|
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('content', models.TextField(blank=True, null=True)),
|
||||
('created_date', models.DateTimeField(auto_now_add=True)),
|
||||
('relationship_id', models.CharField(max_length=100)),
|
||||
('status', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='fedireads.Status')),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
|
@ -1,5 +1,5 @@
|
|||
''' bring all the models into the app namespace '''
|
||||
from .book import Shelf, ShelfBook, Book, Author
|
||||
from .user import User, UserRelationship, FederatedServer
|
||||
from .activity import Status, Review
|
||||
from .activity import Status, Review, Favorite
|
||||
|
||||
|
|
|
@ -50,4 +50,3 @@ class Favorite(FedireadsModel):
|
|||
''' fav'ing a post '''
|
||||
user = models.ForeignKey('User', on_delete=models.PROTECT)
|
||||
status = models.ForeignKey('Status', on_delete=models.PROTECT)
|
||||
relationship_id = models.CharField(max_length=100)
|
||||
|
|
|
@ -160,7 +160,7 @@ def handle_review(user, book, name, content, rating):
|
|||
|
||||
|
||||
def handle_comment(user, review, content):
|
||||
''' post a review '''
|
||||
''' respond to a review or status '''
|
||||
# validated and saves the comment in the database so it has an id
|
||||
comment = create_status(user, content, reply_parent=review)
|
||||
comment_activity = activitypub.get_status(comment)
|
||||
|
@ -169,3 +169,14 @@ def handle_comment(user, review, content):
|
|||
recipients = get_recipients(user, 'public')
|
||||
broadcast(user, create_activity, recipients)
|
||||
|
||||
|
||||
def handle_outgoing_favorite(user, status):
|
||||
''' a user likes a status '''
|
||||
favorite = models.Favorite.objects.create(
|
||||
status=status,
|
||||
user=user
|
||||
)
|
||||
fav_activity = activitypub.get_favorite(favorite)
|
||||
recipients = get_recipients(user, 'direct', [status.user])
|
||||
broadcast(user, fav_activity, recipients)
|
||||
|
||||
|
|
|
@ -67,7 +67,10 @@
|
|||
<p>{{ activity.content | safe }}</p>
|
||||
</div>
|
||||
<div class="interaction">
|
||||
<button>⭐️ Like</button>
|
||||
<form name="favorite" action="/favorite/{{ activity.id }}" method="post">
|
||||
{% csrf_token %}
|
||||
<button>⭐️ Like</button>
|
||||
</form>
|
||||
<form name="comment" action="/comment" method="post">
|
||||
{% csrf_token %}
|
||||
<input type="hidden" name="review" value="{{ activity.id }}"></input>
|
||||
|
|
|
@ -51,6 +51,7 @@ urlpatterns = [
|
|||
# internal action endpoints
|
||||
re_path(r'^review/?$', views.review),
|
||||
re_path(r'^comment/?$', views.comment),
|
||||
re_path(r'^favorite/(?P<status_id>\d+)/?$', views.favorite),
|
||||
re_path(
|
||||
r'^shelve/(?P<username>\w+)/(?P<shelf_id>[\w-]+)/(?P<book_id>\d+)/?$',
|
||||
views.shelve
|
||||
|
|
|
@ -252,6 +252,7 @@ def review(request):
|
|||
return redirect('/book/%s' % book_identifier)
|
||||
|
||||
|
||||
@login_required
|
||||
def comment(request):
|
||||
''' respond to a book review '''
|
||||
form = forms.CommentForm(request.POST)
|
||||
|
@ -264,6 +265,14 @@ def comment(request):
|
|||
return redirect('/')
|
||||
|
||||
|
||||
@login_required
|
||||
def favorite(request, status_id):
|
||||
''' like a status '''
|
||||
status = models.Status.objects.get(id=status_id)
|
||||
outgoing.handle_outgoing_favorite(request.user, status)
|
||||
return redirect(request.headers.get('Referer', '/'))
|
||||
|
||||
|
||||
@login_required
|
||||
def follow(request):
|
||||
''' follow another user, here or abroad '''
|
||||
|
|
Loading…
Reference in a new issue