mirror of
https://code.eliotberriot.com/funkwhale/funkwhale.git
synced 2025-10-04 00:59:15 +02:00
Admin UI to list and manage remote and local accounts
This commit is contained in:
parent
b1194e50de
commit
e186c6bb06
18 changed files with 797 additions and 283 deletions
|
@ -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):
|
||||
"""
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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",
|
||||
]
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue