Admin UI to list and manage remote and local accounts

This commit is contained in:
Eliot Berriot 2019-01-03 17:10:02 +01:00
parent b1194e50de
commit e186c6bb06
No known key found for this signature in database
GPG key ID: DD6965E2476E5C27
18 changed files with 797 additions and 283 deletions

View file

@ -61,16 +61,6 @@ class ActorQuerySet(models.QuerySet):
return qs
def with_outbox_activities_count(self):
return self.annotate(
outbox_activities_count=models.Count("outbox_activities", distinct=True)
)
def with_followers_count(self):
return self.annotate(
followers_count=models.Count("received_follows", distinct=True)
)
def with_uploads_count(self):
return self.annotate(
uploads_count=models.Count("libraries__uploads", distinct=True)
@ -86,7 +76,9 @@ class DomainQuerySet(models.QuerySet):
def with_outbox_activities_count(self):
return self.annotate(
outbox_activities_count=models.Count("actors__outbox_activities", distinct=True)
outbox_activities_count=models.Count(
"actors__outbox_activities", distinct=True
)
)
@ -186,10 +178,10 @@ class Actor(models.Model):
@property
def full_username(self):
return "{}@{}".format(self.preferred_username, self.domain)
return "{}@{}".format(self.preferred_username, self.domain_id)
def __str__(self):
return "{}@{}".format(self.preferred_username, self.domain)
return "{}@{}".format(self.preferred_username, self.domain_id)
@property
def is_local(self):
@ -217,6 +209,35 @@ class Actor(models.Model):
data["total"] = sum(data.values())
return data
def get_stats(self):
from funkwhale_api.music import models as music_models
data = Actor.objects.filter(pk=self.pk).aggregate(
outbox_activities=models.Count("outbox_activities", distinct=True),
libraries=models.Count("libraries", distinct=True),
received_library_follows=models.Count(
"libraries__received_follows", distinct=True
),
emitted_library_follows=models.Count("library_follows", distinct=True),
)
data["artists"] = music_models.Artist.objects.filter(
from_activity__actor=self.pk
).count()
data["albums"] = music_models.Album.objects.filter(
from_activity__actor=self.pk
).count()
data["tracks"] = music_models.Track.objects.filter(
from_activity__actor=self.pk
).count()
uploads = music_models.Upload.objects.filter(library__actor=self.pk)
data["uploads"] = uploads.count()
data["media_total_size"] = uploads.aggregate(v=models.Sum("size"))["v"] or 0
data["media_downloaded_size"] = (
uploads.with_file().aggregate(v=models.Sum("size"))["v"] or 0
)
return data
class InboxItem(models.Model):
"""

View file

@ -37,10 +37,15 @@ class ManageActorFilterSet(filters.FilterSet):
search_fields={
"name": {"to": "name"},
"username": {"to": "preferred_username"},
"email": {"to": "user__email"},
"bio": {"to": "summary"},
"type": {"to": "type"},
},
filter_fields={"domain": {"to": "domain_id__iexact"}},
filter_fields={
"domain": {"to": "domain__name__iexact"},
"username": {"to": "preferred_username__iexact"},
"email": {"to": "user__email__iexact"},
},
)
)
local = filters.BooleanFilter(name="_", method="filter_local")

View file

@ -116,6 +116,7 @@ class ManageUserSerializer(serializers.ModelSerializer):
"permissions",
"privacy_level",
"upload_quota",
"full_username",
)
read_only_fields = [
"id",
@ -194,9 +195,8 @@ class ManageDomainSerializer(serializers.ModelSerializer):
class ManageActorSerializer(serializers.ModelSerializer):
outbox_activities_count = serializers.SerializerMethodField()
uploads_count = serializers.SerializerMethodField()
followers_count = serializers.SerializerMethodField()
user = ManageUserSerializer()
class Meta:
model = federation_models.Actor
@ -205,6 +205,7 @@ class ManageActorSerializer(serializers.ModelSerializer):
"url",
"fid",
"preferred_username",
"full_username",
"domain",
"name",
"summary",
@ -215,16 +216,9 @@ class ManageActorSerializer(serializers.ModelSerializer):
"outbox_url",
"shared_inbox_url",
"manually_approves_followers",
"outbox_activities_count",
"uploads_count",
"followers_count",
"user",
]
def get_uploads_count(self, o):
return getattr(o, "uploads_count", 0)
def get_followers_count(self, o):
return getattr(o, "followers_count", 0)
def get_outbox_activities_count(self, o):
return getattr(o, "outbox_activities_count", 0)

View file

@ -138,10 +138,9 @@ class ManageActorViewSet(
lookup_value_regex = r"([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)"
queryset = (
federation_models.Actor.objects.all()
.with_outbox_activities_count()
.with_followers_count()
.with_uploads_count()
.order_by("-creation_date")
.select_related("user")
)
serializer_class = serializers.ManageActorSerializer
filter_class = filters.ManageActorFilterSet
@ -155,7 +154,6 @@ class ManageActorViewSet(
"creation_date",
"last_fetch_date",
"uploads_count",
"followers_count",
"outbox_activities_count",
]

View file

@ -204,6 +204,9 @@ class User(AbstractUser):
return ["user.{}.{}".format(self.pk, g) for g in groups]
def full_username(self):
return "{}@{}".format(self.username, settings.FEDERATION_HOSTNAME)
def generate_code(length=10):
return "".join(