Replaced the "requested" flag in Follow with an "offer" field which holds the ID of the follow request.

status-serialisers
Marnanel Thurman 2020-09-30 15:44:16 +01:00
rodzic 9d8f4613d4
commit 3d38c6618a
9 zmienionych plików z 84 dodań i 18 usunięć

Wyświetl plik

@ -93,13 +93,13 @@ def on_follow(message):
result = trilby_models.Follow(
follower = follower,
following = following,
offer = fields.get('id'),
)
result.save()
trilby_signals.followed.send(
sender = result,
id = fields.get('id'),
)
return result

Wyświetl plik

@ -51,6 +51,7 @@ KEPI = {
'USER_INBOX_LINK': '/users/%(username)s/inbox',
'USER_OUTBOX_LINK': '/users/%(username)s/outbox',
'USER_FEATURED_LINK': '/users/%(username)s/featured',
'FOLLOW_REQUEST_LINK' : '/users/%(username)s/follow/%(number)x',
'SHARED_INBOX_LINK': '/inbox',
'TOMBSTONES': True,

Wyświetl plik

@ -0,0 +1,38 @@
# Generated by Django 3.0.9 on 2020-09-28 20:39
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('trilby_api', '0022_auto_20200915_1638'),
]
operations = [
migrations.RemoveField(
model_name='follow',
name='requested',
),
migrations.AddField(
model_name='follow',
name='offer',
field=models.URLField(blank=True, default=None, help_text="If this is an offer, the ID of the offer. If this isn't an offer, None.", max_length=255, null=True),
),
migrations.AlterField(
model_name='follow',
name='follower',
field=models.ForeignKey(help_text="The person who's following.", on_delete=django.db.models.deletion.DO_NOTHING, related_name='rel_following', to='trilby_api.Person'),
),
migrations.AlterField(
model_name='follow',
name='following',
field=models.ForeignKey(help_text="The person who's being followed.", on_delete=django.db.models.deletion.DO_NOTHING, related_name='rel_followers', to='trilby_api.Person'),
),
migrations.AlterField(
model_name='follow',
name='show_reblogs',
field=models.BooleanField(default=True, help_text="True if the following person wants to see reblogs from the follower. False if they only want to see the follower's original posts."),
),
]

Wyświetl plik

@ -18,24 +18,38 @@ from django.core.exceptions import ValidationError
class Follow(models.Model):
"""
A record that someone follows someone else.
"""
follower = models.ForeignKey(
'Person',
on_delete = models.DO_NOTHING,
related_name = 'rel_following',
help_text = "The person who's following.",
)
following = models.ForeignKey(
'Person',
on_delete = models.DO_NOTHING,
related_name = 'rel_followers',
help_text = "The person who's being followed.",
)
requested = models.BooleanField(
default=True,
offer = models.URLField(
max_length = 255,
default = None,
null = True,
blank = True,
help_text = "If this is an offer, the ID of the offer. "+\
"If this isn't an offer, None.",
)
show_reblogs = models.BooleanField(
default=True,
help_text = "True if the following person wants to see "+\
"reblogs from the follower. False if they only "+\
"want to see the follower's original posts.",
)
class Meta:
@ -47,7 +61,7 @@ class Follow(models.Model):
]
def __str__(self):
if self.requested:
if self.offer is not None:
return '[%s requests to follow %s]' % (
self.follower,
self.following,

Wyświetl plik

@ -454,7 +454,7 @@ class LocalPerson(Person):
return trilby_models.Follow.objects.filter(
follower = self,
requested = False,
offer = None,
).count()
@property
@ -464,7 +464,7 @@ class LocalPerson(Person):
return trilby_models.Follow.objects.filter(
following = self,
requested = False,
offer = None,
).count()
@property

Wyświetl plik

@ -41,7 +41,7 @@ def on_follow(sender, **kwargs):
'type': 'Accept',
'to': [follow.follower.url],
'actor': follow.following.url,
'object': kwargs.get('id'),
'object': follow.offer,
}
sombrero_delivery.deliver(
@ -52,7 +52,7 @@ def on_follow(sender, **kwargs):
],
)
follow.requested = False
follow.offer = None
follow.save()
else:
logger.info(" -- not sending automatic Accept")

Wyświetl plik

@ -152,7 +152,7 @@ class TestAccountDetails(TrilbyTestCase):
follow = Follow(
follower = whom,
following = alice,
requested = False,
offer = None,
)
follow.save()
@ -173,7 +173,7 @@ class TestAccountDetails(TrilbyTestCase):
follow = Follow(
follower = alice,
following = whom,
requested = False,
offer = None,
)
follow.save()
@ -252,8 +252,9 @@ class TestAccountActions(TrilbyTestCase):
Follow.objects.filter(
following = bob,
follower = alice,
requested = True,
).count(),
).exclude(
offer = None,
).count(),
1)
self.assertEqual(
@ -277,7 +278,7 @@ class TestAccountActions(TrilbyTestCase):
Follow.objects.filter(
following = bob,
follower = alice,
requested = False,
offer = None,
).count(),
1)
@ -285,7 +286,7 @@ class TestAccountActions(TrilbyTestCase):
Follow.objects.filter(
following = alice,
follower = bob,
requested = False,
offer = None,
).count(),
1)

Wyświetl plik

@ -99,7 +99,7 @@ class TestTimelines(TrilbyTestCase):
follow = Follow(
follower = self._george,
following = self._alice,
requested = False,
offer = None,
)
follow.save()

Wyświetl plik

@ -28,9 +28,10 @@ from rest_framework.permissions import IsAuthenticated, \
from rest_framework.response import Response
from rest_framework.renderers import JSONRenderer
import kepi.trilby_api.receivers
from kepi.bowler_pub.utils import uri_to_url
import json
import re
import random
###########################
@ -247,23 +248,34 @@ class Follow(DoSomethingWithPerson):
def _do_something_with(self, the_person, request):
try:
if the_person.auto_follow:
offer = None
else:
number = random.randint(0, 0xffffffff)
offer = uri_to_url(settings.KEPI['FOLLOW_REQUEST_LINK'] % {
'username': request.user.username,
'number': number,
})
follow = trilby_models.Follow(
follower = request.user.localperson,
following = the_person,
requested = not the_person.auto_follow,
offer = offer,
)
with transaction.atomic():
follow.save()
logger.info(' -- follow: %s', follow)
logger.debug(' -- offer ID: %s', offer)
kepi_signals.followed.send(sender=follow)
if the_person.auto_follow:
follow_back = trilby_models.Follow(
follower = the_person,
following = request.user.localperson,
requested = False,
offer = None,
)
with transaction.atomic():