Split follows, follow requests and blocks into separate tables.

As discussed in issue #82
This commit is contained in:
Adam Kelly
2020-03-11 12:20:19 +00:00
parent e8cfa99cd9
commit e050704c2c
2 changed files with 151 additions and 8 deletions

View File

@ -34,12 +34,26 @@ class User(AbstractUser):
# name is your display name, which you can change at will
name = models.CharField(max_length=100, blank=True, null=True)
avatar = models.ImageField(upload_to='avatars/', blank=True, null=True)
followers = models.ManyToManyField(
following = models.ManyToManyField(
'self',
symmetrical=False,
through='UserRelationship',
through_fields=('user_object', 'user_subject'),
related_name='following'
through='UserFollows',
through_fields=('user_subject', 'user_object'),
related_name='followers'
)
follow_requests = models.ManyToManyField(
'self',
symmetrical=False,
through='UserFollowRequest',
through_fields=('user_subject', 'user_object'),
related_name='follower_requests'
)
blocks = models.ManyToManyField(
'self',
symmetrical=False,
through='UserBlocks',
through_fields=('user_subject', 'user_object'),
related_name='blocked_by'
)
favorites = models.ManyToManyField(
'Status',
@ -65,22 +79,22 @@ class UserRelationship(FedireadsModel):
user_subject = models.ForeignKey(
'User',
on_delete=models.PROTECT,
related_name='user_subject'
related_name='%(class)s_user_subject'
)
user_object = models.ForeignKey(
'User',
on_delete=models.PROTECT,
related_name='user_object'
related_name='%(class)s_user_object'
)
# follow or follow_request for pending TODO: blocking?
status = models.CharField(max_length=100, default='follows', null=True)
relationship_id = models.CharField(max_length=100)
class Meta:
abstract = True
constraints = [
models.UniqueConstraint(
fields=['user_subject', 'user_object'],
name='followers_unique'
name='%(class)s_unique'
)
]
@ -90,6 +104,20 @@ class UserRelationship(FedireadsModel):
base_path = self.user_subject.absolute_id
return '%s#%s/%d' % (base_path, self.status, self.id)
class UserFollows(UserRelationship):
@property
def status(self):
return 'follows'
class UserFollowRequest(UserRelationship):
@property
def status(self):
return 'follow_request'
class UserBlocks(UserRelationship):
@property
def status(self):
return 'blocks'
class FederatedServer(FedireadsModel):
''' store which server's we federate with '''