2017-01-26 15:34:24 +01:00
|
|
|
from ..utils.auth import has_perm
|
2016-01-24 22:58:45 +01:00
|
|
|
from ..utils.rest_api import ModelViewSet, ValidationError
|
2016-02-11 22:58:32 +01:00
|
|
|
from .access_permissions import MediafileAccessPermissions
|
2013-09-25 10:01:01 +02:00
|
|
|
from .models import Mediafile
|
2013-02-16 16:19:20 +01:00
|
|
|
|
|
|
|
|
2015-07-01 23:18:48 +02:00
|
|
|
# Viewsets for the REST API
|
|
|
|
|
2015-02-12 18:48:14 +01:00
|
|
|
class MediafileViewSet(ModelViewSet):
|
2015-01-24 16:35:50 +01:00
|
|
|
"""
|
2015-07-01 23:18:48 +02:00
|
|
|
API endpoint for mediafile objects.
|
|
|
|
|
2015-08-31 14:07:24 +02:00
|
|
|
There are the following views: metadata, list, retrieve, create,
|
|
|
|
partial_update, update and destroy.
|
2015-01-24 16:35:50 +01:00
|
|
|
"""
|
2016-02-11 22:58:32 +01:00
|
|
|
access_permissions = MediafileAccessPermissions()
|
2015-01-24 16:35:50 +01:00
|
|
|
queryset = Mediafile.objects.all()
|
|
|
|
|
2015-07-01 23:18:48 +02:00
|
|
|
def check_view_permissions(self):
|
2015-01-24 16:35:50 +01:00
|
|
|
"""
|
2015-07-01 23:18:48 +02:00
|
|
|
Returns True if the user has required permissions.
|
2015-01-24 16:35:50 +01:00
|
|
|
"""
|
2016-09-17 22:26:23 +02:00
|
|
|
if self.action in ('list', 'retrieve'):
|
|
|
|
result = self.get_access_permissions().check_permissions(self.request.user)
|
|
|
|
elif self.action == 'metadata':
|
2017-01-26 15:34:24 +01:00
|
|
|
result = has_perm(self.request.user, 'mediafiles.can_see')
|
2016-01-14 22:55:43 +01:00
|
|
|
elif self.action == 'create':
|
2017-01-26 15:34:24 +01:00
|
|
|
result = (has_perm(self.request.user, 'mediafiles.can_see') and
|
|
|
|
has_perm(self.request.user, 'mediafiles.can_upload'))
|
2016-01-14 22:55:43 +01:00
|
|
|
elif self.action in ('partial_update', 'update'):
|
2017-01-26 15:34:24 +01:00
|
|
|
result = (has_perm(self.request.user, 'mediafiles.can_see') and
|
|
|
|
has_perm(self.request.user, 'mediafiles.can_upload') and
|
|
|
|
has_perm(self.request.user, 'mediafiles.can_manage'))
|
2015-07-01 23:18:48 +02:00
|
|
|
elif self.action == 'destroy':
|
2017-01-26 15:34:24 +01:00
|
|
|
result = (has_perm(self.request.user, 'mediafiles.can_see') and
|
|
|
|
has_perm(self.request.user, 'mediafiles.can_manage'))
|
2015-07-01 23:18:48 +02:00
|
|
|
else:
|
|
|
|
result = False
|
|
|
|
return result
|
2016-01-14 22:55:43 +01:00
|
|
|
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
|
|
"""
|
|
|
|
Customized view endpoint to upload a new file.
|
|
|
|
"""
|
|
|
|
# Check permission to check if the uploader has to be changed.
|
|
|
|
uploader_id = self.request.data.get('uploader_id')
|
|
|
|
if (uploader_id and
|
2017-01-26 15:34:24 +01:00
|
|
|
not has_perm(request.user, 'mediafiles.can_manage') and
|
2016-01-14 22:55:43 +01:00
|
|
|
str(self.request.user.pk) != str(uploader_id)):
|
|
|
|
self.permission_denied(request)
|
2016-01-24 22:58:45 +01:00
|
|
|
if not self.request.data.get('mediafile'):
|
2016-02-06 00:02:22 +01:00
|
|
|
raise ValidationError({'detail': 'You forgot to provide a file.'})
|
2016-01-14 22:55:43 +01:00
|
|
|
return super().create(request, *args, **kwargs)
|