infrasynth-backend-kit/infrasynth/files/views.py
jcv-dev a2930426b4 feat: tenant configs, live signals, and automatic permission management
- infrasynth.configs: typed multi-tenant config store (registry, service,
  secrets, cache) + public config_changed/config_reset signals and API
- emit the declared-but-dead signals (features flags/overrides, scheduler
  task_completed/task_failed, tenancy tenant_updated, audit model_changed)
  and per-model audit field exclusions
- security: permission catalog (security_permission), Django-style
  model-derived AutoPermission, PermissionRegistry, RoleAssignment,
  global-or-tenant Grant/Revoke, catalog API
- consolidate the permission surface: PermissionRegistry only (drop the
  settings dict), IsAuthenticatedAndPermitted aliases HybridPermission,
  require_permission replaced by required_permissions + require_all
- packaging: add [build-system]; add Forgejo publish workflow (.forgejo)
2026-09-29 17:06:54 -05:00

71 lines
2.3 KiB
Python

from rest_framework import viewsets
from rest_framework.decorators import action
from infrasynth.security.permissions import IsAuthenticatedAndPermitted
from .models import FileCategory, ProcessingPipeline, StoredFile
from .serializers import (
FileCategorySerializer,
ProcessingPipelineSerializer,
StoredFileSerializer,
)
from .services import FileService
class StoredFileViewSet(viewsets.ModelViewSet):
queryset = StoredFile.objects.all()
serializer_class = StoredFileSerializer
permission_classes = [IsAuthenticatedAndPermitted]
def initial(self, request, *args, **kwargs):
from infrasynth.features.services import FeatureService
if not FeatureService().is_enabled("files", user=request.user):
from django.http import Http404
raise Http404()
super().initial(request, *args, **kwargs)
def get_queryset(self):
return StoredFile.objects.select_related("category", "uploaded_by").all()
@action(detail=True, methods=["get"])
def download(self, request, pk=None):
stored = self.get_object()
return FileService().get_download_response(stored, request)
class FileCategoryViewSet(viewsets.ModelViewSet):
queryset = FileCategory.objects.all()
serializer_class = FileCategorySerializer
permission_classes = [IsAuthenticatedAndPermitted]
def initial(self, request, *args, **kwargs):
from infrasynth.features.services import FeatureService
if not FeatureService().is_enabled("files", user=request.user):
from django.http import Http404
raise Http404()
super().initial(request, *args, **kwargs)
def get_queryset(self):
return FileCategory.objects.all()
class ProcessingPipelineViewSet(viewsets.ModelViewSet):
queryset = ProcessingPipeline.objects.all()
serializer_class = ProcessingPipelineSerializer
permission_classes = [IsAuthenticatedAndPermitted]
def initial(self, request, *args, **kwargs):
from infrasynth.features.services import FeatureService
if not FeatureService().is_enabled("files", user=request.user):
from django.http import Http404
raise Http404()
super().initial(request, *args, **kwargs)
def get_queryset(self):
return ProcessingPipeline.objects.all()