summaryrefslogtreecommitdiffstats
path: root/users/models/follow.py
diff options
context:
space:
mode:
authorAndrew Godwin2022-11-06 21:30:07 -0700
committerAndrew Godwin2022-11-06 21:30:07 -0700
commitfb6c409a9af5b8a686e977ee2251c359071e0ec3 (patch)
tree322469694585b766eb623b47955623b3e43c89b1 /users/models/follow.py
parent0d5f7e7a891bec4b8af26c2d86d8be0209a3202d (diff)
downloadtakahe-fb6c409a9af5b8a686e977ee2251c359071e0ec3.tar.gz
takahe-fb6c409a9af5b8a686e977ee2251c359071e0ec3.tar.bz2
takahe-fb6c409a9af5b8a686e977ee2251c359071e0ec3.zip
Rework task system and fetching.
I can taste how close follow is to working.
Diffstat (limited to 'users/models/follow.py')
-rw-r--r--users/models/follow.py50
1 files changed, 50 insertions, 0 deletions
diff --git a/users/models/follow.py b/users/models/follow.py
index 7287900..29d036e 100644
--- a/users/models/follow.py
+++ b/users/models/follow.py
@@ -1,5 +1,9 @@
+from typing import Optional
+
from django.db import models
+from miniq.models import Task
+
class Follow(models.Model):
"""
@@ -17,7 +21,53 @@ class Follow(models.Model):
related_name="inbound_follows",
)
+ uri = models.CharField(blank=True, null=True, max_length=500)
note = models.TextField(blank=True, null=True)
+ requested = models.BooleanField(default=False)
+ accepted = models.BooleanField(default=False)
+
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
+
+ class Meta:
+ unique_together = [("source", "target")]
+
+ @classmethod
+ def maybe_get(cls, source, target) -> Optional["Follow"]:
+ """
+ Returns a follow if it exists between source and target
+ """
+ try:
+ return Follow.objects.get(source=source, target=target)
+ except Follow.DoesNotExist:
+ return None
+
+ @classmethod
+ def create_local(cls, source, target):
+ """
+ Creates a Follow from a local Identity to the target
+ (which can be local or remote).
+ """
+ if not source.local:
+ raise ValueError("You cannot initiate follows on a remote Identity")
+ try:
+ follow = Follow.objects.get(source=source, target=target)
+ except Follow.DoesNotExist:
+ follow = Follow.objects.create(source=source, target=target, uri="")
+ follow.uri = source.actor_uri + f"follow/{follow.pk}/"
+ if target.local:
+ follow.requested = True
+ follow.accepted = True
+ else:
+ Task.submit("follow_request", str(follow.pk))
+ follow.save()
+ return follow
+
+ def undo(self):
+ """
+ Undoes this follow
+ """
+ if not self.target.local:
+ Task.submit("follow_undo", str(self.pk))
+ self.delete()