Model, view and serializer for instance-level policies
This commit is contained in:
parent
ddffbeadfa
commit
0bc9bb65b0
14 changed files with 331 additions and 2 deletions
|
|
@ -4,6 +4,7 @@ from funkwhale_api.common import fields
|
|||
from funkwhale_api.common import search
|
||||
|
||||
from funkwhale_api.federation import models as federation_models
|
||||
from funkwhale_api.moderation import models as moderation_models
|
||||
from funkwhale_api.music import models as music_models
|
||||
from funkwhale_api.users import models as users_models
|
||||
|
||||
|
|
@ -87,3 +88,24 @@ class ManageInvitationFilterSet(filters.FilterSet):
|
|||
if value is None:
|
||||
return queryset
|
||||
return queryset.open(value)
|
||||
|
||||
|
||||
class ManageInstancePolicyFilterSet(filters.FilterSet):
|
||||
q = fields.SearchFilter(
|
||||
search_fields=[
|
||||
"summary",
|
||||
"target_domain__name",
|
||||
"target_actor__username",
|
||||
"target_actor__domain__name",
|
||||
]
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = moderation_models.InstancePolicy
|
||||
fields = [
|
||||
"q",
|
||||
"block_all",
|
||||
"silence_activity",
|
||||
"silence_notifications",
|
||||
"reject_media",
|
||||
]
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@ from rest_framework import serializers
|
|||
|
||||
from funkwhale_api.common import serializers as common_serializers
|
||||
from funkwhale_api.federation import models as federation_models
|
||||
from funkwhale_api.federation import fields as federation_fields
|
||||
from funkwhale_api.moderation import models as moderation_models
|
||||
from funkwhale_api.music import models as music_models
|
||||
from funkwhale_api.users import models as users_models
|
||||
|
||||
|
|
@ -185,6 +187,13 @@ class ManageDomainSerializer(serializers.ModelSerializer):
|
|||
"outbox_activities_count",
|
||||
"nodeinfo",
|
||||
"nodeinfo_fetch_date",
|
||||
"instance_policy",
|
||||
]
|
||||
read_only_fields = [
|
||||
"creation_date",
|
||||
"instance_policy",
|
||||
"nodeinfo",
|
||||
"nodeinfo_fetch_date",
|
||||
]
|
||||
|
||||
def get_actors_count(self, o):
|
||||
|
|
@ -218,7 +227,62 @@ class ManageActorSerializer(serializers.ModelSerializer):
|
|||
"manually_approves_followers",
|
||||
"uploads_count",
|
||||
"user",
|
||||
"instance_policy",
|
||||
]
|
||||
read_only_fields = ["creation_date", "instance_policy"]
|
||||
|
||||
def get_uploads_count(self, o):
|
||||
return getattr(o, "uploads_count", 0)
|
||||
|
||||
|
||||
class TargetSerializer(serializers.Serializer):
|
||||
type = serializers.ChoiceField(choices=["domain", "actor"])
|
||||
id = serializers.CharField()
|
||||
|
||||
def to_representation(self, value):
|
||||
if value["type"] == "domain":
|
||||
return {"type": "domain", "id": value["obj"].name}
|
||||
if value["type"] == "actor":
|
||||
return {"type": "actor", "id": value["obj"].full_username}
|
||||
|
||||
def to_internal_value(self, value):
|
||||
if value["type"] == "domain":
|
||||
field = serializers.PrimaryKeyRelatedField(
|
||||
queryset=federation_models.Domain.objects.external()
|
||||
)
|
||||
if value["type"] == "actor":
|
||||
field = federation_fields.ActorRelatedField()
|
||||
value["obj"] = field.to_internal_value(value["id"])
|
||||
return value
|
||||
|
||||
|
||||
class ManageInstancePolicySerializer(serializers.ModelSerializer):
|
||||
target = TargetSerializer()
|
||||
actor = federation_fields.ActorRelatedField(read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = moderation_models.InstancePolicy
|
||||
fields = [
|
||||
"id",
|
||||
"uuid",
|
||||
"target",
|
||||
"creation_date",
|
||||
"actor",
|
||||
"summary",
|
||||
"is_active",
|
||||
"block_all",
|
||||
"silence_activity",
|
||||
"silence_notifications",
|
||||
"reject_media",
|
||||
]
|
||||
|
||||
read_only_fields = ["uuid", "id", "creation_date", "actor", "target"]
|
||||
|
||||
def validate(self, data):
|
||||
target = data.pop("target")
|
||||
if target["type"] == "domain":
|
||||
data["target_domain"] = target["obj"]
|
||||
if target["type"] == "actor":
|
||||
data["target_actor"] = target["obj"]
|
||||
|
||||
return data
|
||||
|
|
|
|||
|
|
@ -5,8 +5,15 @@ from . import views
|
|||
|
||||
federation_router = routers.SimpleRouter()
|
||||
federation_router.register(r"domains", views.ManageDomainViewSet, "domains")
|
||||
|
||||
library_router = routers.SimpleRouter()
|
||||
library_router.register(r"uploads", views.ManageUploadViewSet, "uploads")
|
||||
|
||||
moderation_router = routers.SimpleRouter()
|
||||
moderation_router.register(
|
||||
r"instance-policies", views.ManageInstancePolicyViewSet, "instance-policies"
|
||||
)
|
||||
|
||||
users_router = routers.SimpleRouter()
|
||||
users_router.register(r"users", views.ManageUserViewSet, "users")
|
||||
users_router.register(r"invitations", views.ManageInvitationViewSet, "invitations")
|
||||
|
|
@ -20,5 +27,9 @@ urlpatterns = [
|
|||
include((federation_router.urls, "federation"), namespace="federation"),
|
||||
),
|
||||
url(r"^library/", include((library_router.urls, "instance"), namespace="library")),
|
||||
url(
|
||||
r"^moderation/",
|
||||
include((moderation_router.urls, "moderation"), namespace="moderation"),
|
||||
),
|
||||
url(r"^users/", include((users_router.urls, "instance"), namespace="users")),
|
||||
] + other_router.urls
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ from funkwhale_api.common import preferences
|
|||
from funkwhale_api.federation import models as federation_models
|
||||
from funkwhale_api.federation import tasks as federation_tasks
|
||||
from funkwhale_api.music import models as music_models
|
||||
from funkwhale_api.moderation import models as moderation_models
|
||||
from funkwhale_api.users import models as users_models
|
||||
from funkwhale_api.users.permissions import HasUserPermission
|
||||
|
||||
|
|
@ -173,3 +174,26 @@ class ManageActorViewSet(
|
|||
def stats(self, request, *args, **kwargs):
|
||||
domain = self.get_object()
|
||||
return response.Response(domain.get_stats(), status=200)
|
||||
|
||||
|
||||
class ManageInstancePolicyViewSet(
|
||||
mixins.ListModelMixin,
|
||||
mixins.RetrieveModelMixin,
|
||||
mixins.DestroyModelMixin,
|
||||
mixins.CreateModelMixin,
|
||||
mixins.UpdateModelMixin,
|
||||
viewsets.GenericViewSet,
|
||||
):
|
||||
queryset = (
|
||||
moderation_models.InstancePolicy.objects.all()
|
||||
.order_by("-creation_date")
|
||||
.select_related()
|
||||
)
|
||||
serializer_class = serializers.ManageInstancePolicySerializer
|
||||
filter_class = filters.ManageInstancePolicyFilterSet
|
||||
permission_classes = (HasUserPermission,)
|
||||
required_permissions = ["moderation"]
|
||||
ordering_fields = ["id", "creation_date"]
|
||||
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(actor=self.request.user.actor)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue