add django-rest-framework basic implementation
This commit is contained in:
		
							parent
							
								
									cf6373c7cb
								
							
						
					
					
						commit
						2f5c5b20c5
					
				| 
						 | 
				
			
			@ -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')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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')),
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,3 +6,6 @@ django-fontawesome-5
 | 
			
		|||
celery>=4.4
 | 
			
		||||
gunicorn>=20
 | 
			
		||||
psycopg2-binary
 | 
			
		||||
djangorestframework
 | 
			
		||||
django-filter
 | 
			
		||||
djangorestframework-guardian
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
from django.apps import AppConfig
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RestapiConfig(AppConfig):
 | 
			
		||||
    name = 'restapi'
 | 
			
		||||
| 
						 | 
				
			
			@ -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'))
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -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]
 | 
			
		||||
		Loading…
	
		Reference in New Issue