add django-rest-framework basic implementation

This commit is contained in:
Jan Koppe 2020-05-31 18:35:30 +02:00
parent cf6373c7cb
commit 2f5c5b20c5
Signed by: thunfisch
GPG Key ID: BE935B0735A2129B
8 changed files with 99 additions and 0 deletions

View File

@ -40,6 +40,7 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'guardian',
'django_registration',
'bootstrap4',
@ -155,6 +156,15 @@ STATICFILES_DIRS = [
]
# DRF
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoObjectPermissions'
]
}
# E-mail
DEFAULT_FROM_EMAIL = os.environ.get('EMAIL_FROM')
EMAIL_HOST = os.environ.get('EMAIL_HOST')

View File

@ -24,5 +24,6 @@ urlpatterns = [
path('rtmp/', include('rtmp.urls')),
path('restream/', include('restream.urls')),
path('concierge/', include('concierge.urls')),
path('api/v1/', include('restapi.urls')),
path('', include('portal.urls')),
]

View File

@ -6,3 +6,6 @@ django-fontawesome-5
celery>=4.4
gunicorn>=20
psycopg2-binary
djangorestframework
django-filter
djangorestframework-guardian

0
restapi/__init__.py Normal file
View File

5
restapi/apps.py Normal file
View File

@ -0,0 +1,5 @@
from django.apps import AppConfig
class RestapiConfig(AppConfig):
name = 'restapi'

View File

17
restapi/urls.py Normal file
View File

@ -0,0 +1,17 @@
from django.urls import path, include
from rest_framework import routers
from .views import ApplicationViewSet, StreamViewSet, RestreamConfigViewSet
router = routers.DefaultRouter()
router.register(r'applications', ApplicationViewSet)
router.register(r'streams', StreamViewSet)
router.register(r'restreamconfigs', RestreamConfigViewSet)
app_name = 'restapi'
urlpatterns = [
path('', include(router.urls)),
path('auth/', include('rest_framework.urls', namespace='rest_framework'))
]

63
restapi/views.py Normal file
View File

@ -0,0 +1,63 @@
from rest_framework_guardian.serializers import ObjectPermissionsAssignmentMixin
from rest_framework import serializers, viewsets
from rest_framework_guardian import filters
from rtmp.models import Application, Stream
from restream.models import RestreamConfig
class ApplicationSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Application
fields = ['id', 'name']
class ApplicationViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Application.objects.all()
serializer_class = ApplicationSerializer
filter_backends = [filters.ObjectPermissionsFilter]
class StreamSerializer(ObjectPermissionsAssignmentMixin, serializers.ModelSerializer):
class Meta:
model = Stream
fields = ['id', 'stream', 'name', 'application']
def get_permissions_map(self, created):
current_user = self.context['request'].user
return {
'view_stream': [current_user],
'change_stream': [current_user],
'delete_stream': [current_user]
}
class StreamViewSet(viewsets.ModelViewSet):
queryset = Stream.objects.all()
serializer_class = StreamSerializer
filter_backends = [filters.ObjectPermissionsFilter]
class RestreamConfigSerializer(ObjectPermissionsAssignmentMixin, serializers.ModelSerializer):
class Meta:
model = RestreamConfig
fields = '__all__'
def get_permissions_map(self, created):
current_user = self.context['request'].user
return {
'view_restreamconfig': [current_user],
'change_restreamconfig': [current_user],
'delete_restreamconfig': [current_user]
}
def validate_stream(self, value):
request = self.context['request']
if not request.user.has_perm('rtmp.view_stream', value):
raise serializers.ValidationError('Access to stream is not authorized')
return value
class RestreamConfigViewSet(viewsets.ModelViewSet):
queryset = RestreamConfig.objects.all()
serializer_class = RestreamConfigSerializer
filter_backends = [filters.ObjectPermissionsFilter]