74 lines
1.9 KiB
Python
74 lines
1.9 KiB
Python
|
from ninja import Router, ModelSchema, Schema
|
||
|
from ninja.errors import HttpError
|
||
|
from config import models
|
||
|
from typing import List
|
||
|
from guardian.shortcuts import get_objects_for_user, assign_perm
|
||
|
from django.shortcuts import get_object_or_404
|
||
|
|
||
|
router = Router()
|
||
|
|
||
|
class Stream(ModelSchema):
|
||
|
class Meta:
|
||
|
model = models.Stream
|
||
|
fields = "__all__"
|
||
|
|
||
|
|
||
|
class StreamPatch(ModelSchema):
|
||
|
class Meta:
|
||
|
model = models.Stream
|
||
|
fields = ["name"]
|
||
|
fields_optional = "__all__"
|
||
|
extra = "forbid"
|
||
|
|
||
|
|
||
|
class StreamCreate(ModelSchema):
|
||
|
class Meta:
|
||
|
model = models.Stream
|
||
|
fields = ["name"]
|
||
|
extra = "forbid"
|
||
|
|
||
|
|
||
|
@router.get('/streams', response=List[Stream])
|
||
|
def list_streams(request):
|
||
|
return get_objects_for_user(request.user, 'view_stream', models.Stream.objects.all())
|
||
|
|
||
|
|
||
|
@router.post('/streams', response=Stream)
|
||
|
def create_stream(request, payload: StreamCreate):
|
||
|
stream = models.Stream.objects.create(**payload.dict())
|
||
|
assign_perm('view_stream', request.user, stream)
|
||
|
assign_perm('change_stream', request.user, stream)
|
||
|
assign_perm('delete_stream', request.user, stream)
|
||
|
return stream
|
||
|
|
||
|
|
||
|
@router.get('/streams/{id}', response=Stream)
|
||
|
def get_stream(request, id: int):
|
||
|
stream = get_object_or_404(models.Stream, id=id)
|
||
|
|
||
|
if not request.user.has_perm('view_stream', stream):
|
||
|
raise HttpError(401, "unauthorized")
|
||
|
return stream
|
||
|
|
||
|
|
||
|
@router.patch('/streams/{id}', response=Stream)
|
||
|
def update_stream(request, id: int, payload: StreamPatch):
|
||
|
stream = get_object_or_404(models.Stream, id=id)
|
||
|
|
||
|
if not request.user.has_perm('change_stream', stream):
|
||
|
raise HttpError(401, "unauthorized")
|
||
|
|
||
|
stream.name = payload.name
|
||
|
stream.save()
|
||
|
return stream
|
||
|
|
||
|
|
||
|
@router.delete('/streams/{id}', response=None)
|
||
|
def delete_stream(request, id: int):
|
||
|
stream = get_object_or_404(models.Stream, id=id)
|
||
|
|
||
|
if not request.user.has_perm('delete_stream', stream):
|
||
|
raise HttpError(401, "unauthorized")
|
||
|
|
||
|
stream.delete()
|