diff --git a/Makefile b/Makefile
index 40647a8..48fe6cd 100644
--- a/Makefile
+++ b/Makefile
@@ -52,11 +52,11 @@ envfile:
isort:
@echo "-> Apply isort changes to ensure proper imports ordering"
- @${ACTIVATE} isort --profile black .
+ @${ACTIVATE} isort --profile black aboutcode/ fedcode/ federatedcode/ tests/
black:
@echo "-> Apply black code formatter"
- @${ACTIVATE} black ${BLACK_ARGS} .
+ @${ACTIVATE} black ${BLACK_ARGS} aboutcode/ fedcode/ federatedcode/ tests/
doc8:
@echo "-> Run doc8 validation"
@@ -92,7 +92,7 @@ migrate:
test:
@echo "-> Run the test suite"
- @${ACTIVATE} pytest -vvs
+ @${ACTIVATE} pytest -vvs tests/ fedcode/ federatedcode/ aboutcode/
docs:
rm -rf docs/_build/
diff --git a/fedcode/management/commands/federate.py b/fedcode/management/commands/federate.py
index 0046af2..61b6ffe 100644
--- a/fedcode/management/commands/federate.py
+++ b/fedcode/management/commands/federate.py
@@ -9,6 +9,7 @@
from traceback import format_exc as traceback_format_exc
+import requests
from django.core.management.base import BaseCommand
from fedcode.models import FederateRequest
@@ -17,19 +18,17 @@
def send_fed_req_task():
- """
- send_fed_req_task is a task to send the http signed request to the target and save the status of the request
- """
+ """Send activity request to the target and save the status."""
+
for rq in FederateRequest.objects.all().order_by("created_at"):
if not rq.done:
try:
- HttpSignature.signed_request(
- rq.target, rq.body, FEDERATEDCODE_PRIVATE_KEY, rq.key_id
- )
+ headers = {"Content-Type": "application/json"}
+ requests.post(rq.target, json=rq.body, headers=headers)
rq.done = True
rq.save()
except Exception as e:
- rq.error_message = e
+ rq.error_message = f"Failed to federate {rq!r} {e!r} \n {traceback_format_exc()}"
finally:
rq.save()
diff --git a/fedcode/migrations/0003_remove_package_local_remove_person_local_and_more.py b/fedcode/migrations/0003_remove_package_local_remove_person_local_and_more.py
new file mode 100644
index 0000000..306acac
--- /dev/null
+++ b/fedcode/migrations/0003_remove_package_local_remove_person_local_and_more.py
@@ -0,0 +1,44 @@
+# Generated by Django 5.0.1 on 2024-12-10 10:01
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("fedcode", "0002_alter_package_options_alter_federaterequest_done_and_more"),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name="package",
+ name="local",
+ ),
+ migrations.RemoveField(
+ model_name="person",
+ name="local",
+ ),
+ migrations.AlterField(
+ model_name="person",
+ name="user",
+ field=models.OneToOneField(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ migrations.AddConstraint(
+ model_name="person",
+ constraint=models.CheckConstraint(
+ check=models.Q(
+ models.Q(("remote_actor__isnull", True), ("user__isnull", False)),
+ models.Q(("remote_actor__isnull", False), ("user__isnull", True)),
+ _connector="OR",
+ ),
+ name="either_local_or_remote",
+ ),
+ ),
+ ]
diff --git a/fedcode/models.py b/fedcode/models.py
index 41fc4e4..79a9b05 100644
--- a/fedcode/models.py
+++ b/fedcode/models.py
@@ -64,10 +64,6 @@ class Actor(models.Model):
blank=False,
)
- local = models.BooleanField(
- default=True,
- )
-
class Meta:
abstract = True
@@ -237,6 +233,7 @@ def to_ap(self):
"type": "Note",
"author": self.acct,
"content": self.content,
+ "update_date": str(self.updated_at),
}
@@ -365,6 +362,7 @@ class Person(Actor):
user = models.OneToOneField(
User,
null=True,
+ blank=True,
on_delete=models.CASCADE,
)
@@ -381,6 +379,21 @@ class Person(Actor):
help_text="Notes created by this user",
)
+ class Meta:
+ constraints = [
+ models.CheckConstraint(
+ check=(
+ models.Q(user__isnull=False, remote_actor__isnull=True)
+ | models.Q(user__isnull=True, remote_actor__isnull=False)
+ ),
+ name="either_local_or_remote",
+ ),
+ ]
+
+ @property
+ def local(self):
+ return bool(self.user)
+
@property
def avatar_absolute_url(self):
return f'{"https://"}{FEDERATEDCODE_DOMAIN}{self.avatar.url}'
@@ -410,6 +423,8 @@ def absolute_url_ap(self):
@property
def inbox_url(self):
+ if not self.local:
+ return self.remote_actor.url
return full_reverse("user-inbox", self.user.username)
@property
@@ -477,7 +492,10 @@ class Meta:
ordering = ["-updated_at"]
def __str__(self):
- return f"{self.person.user.username} - {self.package.purl}"
+ username = self.person.remote_actor.username
+ if self.person.local:
+ username = self.person.user.username
+ return f"{username} - {self.package.purl}"
class Repository(models.Model):
diff --git a/fedcode/templates/pkg_profile.html b/fedcode/templates/pkg_profile.html
index 36759b6..eb09305 100644
--- a/fedcode/templates/pkg_profile.html
+++ b/fedcode/templates/pkg_profile.html
@@ -82,8 +82,12 @@
- @{{ follower.person.user.username }}
-