From 8cbca4229f6a030a977d4928811d1cf590e765f4 Mon Sep 17 00:00:00 2001 From: Adam Kelly Date: Mon, 24 Feb 2020 15:10:03 +0000 Subject: [PATCH 1/5] Add following as a related_name for followers. --- fedireads/incoming.py | 2 +- .../migrations/0008_auto_20200224_1504.py | 19 +++++++++++++++++++ fedireads/models/user.py | 3 ++- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 fedireads/migrations/0008_auto_20200224_1504.py diff --git a/fedireads/incoming.py b/fedireads/incoming.py index 225177ce..bb1d0771 100644 --- a/fedireads/incoming.py +++ b/fedireads/incoming.py @@ -187,7 +187,7 @@ def get_following(request, username): return HttpResponseBadRequest() user = models.User.objects.get(localname=username) - following = models.User.objects.filter(followers=user) + following = user.following page = request.GET.get('page') return JsonResponse(activitypub.get_following(user, page, following)) diff --git a/fedireads/migrations/0008_auto_20200224_1504.py b/fedireads/migrations/0008_auto_20200224_1504.py new file mode 100644 index 00000000..1ddbc8cd --- /dev/null +++ b/fedireads/migrations/0008_auto_20200224_1504.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0.3 on 2020-02-24 15:04 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('fedireads', '0007_auto_20200223_0902'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='followers', + field=models.ManyToManyField(related_name='following', through='fedireads.UserRelationship', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/fedireads/models/user.py b/fedireads/models/user.py index 37c9cbca..f3289003 100644 --- a/fedireads/models/user.py +++ b/fedireads/models/user.py @@ -38,7 +38,8 @@ class User(AbstractUser): 'self', symmetrical=False, through='UserRelationship', - through_fields=('user_subject', 'user_object') + through_fields=('user_subject', 'user_object'), + related_name='following' ) favorites = models.ManyToManyField( 'Status', From d6e48f9a21392519ccf2030110f287515657afd2 Mon Sep 17 00:00:00 2001 From: Adam Kelly Date: Mon, 24 Feb 2020 15:23:14 +0000 Subject: [PATCH 2/5] Displaying following as well as followers on user profile. --- fedireads/templates/user.html | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/fedireads/templates/user.html b/fedireads/templates/user.html index a71a565e..79605dbe 100644 --- a/fedireads/templates/user.html +++ b/fedireads/templates/user.html @@ -25,12 +25,25 @@ {% for follower in user.followers.all %}
{{ follower.username }} - {% if not request.user in follower.followers.all %} + {% if not request.user in follower.followers.all and request.user != follower %} {% include 'snippets/follow_button.html' with user=follower %} {% endif %}
{% endfor %} + +
+

Following

+ {% for following in user.following.all %} +
+ {{ following.username }} + {% if not request.user in following.followers.all and request.user != following %} + {% include 'snippets/follow_button.html' with user=following %} + {% endif %} +
+ {% endfor %} +
+
From 592c2b7dfd969fb71841d76216105ce2a819a874 Mon Sep 17 00:00:00 2001 From: Adam Kelly Date: Mon, 24 Feb 2020 16:10:09 +0000 Subject: [PATCH 3/5] Reverse user_subject & user_object. In the relationships table: user_subject should be the user doing the following. user_object should be the user who is followed. This fixes a bug where unfollowing a user deletes the relationship in both directions. --- fedireads/incoming.py | 4 ++-- fedireads/models/user.py | 2 +- fedireads/outgoing.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fedireads/incoming.py b/fedireads/incoming.py index bb1d0771..40c2deb5 100644 --- a/fedireads/incoming.py +++ b/fedireads/incoming.py @@ -201,8 +201,8 @@ def handle_incoming_follow(activity): # TODO: allow users to manually approve requests try: models.UserRelationship.objects.create( - user_subject=to_follow, - user_object=user, + user_subject=user, + user_object=to_follow, status='follow_request', relationship_id=activity['id'] ) diff --git a/fedireads/models/user.py b/fedireads/models/user.py index f3289003..292a7906 100644 --- a/fedireads/models/user.py +++ b/fedireads/models/user.py @@ -38,7 +38,7 @@ class User(AbstractUser): 'self', symmetrical=False, through='UserRelationship', - through_fields=('user_subject', 'user_object'), + through_fields=('user_object', 'user_subject'), related_name='following' ) favorites = models.ManyToManyField( diff --git a/fedireads/outgoing.py b/fedireads/outgoing.py index e1a9c510..f91975ff 100644 --- a/fedireads/outgoing.py +++ b/fedireads/outgoing.py @@ -88,8 +88,8 @@ def handle_outgoing_follow(user, to_follow): def handle_outgoing_unfollow(user, to_unfollow): ''' someone local wants to follow someone ''' relationship = models.UserRelationship.objects.get( - user_object=user, - user_subject=to_unfollow + user_subject=user, + user_object=to_unfollow ) activity = activitypub.get_unfollow(relationship) errors = broadcast(user, activity, [to_unfollow.inbox]) From c1cf211d003c62c63b497b77b79b3d08b210fc53 Mon Sep 17 00:00:00 2001 From: Adam Kelly Date: Mon, 24 Feb 2020 16:16:49 +0000 Subject: [PATCH 4/5] Create initial example db from a separate python file. --- init_db.py | 10 ++++++++++ rebuilddb.sh | 9 +-------- 2 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 init_db.py diff --git a/init_db.py b/init_db.py new file mode 100644 index 00000000..c112b5a7 --- /dev/null +++ b/init_db.py @@ -0,0 +1,10 @@ +from fedireads.models import User +from fedireads.openlibrary import get_or_create_book + +User.objects.create_user('mouse', 'mouse.reeve@gmail.com', 'password123') +User.objects.create_user('rat', 'rat@rat.com', 'ratword') + +User.objects.get(id=1).followers.add(User.objects.get(id=2)) + +get_or_create_book('OL1715344W') +get_or_create_book('OL102749W') diff --git a/rebuilddb.sh b/rebuilddb.sh index 127b5ed7..09d024aa 100755 --- a/rebuilddb.sh +++ b/rebuilddb.sh @@ -21,12 +21,5 @@ fi python manage.py makemigrations fedireads python manage.py migrate -echo "from fedireads.models import User -User.objects.create_user('mouse', 'mouse.reeve@gmail.com', 'password123')" | python manage.py shell -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('OL1715344W') -get_or_create_book('OL102749W')" | python manage.py shell +python manage.py shell < init_db.py python manage.py runserver From 0d922dfa86497bc0b972c6f91d95ddeb5aa40c13 Mon Sep 17 00:00:00 2001 From: Adam Kelly Date: Mon, 24 Feb 2020 16:38:01 +0000 Subject: [PATCH 5/5] Fix user profile error if not logged in. --- fedireads/templates/layout.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fedireads/templates/layout.html b/fedireads/templates/layout.html index 51bfc75b..c6290f93 100644 --- a/fedireads/templates/layout.html +++ b/fedireads/templates/layout.html @@ -25,7 +25,7 @@
- {% if user.is_authenticated %} + {% if request.user.is_authenticated %}
{% csrf_token %} Welcome, {% include 'snippets/username.html' with user=request.user %}