Ejemplo n.º 1
0
class CollectionDeviceViewSet(mixins.UpdateModelMixin,
                              mixins.RetrieveModelMixin,
                              mixins.DestroyModelMixin,
                              utils.CustomViewSetMixin, GenericViewSet):
    queryset = models.CollectionDevice.objects.all()  # pylint: disable=E1101

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.data_collections.devices)

    permission_mapping = utils.PermissionMapping({
        utils.Actions.UPDATE: [
            IsAuthenticated,
            (permissions.IsOwner | permissions.HasUpdatePermission | IsAdmin),
        ],
        utils.Actions.RETRIEVE: [
            IsAuthenticated,
            (permissions.IsOwner | permissions.HasViewPermission
             | permissions.IsCollectionAdmin
             | permissions.IsCollectionTypeAdmin | IsSpecialUser),
        ],
        utils.Actions.DESTROY: [
            IsAuthenticated,
            (permissions.IsOwner | IsAdmin),
        ]
    })
Ejemplo n.º 2
0
class ItemTypeViewSet(mixins.RetrieveModelMixin, mixins.DestroyModelMixin,
                      mixins.UpdateModelMixin, utils.CustomViewSetMixin,
                      GenericViewSet):
    queryset = models.ItemType.objects.all()  # pylint: disable=E1101

    serializer_mapping = (utils.SerializerMapping.from_module(
        serializers.object_types.items).extend(
            add_event_types=serializers.object_types.events.SelectSerializer,
            remove_event_types=serializers.object_types.events.SelectSerializer
        ))

    permission_mapping = utils.PermissionMapping(
        {
            utils.Actions.RETRIEVE: IsAuthenticated,
            utils.Actions.DESTROY: IsAdmin,
        },
        default=IsDeveloper | IsAdmin)

    @action(detail=True, methods=['POST'])
    def add_event_types(self, request, pk=None):
        return self.add_related_object_view(models.EventType, 'event_type')

    @action(detail=True, methods=['POST'])
    def remove_event_types(self, request, pk=None):
        return self.remove_related_object_view('event_type')
Ejemplo n.º 3
0
class AnnotationVoteViewSet(mixins.UpdateModelMixin,
                            mixins.RetrieveModelMixin,
                            mixins.DestroyModelMixin,
                            utils.CustomViewSetMixin,
                            GenericViewSet):
    queryset = models.AnnotationVote.objects.all()  # pylint: disable=E1101

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.annotations.votes)

    permission_mapping = utils.PermissionMapping({
        utils.Actions.UPDATE: [
            IsAuthenticated,
            permissions.IsCreator | IsAdmin,
        ],
        utils.Actions.RETRIEVE: [
            IsAuthenticated,
            (
                permissions.HasViewPermission |
                permissions.IsCreator |
                permissions.IsOpen |
                IsSpecialUser
            ),
        ],
        utils.Actions.DESTROY: [
            IsAuthenticated,
            permissions.IsCreator | IsAdmin,
        ],
    })
Ejemplo n.º 4
0
class SiteViewSet(utils.CustomViewSetMixin, ModelViewSet):
    queryset = models.Site.objects.all()  # pylint: disable=E1101
    filterset_class = filters.sites.Filter
    search_fields = filters.sites.search_fields

    serializer_mapping = (
        utils.SerializerMapping
        .from_module(serializers.sites)
        .extend(
            types=serializers.object_types.sites.ListSerializer,
            add_type=serializers.object_types.sites.CreateSerializer,
        ))

    permission_mapping = utils.PermissionMapping({
        utils.Actions.UPDATE: [
            IsAuthenticated,
            (
                permissions.IsCreator |
                IsAdmin
            )
        ],
        utils.Actions.DESTROY: [
            IsAuthenticated,
            (
                permissions.IsCreator |
                IsAdmin
            )
        ],
        'add_type': [IsAuthenticated, IsAdmin]
    }, default=IsAuthenticated)

    def get_serializer_class(self):
        if self.action == utils.Actions.RETRIEVE:
            user = self.request.user
            site = self.get_object()

            if site.has_coordinate_permission(user):
                return serializers.sites.FullDetailSerializer
            return serializers.sites.DetailSerializer

        return super().get_serializer_class()

    def get_queryset(self):
        if self.action == 'types':
            return models.SiteType.objects.all()  # pylint: disable=E1101

        return super().get_queryset()

    @action(
        detail=False,
        methods=['GET'],
        filterset_class=filters.site_types.Filter,
        search_fields=filters.site_types.search_fields)
    def types(self, request):
        return self.list_related_object_view()

    @types.mapping.post
    def add_type(self, request):
        return self.create_related_object_view()
Ejemplo n.º 5
0
class SecondaryItemViewSet(mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                           mixins.DestroyModelMixin, utils.CustomViewSetMixin,
                           GenericViewSet):
    queryset = models.SecondaryItem.objects.all()  # pylint: disable=E1101

    permission_mapping = utils.PermissionMapping(
        default=IsAuthenticated)  # TODO: Fix permissions
    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.items.secondary_items)
Ejemplo n.º 6
0
class AnnotationToolViewSet(mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                            mixins.DestroyModelMixin, utils.CustomViewSetMixin,
                            GenericViewSet):
    queryset = models.AnnotationTool.objects.all()  # pylint: disable=E1101

    permission_mapping = utils.PermissionMapping(default=IsAdmin | IsDeveloper
                                                 | ReadOnly)
    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.annotations.tools)
Ejemplo n.º 7
0
class LicenceTypeViewSet(mixins.RetrieveModelMixin, mixins.DestroyModelMixin,
                         mixins.UpdateModelMixin, utils.CustomViewSetMixin,
                         GenericViewSet):
    queryset = models.LicenceType.objects.all()  # pylint: disable=E1101

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.object_types.licences)

    permission_mapping = utils.PermissionMapping()
Ejemplo n.º 8
0
class CollectionTypeSiteTypeViewSet(mixins.RetrieveModelMixin,
                                    mixins.DestroyModelMixin,
                                    utils.CustomViewSetMixin, GenericViewSet):
    queryset = models.CollectionType.site_types.through.objects.all()  # pylint: disable=E1101

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.object_types.data_collections.sites)

    permission_mapping = utils.PermissionMapping()
Ejemplo n.º 9
0
class MetaCollectionViewSet(mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                            mixins.DestroyModelMixin, utils.CustomViewSetMixin,
                            GenericViewSet):
    queryset = models.MetaCollection.objects.all()  # pylint: disable=E1101
    filterset_class = filters.metacollections.Filter
    search_fields = filters.metacollections.search_fields

    serializer_mapping = (utils.SerializerMapping.from_module(
        serializers.data_collections.metacollections).extend(
            items=serializers.items.items.ListSerializer,
            add_item=serializers.items.items.SelectSerializer,
            remove_item=serializers.items.items.SelectSerializer,
            add_curator=serializers.users.users.SelectSerializer,
            remove_curator=serializers.users.users.SelectSerializer,
        ))

    permission_mapping = utils.PermissionMapping(
        {
            utils.Actions.LIST: [IsAuthenticated],
            utils.Actions.RETRIEVE: [IsAuthenticated, IsSpecialUser],
            'items': [IsAuthenticated, IsSpecialUser],
            'add_curator': [IsAuthenticated, IsAdmin],
            'remove_curator': [IsAuthenticated, IsAdmin],
        },
        default=[IsAuthenticated, IsDeveloper | IsAdmin])

    def get_queryset(self):
        if self.action == 'items':
            metacollection_id = self.kwargs['pk']
            metacollection = models.MetaCollection.objects.get(
                pk=metacollection_id)  # pylint: disable=E1101
            return metacollection.items.all()

        return super().get_queryset()

    @action(detail=True, methods=['POST'])
    def add_item(self, request, pk=None):
        return self.add_related_object_view(models.Item, 'item')

    @action(detail=True, methods=['POST'])
    def remove_item(self, request, pk=None):
        return self.remove_related_object_view('item')

    @action(detail=True, methods=['POST'])
    def add_curator(self, request, pk=None):
        return self.add_related_object_view(models.User, 'curator')

    @action(detail=True, methods=['POST'])
    def remove_curator(self, request, pk=None):
        return self.remove_related_object_view('curator')

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.items.Filter,
            search_fields=filters.items.search_fields)
    def items(self, request, pk=None):
        return self.list_related_object_view()
Ejemplo n.º 10
0
class EntailmentTypeViewSet(mixins.RetrieveModelMixin,
                            mixins.DestroyModelMixin, mixins.UpdateModelMixin,
                            utils.CustomViewSetMixin, GenericViewSet):
    queryset = models.EntailmentType.objects.all()  # pylint: disable=E1101

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.object_types.entailments)

    permission_mapping = utils.PermissionMapping(default=IsDeveloper | IsAdmin
                                                 | ReadOnly)
Ejemplo n.º 11
0
class CollectionAdministratorViewSet(mixins.RetrieveModelMixin,
                                     mixins.DestroyModelMixin,
                                     utils.CustomViewSetMixin,
                                     GenericViewSet):
    queryset = models.Collection.administrators.through.objects.all()  # pylint: disable=E1101

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.data_collections.administrators)

    permission_mapping = utils.PermissionMapping()  # TODO: Fix permissions
Ejemplo n.º 12
0
class TermSuggestionViewSet(mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                            mixins.DestroyModelMixin, utils.CustomViewSetMixin,
                            GenericViewSet):
    queryset = models.TermSuggestion.objects.all()  # pylint: disable=E1101

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.terms.suggestions)

    permission_mapping = utils.PermissionMapping(
        default=permissions.IsOwnSuggestion | IsAdmin | ReadOnly)
Ejemplo n.º 13
0
class PhysicalDeviceViewSet(mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                            mixins.DestroyModelMixin, utils.CustomViewSetMixin,
                            GenericViewSet):

    queryset = models.PhysicalDevice.objects.all()  # pylint: disable=E1101

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.devices.physical_devices)
    permission_mapping = utils.PermissionMapping(default=permissions.IsOwner
                                                 | IsAdmin | ReadOnly)
Ejemplo n.º 14
0
class SynonymViewSet(mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                     mixins.DestroyModelMixin, utils.CustomViewSetMixin,
                     GenericViewSet):
    queryset = models.Synonym.objects.all()  # pylint: disable=E1101

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.terms.synonyms)

    permission_mapping = utils.PermissionMapping(default=IsAdmin | IsCurator
                                                 | ReadOnly)
Ejemplo n.º 15
0
class DeviceBrandViewSet(mixins.RetrieveModelMixin,
                         mixins.DestroyModelMixin,
                         mixins.UpdateModelMixin,
                         utils.CustomViewSetMixin,
                         GenericViewSet):
    queryset = models.DeviceBrand.objects.all()  # pylint: disable=E1101

    permission_mapping = utils.PermissionMapping(default=IsAdmin | ReadOnly)

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.devices.brands)
Ejemplo n.º 16
0
class MimeTypeViewSet(mixins.RetrieveModelMixin, mixins.DestroyModelMixin,
                      mixins.UpdateModelMixin, utils.CustomViewSetMixin,
                      GenericViewSet):
    queryset = models.MimeType.objects.all()  # pylint: disable=E1101

    serializer_mapping = (utils.SerializerMapping.from_module(
        serializers.object_types.mime_types))

    permission_mapping = utils.PermissionMapping(
        {
            utils.Actions.RETRIEVE: IsAuthenticated,
            utils.Actions.DESTROY: IsAdmin,
        },
        default=IsDeveloper | IsAdmin)
Ejemplo n.º 17
0
class InstitutionViewSet(mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                         mixins.DestroyModelMixin, utils.CustomViewSetMixin,
                         GenericViewSet):
    queryset = models.Institution.objects.all()  # pylint: disable=E1101

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.users.institutions)

    permission_mapping = utils.PermissionMapping(
        {
            utils.Actions.UPDATE:
            [IsAuthenticated, (permissions.IsFromInstitution | IsAdmin)],
            utils.Actions.DESTROY: [IsAuthenticated, IsAdmin],
        },
        default=IsAuthenticated)
Ejemplo n.º 18
0
class LicenceViewSet(mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                     mixins.DestroyModelMixin, utils.CustomViewSetMixin,
                     GenericViewSet):
    queryset = models.Licence.objects.all()  # pylint: disable=E1101

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.licences)

    permission_mapping = utils.PermissionMapping({
        utils.Actions.UPDATE:
        [IsAuthenticated, (permissions.IsSigner | IsAdmin)],
        utils.Actions.RETRIEVE:
        IsAuthenticated,
        utils.Actions.DESTROY:
        [IsAuthenticated, (permissions.IsSigner | IsAdmin)],
    })
Ejemplo n.º 19
0
class SynonymSuggestionViewSet(mixins.UpdateModelMixin,
                               mixins.RetrieveModelMixin,
                               mixins.DestroyModelMixin,
                               utils.CustomViewSetMixin, GenericViewSet):
    queryset = models.SynonymSuggestion.objects.all()  # pylint: disable=E1101

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.terms.synonym_suggestions)

    permission_mapping = utils.PermissionMapping(
        {
            utils.Actions.UPDATE: [
                IsAuthenticated,  # TODO: Fix permissions
            ],
            utils.Actions.DESTROY: [IsAuthenticated, IsAdmin]
        },
        default=IsAuthenticated)
Ejemplo n.º 20
0
class RoleViewSet(mixins.UpdateModelMixin, mixins.DestroyModelMixin,
                  mixins.RetrieveModelMixin, utils.CustomViewSetMixin,
                  GenericViewSet):
    queryset = models.Role.objects.all()  # pylint: disable=E1101

    serializer_mapping = (utils.SerializerMapping.from_module(
        serializers.users.roles).extend(
            add_permission=serializers.users.roles.SelectPermissionSerializer,
            remove_permission=serializers.users.roles.
            SelectPermissionSerializer))

    permission_mapping = utils.PermissionMapping(default=IsAdmin | ReadOnly)

    @action(detail=True, methods=['POST'])
    def add_permission(self, request, pk=None):
        return self.add_related_object_view(Permission, 'permission')

    @action(detail=True, methods=['POST'])
    def remove_permission(self, request, pk=None):
        return self.remove_related_object_view('permission')
Ejemplo n.º 21
0
class AnnotationTypeViewSet(mixins.RetrieveModelMixin,
                            mixins.DestroyModelMixin,
                            mixins.UpdateModelMixin,
                            utils.CustomViewSetMixin,
                            GenericViewSet):
    queryset = models.AnnotationType.objects.all()  # pylint: disable=E1101

    permission_mapping = utils.PermissionMapping({
        utils.Actions.UPDATE: [
            IsAuthenticated,
            IsDeveloper | IsAdmin,
        ],
        utils.Actions.DESTROY: [
            IsAuthenticated,
            IsAdmin,
        ],
    })

    serializer_mapping = utils.SerializerMapping.from_module(
        serializers.object_types.annotations)
Ejemplo n.º 22
0
class CollectionUserViewSet(mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                            mixins.DestroyModelMixin, utils.CustomViewSetMixin,
                            GenericViewSet):
    queryset = models.CollectionUser.objects.all()  # pylint: disable=E1101

    serializer_mapping = (utils.SerializerMapping.from_module(
        serializers.data_collections.users).extend(
            change_role=serializers.data_collections.users.RoleSerializer))

    permission_mapping = utils.PermissionMapping({
        utils.Actions.UPDATE: [
            IsAuthenticated,
            (permissions.IsSelf | permissions.HasUpdatePermission
             | permissions.IsCollectionAdmin
             | permissions.IsCollectionTypeAdmin | IsAdmin),
        ],
        utils.Actions.RETRIEVE: [
            IsAuthenticated,
            (permissions.IsSelf | permissions.IsInCollection
             | permissions.IsCollectionAdmin
             | permissions.IsCollectionTypeAdmin | IsSpecialUser),
        ],
        utils.Actions.DESTROY: [
            IsAuthenticated,
            (permissions.IsSelf | IsAdmin),
        ],
        'change_role': [(permissions.IsCollectionAdmin
                         | permissions.IsCollectionTypeAdmin | IsAdmin)],
    })

    @action(detail=True, methods=['POST'])
    def change_role(self, request, pk=None):
        instance = self.get_object()
        serializer = self.get_serializer(instance,
                                         data=request.data,
                                         partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data, status=status.HTTP_200_OK)
Ejemplo n.º 23
0
class CollectionTypeViewSet(mixins.RetrieveModelMixin,
                            mixins.DestroyModelMixin,
                            mixins.UpdateModelMixin,
                            utils.CustomViewSetMixin,
                            GenericViewSet):
    queryset = models.CollectionType.objects.all()  # pylint: disable=E1101

    permission_mapping = utils.PermissionMapping()

    serializer_mapping = (
        utils.SerializerMapping
        .from_module(serializers.object_types.data_collections.types)
        .extend(
            administrators=serializers.object_types.data_collections.administrators.ListSerializer,  # noqa pylint: disable=C0301
            add_administrator=serializers.object_types.data_collections.administrators.CreateSerializer,  # noqa pylint: disable=C0301
            site_types=serializers.object_types.data_collections.sites.ListSerializer,  # noqa pylint: disable=C0301
            add_site_type=serializers.object_types.data_collections.sites.CreateSerializer,  # noqa pylint: disable=C0301
            annotation_types=serializers.object_types.data_collections.annotations.ListSerializer,  # noqa pylint: disable=C0301
            add_annotation_type=serializers.object_types.data_collections.annotations.CreateSerializer,  # noqa pylint: disable=C0301
            licence_types=serializers.object_types.data_collections.licences.ListSerializer,  # noqa pylint: disable=C0301
            add_licence_type=serializers.object_types.data_collections.licences.CreateSerializer,  # noqa pylint: disable=C0301
            sampling_event_types=serializers.object_types.data_collections.sampling_events.ListSerializer,  # noqa pylint: disable=C0301
            add_sampling_event_type=serializers.object_types.data_collections.sampling_events.CreateSerializer,  # noqa pylint: disable=C0301
            item_types=serializers.object_types.data_collections.items.ListSerializer,  # noqa pylint: disable=C0301
            add_item_type=serializers.object_types.data_collections.items.CreateSerializer,  # noqa pylint: disable=C0301
            event_types=serializers.object_types.data_collections.events.ListSerializer,  # noqa pylint: disable=C0301
            add_event_type=serializers.object_types.data_collections.events.CreateSerializer,  # noqa pylint: disable=C0301
            device_types=serializers.object_types.data_collections.devices.ListSerializer,  # noqa pylint: disable=C0301
            add_device_type=serializers.object_types.data_collections.devices.CreateSerializer,  # noqa pylint: disable=C0301
            roles=serializers.object_types.data_collections.roles.ListSerializer,  # noqa pylint: disable=C0301
            add_role=serializers.object_types.data_collections.roles.CreateSerializer,  # noqa pylint: disable=C0301
        ))

    def get_object(self):
        type_pk = self.kwargs['pk']
        type = get_object_or_404(models.CollectionType, pk=type_pk)

        self.check_object_permissions(self.request, type)
        return type

    def get_serializer_context(self):
        context = super().get_serializer_context()

        try:
            collection_type = self.get_object()
        except (KeyError, AttributeError, AssertionError):
            collection_type = None

        context['collection_type'] = collection_type
        return context

    def get_queryset(self):
        if self.action == 'site_types':
            model = models.CollectionType.site_types.through  # pylint: disable=E1101
            collection_id = self.kwargs['pk']
            return model.objects.filter(collectiontype_id=collection_id)

        if self.action == 'administrators':
            model = models.CollectionType.administrators.through  # pylint: disable=E1101
            collection_id = self.kwargs['pk']
            return model.objects.filter(collectiontype_id=collection_id)

        if self.action == 'annotation_types':
            model = models.CollectionType.annotation_types.through  # pylint: disable=E1101
            collection_id = self.kwargs['pk']
            return model.objects.filter(collectiontype_id=collection_id)

        if self.action == 'licence_types':
            model = models.CollectionType.licence_types.through  # pylint: disable=E1101
            collection_id = self.kwargs['pk']
            return model.objects.filter(collectiontype_id=collection_id)

        if self.action == 'sampling_event_types':
            model = models.CollectionType.sampling_event_types.through  # pylint: disable=E1101
            collection_id = self.kwargs['pk']
            return model.objects.filter(collectiontype_id=collection_id)

        if self.action == 'item_types':
            collection_id = self.kwargs['pk']
            return models.CollectionItemType.objects.filter(  # pylint: disable=E1101
                collection_type=collection_id)

        if self.action == 'event_types':
            model = models.CollectionType.event_types.through  # pylint: disable=E1101
            collection_id = self.kwargs['pk']
            return model.objects.filter(collectiontype_id=collection_id)

        if self.action == 'device_types':
            collection_id = self.kwargs['pk']
            return models.CollectionDeviceType.objects.filter(  # pylint: disable=E1101
                collection_type=collection_id)

        if self.action == 'roles':
            collection_id = self.kwargs['pk']
            return models.CollectionRole.objects.filter(  # pylint: disable=E1101
                collection_type=collection_id)

        return super().get_queryset()

    @action(detail=True, methods=['GET'])
    def site_types(self, request, pk=None):
        return self.list_related_object_view()

    @site_types.mapping.post
    def add_site_type(self, request, pk=None):
        return self.create_related_object_view()

    @action(detail=True, methods=['GET'])
    def administrators(self, request, pk=None):
        return self.list_related_object_view()

    @administrators.mapping.post
    def add_administrator(self, request, pk=None):
        return self.create_related_object_view()

    @action(detail=True, methods=['GET'])
    def annotation_types(self, request, pk=None):
        return self.list_related_object_view()

    @annotation_types.mapping.post
    def add_annotation_type(self, request, pk=None):
        return self.create_related_object_view()

    @action(detail=True, methods=['GET'])
    def licence_types(self, request, pk=None):
        return self.list_related_object_view()

    @licence_types.mapping.post
    def add_licence_type(self, request, pk=None):
        return self.create_related_object_view()

    @action(detail=True, methods=['GET'])
    def sampling_event_types(self, request, pk=None):
        return self.list_related_object_view()

    @sampling_event_types.mapping.post
    def add_sampling_event_type(self, request, pk=None):
        return self.create_related_object_view()

    @action(detail=True, methods=['GET'])
    def item_types(self, request, pk=None):
        return self.list_related_object_view()

    @item_types.mapping.post
    def add_item_type(self, request, pk=None):
        return self.create_related_object_view()

    @action(detail=True, methods=['GET'])
    def event_types(self, request, pk=None):
        return self.list_related_object_view()

    @event_types.mapping.post
    def add_event_type(self, request, pk=None):
        return self.create_related_object_view()

    @action(detail=True, methods=['GET'])
    def device_types(self, request, pk=None):
        return self.list_related_object_view()

    @device_types.mapping.post
    def add_device_type(self, request, pk=None):
        return self.create_related_object_view()

    @action(detail=True, methods=['GET'])
    def roles(self, request, pk=None):
        return self.list_related_object_view()

    @roles.mapping.post
    def add_role(self, request, pk=None):
        return self.create_related_object_view()
Ejemplo n.º 24
0
class SamplingEventViewSet(mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                           mixins.DestroyModelMixin, mixins.ListModelMixin,
                           utils.CustomViewSetMixin, GenericViewSet):
    queryset = models.SamplingEvent.objects.all()  # pylint: disable=E1101
    search_fields = filters.sampling_events.search_fields
    filterset_class = filters.sampling_events.Filter

    serializer_mapping = (utils.SerializerMapping.from_module(
        serializers.sampling_events.sampling_events).extend(
            items=serializers.items.items.ListSerializer,
            devices=serializers.sampling_events.devices.ListSerializer,
            add_device=serializers.sampling_events.devices.CreateSerializer,
        ))

    permission_mapping = utils.PermissionMapping({
        utils.Actions.UPDATE: [
            IsAuthenticated,
            (permissions.IsCreator | permissions.HasChangePermissions
             | IsAdmin)
        ],
        utils.Actions.RETRIEVE: [
            IsAuthenticated,
            (permissions.IsCreator | permissions.HasViewPermissions
             | permissions.IsCollectionAdmin
             | permissions.IsCollectionTypeAdmin | IsSpecialUser)
        ],
        utils.Actions.DESTROY:
        [IsAuthenticated, (permissions.IsCreator | IsAdmin)],
        utils.Actions.LIST: [
            IsAuthenticated,
        ],
        'items': [
            IsAuthenticated,
            (permissions.IsCreator | permissions.HasViewItemsPermissions
             | permissions.IsCollectionAdmin
             | permissions.IsCollectionTypeAdmin | IsAdmin)
        ],
    })

    def get_object(self):
        sampling_event_pk = self.kwargs['pk']
        sampling_event = get_object_or_404(models.SamplingEvent,
                                           pk=sampling_event_pk)

        self.check_object_permissions(self.request, sampling_event)
        return sampling_event

    def get_serializer_context(self):
        context = super().get_serializer_context()

        try:
            sampling_event = self.get_object()
        except (KeyError, AssertionError, AttributeError):
            sampling_event = None

        context['sampling_event'] = sampling_event
        return context

    def get_queryset(self):
        if self.action == 'devices':
            object_id = self.kwargs['pk']
            return models.SamplingEventDevice.objects.filter(
                sampling_event=object_id)  # pylint: disable=E1101

        if self.action == 'items' or self.action == 'item_locations':
            object_id = self.kwargs['pk']
            return models.Item.objects.filter(  # pylint: disable=E1101
                sampling_event_device__sampling_event=object_id)

        return super().get_queryset()

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.sampling_event_devices.Filter,
            search_fields=filters.sampling_event_devices.search_fields)
    def devices(self, request, pk=None):
        return self.list_related_object_view()

    @devices.mapping.post
    def add_device(self, request, pk=None):
        return self.create_related_object_view()

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.items.Filter,
            search_fields=filters.items.search_fields)
    def items(self, request, pk=None):
        return self.list_related_object_view()

    @action(detail=True, methods=['GET'])
    def location(self, request, pk=None):
        sampling_event = self.get_object()
        serializer = serializers.sites.SamplingEventLocationSerializer(
            [sampling_event], many=True)

        return Response(serializer.data)

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.items.Filter,
            search_fields=filters.items.search_fields)
    def item_locations(self, request, pk=None):
        queryset = self.filter_queryset(self.get_queryset())

        serializer = serializers.sites.ItemLocationSerializer(queryset,
                                                              many=True,
                                                              read_only=True)
        return Response(serializer.data)
Ejemplo n.º 25
0
class TermTypeViewSet(utils.CustomViewSetMixin, ModelViewSet):
    queryset = models.TermType.objects.all()  # pylint: disable=E1101
    search_fields = filters.term_types.search_fields
    filterset_class = filters.term_types.Filter

    serializer_mapping = (utils.SerializerMapping.from_module(
        serializers.object_types.terms
    ).extend(
        terms=serializers.terms.terms.ListSerializer,
        add_term=serializers.terms.terms.CreateSerializer,
        suggestions=serializers.terms.suggestions.ListSerializer,
        suggest_term=serializers.terms.suggestions.CreateSerializer,
        entailment_types=serializers.object_types.entailments.ListSerializer,
        add_entailment_type=serializers.object_types.entailments.
        CreateSerializer,
        entailments=serializers.terms.entailments.ListSerializer,
        add_entailment=serializers.terms.entailments.CreateSerializer,
        synonyms=serializers.terms.synonyms.ListSerializer,
        add_synonym=serializers.terms.synonyms.CreateSerializer,
        synonym_suggestions=serializers.terms.synonym_suggestions.
        ListSerializer,
        suggest_synonym=serializers.terms.synonym_suggestions.CreateSerializer,
    ))

    permission_mapping = utils.PermissionMapping(
        {
            utils.Actions.DESTROY: [IsAuthenticated, IsAdmin],
            utils.Actions.CREATE: [IsAuthenticated, IsAdmin],
            utils.Actions.UPDATE: [IsAuthenticated, IsAdmin],
            'add_term': [IsAuthenticated, IsAdmin],
            'add_entailment_type': [IsAuthenticated, IsAdmin],
            'add_entailment': [IsAuthenticated, IsAdmin],
            'add_synonym': [IsAuthenticated, IsAdmin],
        },
        default=IsAuthenticated)

    def get_object(self):
        type_pk = self.kwargs['pk']
        term_type = get_object_or_404(models.TermType, pk=type_pk)

        self.check_object_permissions(self.request, term_type)
        return term_type

    def get_serializer_context(self):
        context = super().get_serializer_context()

        try:
            term_type = self.get_object()
        except (KeyError, AssertionError, AttributeError):
            term_type = None

        context['term_type'] = term_type
        return context

    def get_queryset(self):
        if self.action == 'entailments':
            return models.Entailment.objects.all()  # pylint: disable=E1101

        if self.action == 'entailment_types':
            return models.EntailmentType.objects.all()  # pylint: disable=E1101

        if self.action == 'terms':
            term_type_id = self.kwargs['pk']
            return models.Term.objects.filter(term_type=term_type_id)  # pylint: disable=E1101

        if self.action == 'synonyms':
            term_type_id = self.kwargs['pk']
            return models.Synonym.objects.filter(
                source__term_type=term_type_id)  # pylint: disable=E1101

        if self.action == 'suggestions':
            term_type_id = self.kwargs['pk']
            return models.TermSuggestion.objects.filter(term_type=term_type_id)  # pylint: disable=E1101

        if self.action == 'synonym_suggestions':
            term_type_id = self.kwargs['pk']
            return models.SynonymSuggestion.objects.filter(
                source__term_type=term_type_id)  # pylint: disable=E1101

        return super().get_queryset()

    @action(detail=False,
            methods=['GET'],
            filterset_class=filters.entailments.Filter,
            search_fields=filters.entailments.search_fields)
    def entailments(self, request):
        return self.list_related_object_view()

    @entailments.mapping.post
    def add_entailment(self, request):
        self.create_related_object_view()

    @action(detail=False,
            methods=['GET'],
            filterset_class=filters.entailment_types.Filter,
            search_fields=filters.entailment_types.search_fields)
    def entailment_types(self, request):
        return self.list_related_object_view()

    @entailment_types.mapping.post
    def add_entailment_type(self, request):
        self.create_related_object_view()

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.terms.Filter,
            search_fields=filters.terms.search_fields)
    def terms(self, request, pk=None):
        return self.list_related_object_view()

    @terms.mapping.post
    def add_term(self, request, pk=None):
        return self.create_related_object_view()

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.synonyms.Filter,
            search_fields=filters.synonyms.search_fields)
    def synonyms(self, request, pk=None):
        return self.list_related_object_view()

    @synonyms.mapping.post
    def add_synonym(self, request, pk=None):
        self.create_related_object_view()

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.term_suggestions.Filter,
            search_fields=filters.term_suggestions.search_fields)
    def suggestions(self, request, pk=None):
        return self.list_related_object_view()

    @suggestions.mapping.post
    def suggest_term(self, request, pk=None):
        self.create_related_object_view()

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.synonym_suggestions.Filter,
            search_fields=filters.synonym_suggestions.search_fields)
    def synonym_suggestions(self, request, pk=None):
        return self.list_related_object_view()

    @synonym_suggestions.mapping.post
    def suggest_synonym(self, request, pk=None):
        self.create_related_object_view()
Ejemplo n.º 26
0
class CollectionViewSet(utils.CustomViewSetMixin, ModelViewSet):
    queryset = models.Collection.objects.all()  # pylint: disable=E1101
    search_fields = filters.data_collections.search_fields
    filterset_class = filters.data_collections.Filter

    serializer_mapping = (
        utils.SerializerMapping
        .from_module(serializers.data_collections.data_collections)
        .extend(
            metacollections=serializers.data_collections.metacollections.ListSerializer,
            add_metacollection=serializers.data_collections.metacollections.CreateSerializer,
            licences=serializers.licences.ListSerializer,
            add_licence=serializers.licences.CreateSerializer,
            devices=serializers.data_collections.devices.ListSerializer,
            add_device=serializers.data_collections.devices.CreateSerializer,
            sites=serializers.data_collections.sites.ListSerializer,
            add_site=serializers.data_collections.sites.CreateSerializer,
            users=serializers.data_collections.users.ListSerializer,
            add_user=serializers.data_collections.users.CreateSerializer,
            sampling_events=serializers.sampling_events.sampling_events.ListSerializer,
            add_sampling_event=serializers.sampling_events.sampling_events.CreateSerializer,
            types=serializers.object_types.data_collections.types.ListSerializer,
            add_type=serializers.object_types.data_collections.types.CreateSerializer,
            licence_types=serializers.object_types.licences.ListSerializer,
            add_licence_type=serializers.object_types.licences.CreateSerializer,
            items=serializers.items.items.ListSerializer,
            administrators=serializers.data_collections.administrators.ListSerializer,
            add_administrator=serializers.data_collections.administrators.CreateSerializer,
        ))

    permission_mapping = utils.PermissionMapping({
        utils.Actions.UPDATE: [
            IsAuthenticated,
            (
                permissions.HasUpdatePermission |
                permissions.IsCollectionAdmin |
                permissions.IsCollectionTypeAdmin |
                IsAdmin
            )
        ],
        utils.Actions.DESTROY: [
            IsAuthenticated,
            permissions.IsCollectionAdmin | IsAdmin
        ],
        'add_licence_type': [
            IsAuthenticated, IsAdmin
        ],
        'add_metacollection': [
            IsAuthenticated, IsAdmin | IsDeveloper
        ],
        'licences': [
            IsAuthenticated,
            (
                permissions.IsCollectionUser |
                IsSpecialUser
            ),
        ],
        'add_licence': [
            IsAuthenticated,
            (
                permissions.HasAddLicencePermission |
                permissions.IsCollectionAdmin
            ),
        ],
        'devices': [
            IsAuthenticated,
            (
                permissions.IsCollectionUser |
                permissions.IsCollectionTypeAdmin |
                IsSpecialUser
            )
        ],
        'add_device': [
            IsAuthenticated,
            (
                permissions.HasAddDevicePermission |
                permissions.IsCollectionAdmin |
                IsAdmin
            )
        ],
        'sites': [
            IsAuthenticated,
            (
                permissions.IsCollectionUser |
                permissions.IsCollectionTypeAdmin |
                IsSpecialUser
            )
        ],
        'add_site': [
            IsAuthenticated,
            (
                permissions.HasAddSitePermission |
                permissions.IsCollectionAdmin |
                permissions.IsCollectionTypeAdmin |
                IsAdmin
            )
        ],
        'users': [
            IsAuthenticated,
            (
                permissions.IsCollectionUser |
                permissions.IsCollectionTypeAdmin |
                IsSpecialUser
            )
        ],
        'add_user': [
            IsAuthenticated,
            (
                permissions.HasAddUserPermission |
                permissions.IsCollectionAdmin |
                permissions.IsCollectionTypeAdmin |
                IsAdmin
            )
        ],
        'sampling_events': [
            IsAuthenticated,
            (
                permissions.IsCollectionUser |
                permissions.IsCollectionTypeAdmin |
                IsSpecialUser
            )
        ],
        'add_sampling_event': [
            IsAuthenticated,
            (
                permissions.HasAddItemPermission |
                permissions.IsCollectionAdmin |
                permissions.IsCollectionTypeAdmin |
                IsAdmin
            )
        ],
        'items': [
            IsAuthenticated,
            (
                permissions.IsCollectionUser |
                permissions.IsCollectionTypeAdmin |
                IsSpecialUser
            )
        ],
        'add_type': [IsAuthenticated, IsAdmin],
        'add_administrator': [
            IsAuthenticated,
            (
                permissions.IsCollectionAdmin |
                permissions.IsCollectionTypeAdmin |
                IsAdmin
            )
        ],
    })

    def get_object(self):
        collection_id = self.kwargs['pk']
        collection = get_object_or_404(models.Collection, pk=collection_id)

        self.check_object_permissions(self.request, collection)
        return collection

    def get_serializer_context(self):
        context = super().get_serializer_context()
        try:
            collection = self.get_object()
        except (KeyError, AssertionError, AttributeError):
            collection = None

        context['collection'] = collection
        return context

    def get_queryset(self):
        if self.action == 'metacollections':
            return models.MetaCollection.objects.all()  # pylint: disable=E1101

        if self.action == 'licences':
            collection_id = self.kwargs['pk']
            return models.Licence.objects.filter(collection=collection_id)  # pylint: disable=E1101

        if self.action == 'devices':
            collection_id = self.kwargs['pk']
            return models.CollectionDevice.objects.filter(collection=collection_id)  # pylint: disable=E1101

        if self.action == 'sites':
            collection_id = self.kwargs['pk']
            return models.CollectionSite.objects.filter(collection=collection_id)  # pylint: disable=E1101

        if self.action == 'users':
            collection_id = self.kwargs['pk']
            return models.CollectionUser.objects.filter(collection=collection_id)  # pylint: disable=E1101

        if self.action == 'sampling_events':
            collection_id = self.kwargs['pk']
            return models.SamplingEvent.objects.filter(collection=collection_id)  # pylint: disable=E1101

        if self.action == 'types':
            return models.CollectionType.objects.all()  # pylint: disable=E1101

        if self.action == 'licence_types':
            return models.LicenceType.objects.all()  # pylint: disable=E1101

        if self.action == 'items':
            collection_id = self.kwargs['pk']
            return models.Item.objects.filter(  # pylint: disable=E1101
                sampling_event_device__sampling_event__collection=collection_id)

        if self.action == 'administrators':
            model = models.Collection.administrators.through
            collection_id = self.kwargs['pk']
            return model.objects.filter(collection=collection_id)

        if self.action == 'item_locations':
            collection_id = self.kwargs['pk']
            return self.get_item_locations_queryset(collection_id)

        if self.action == 'site_locations':
            collection_id = self.kwargs['pk']
            return self.get_site_locations_queryset(collection_id)

        if self.action == 'sampling_event_locations':
            collection_id = self.kwargs['pk']
            return self.get_sampling_event_locations_queryset(collection_id)

        return super().get_queryset()

    def get_item_locations_queryset(self, collection_id):
        # TODO: Fix queryset filtering for user
        return models.Item.objects.filter(  # pylint: disable=E1101
            sampling_event_device__sampling_event__collection=collection_id)

    def get_site_locations_queryset(self, collection_id):
        # TODO: Fix queryset filtering for user
        return models.CollectionSite.objects.filter(collection=collection_id) # pylint: disable=E1101

    def get_sampling_event_locations_queryset(self, collection_id):
        # TODO: Fix queryset filtering for user
        return models.SamplingEvent.objects.filter(collection=collection_id) # pylint: disable=E1101

    @action(
        detail=False,
        methods=['GET'],
        filterset_class=filters.metacollections.Filter,
        search_fields=filters.metacollections.search_fields)
    def metacollections(self, request):
        return self.list_related_object_view()

    @metacollections.mapping.post
    def add_metacollection(self, request):
        return self.create_related_object_view()

    @action(
        detail=True,
        methods=['GET'],
        filterset_class=filters.licences.Filter,
        search_fields=filters.licences.search_fields)
    def licences(self, request, pk=None):
        return self.list_related_object_view()

    @licences.mapping.post
    def add_licence(self, request, pk=None):
        return self.create_related_object_view()

    @action(
        detail=True,
        methods=['GET'],
        filterset_class=filters.collection_devices.Filter,
        search_fields=filters.collection_devices.search_fields)
    def devices(self, request, pk=None):
        return self.list_related_object_view()

    @devices.mapping.post
    def add_device(self, request, pk=None):
        return self.create_related_object_view()

    @action(
        detail=True,
        methods=['GET'],
        filterset_class=filters.collection_sites.Filter,
        search_fields=filters.collection_sites.search_fields)
    def sites(self, request, pk=None):
        return self.list_related_object_view()

    @sites.mapping.post
    def add_site(self, request, pk=None):
        return self.create_related_object_view()

    @action(
        detail=True,
        methods=['GET'],
        filterset_class=filters.collection_users.Filter,
        search_fields=filters.collection_users.search_fields)
    def users(self, request, pk=None):
        return self.list_related_object_view()

    @users.mapping.post
    def add_user(self, request, pk=None):
        return self.create_related_object_view()

    @action(
        detail=True,
        methods=['GET'],
        filterset_class=filters.sampling_events.Filter,
        search_fields=filters.sampling_events.search_fields)
    def sampling_events(self, request, pk=None):
        return self.list_related_object_view()

    @sampling_events.mapping.post
    def add_sampling_event(self, request, pk=None):
        return self.create_related_object_view()

    @action(
        detail=False,
        methods=['GET'],
        filterset_class=filters.collection_types.Filter,
        search_fields=filters.collection_types.search_fields)
    def types(self, request):
        return self.list_related_object_view()

    @types.mapping.post
    def add_type(self, request):
        return self.create_related_object_view()

    @action(
        detail=False,
        methods=['GET'],
        filterset_class=filters.licence_types.Filter,
        search_fields=filters.licence_types.search_fields)
    def licence_types(self, request):
        return self.list_related_object_view()

    @licence_types.mapping.post
    def add_licence_type(self, request):
        return self.create_related_object_view()

    @action(
        detail=True,
        methods=['GET'],
        filterset_class=filters.collection_administrators.Filter,
        search_fields=filters.collection_administrators.search_fields)
    def administrators(self, request, pk=None):
        return self.list_related_object_view()

    @administrators.mapping.post
    def add_administrator(self, request, pk=None):
        return self.create_related_object_view()

    @action(
        detail=True,
        methods=['GET'],
        filterset_class=filters.items.Filter,
        search_fields=filters.items.search_fields)
    def items(self, request, pk=None):
        return self.list_related_object_view()

    @action(
        detail=True,
        methods=['GET'],
        filterset_class=filters.collection_sites.Filter,
        search_fields=filters.collection_sites.search_fields)
    def site_locations(self, request, pk=None):
        queryset = self.filter_queryset(self.get_queryset())

        serializer = serializers.sites.CollectionSiteLocationSerializer(
            queryset,
            many=True,
            read_only=True)
        return Response(serializer.data)

    @action(
        detail=True,
        methods=['GET'],
        filterset_class=filters.items.Filter,
        search_fields=filters.items.search_fields)
    def item_locations(self, request, pk=None):
        queryset = self.filter_queryset(self.get_queryset())

        serializer = serializers.sites.ItemLocationSerializer(
            queryset,
            many=True,
            read_only=True)
        return Response(serializer.data)

    @action(
        detail=True,
        methods=['GET'],
        filterset_class=filters.sampling_events.Filter,
        search_fields=filters.sampling_events.search_fields)
    def sampling_event_locations(self, request, pk=None):
        queryset = self.filter_queryset(self.get_queryset())

        serializer = serializers.sites.SamplingEventLocationSerializer(
            queryset,
            many=True,
            read_only=True)
        return Response(serializer.data)
Ejemplo n.º 27
0
class SamplingEventTypeViewSet(mixins.RetrieveModelMixin,
                               mixins.DestroyModelMixin,
                               utils.CustomViewSetMixin, GenericViewSet):
    queryset = models.SamplingEventType.objects.all()  # pylint: disable=E1101

    serializer_mapping = (utils.SerializerMapping.from_module(
        serializers.object_types.sampling_events.types).extend(
            device_types=serializers.object_types.sampling_events.devices.
            ListSerializer,
            add_device_types=serializers.object_types.sampling_events.devices.
            CreateSerializer,
            site_types=serializers.object_types.sampling_events.sites.
            ListSerializer,
            add_site_types=serializers.object_types.sampling_events.sites.
            CreateSerializer,
        ))

    permission_mapping = utils.PermissionMapping()

    def get_object(self):
        sampling_event_pk = self.kwargs['pk']
        sampling_event = get_object_or_404(models.SamplingEventType,
                                           pk=sampling_event_pk)

        self.check_object_permissions(self.request, sampling_event)
        return sampling_event

    def get_serializer_context(self):
        context = super().get_serializer_context()

        try:
            sampling_event_type = self.get_object()
        except (KeyError, AttributeError, AssertionError):
            sampling_event_type = None

        context['sampling_event_type'] = sampling_event_type
        return context

    def get_queryset(self):
        if self.action == 'device_types':
            sampling_event_type_id = self.kwargs['pk']
            queryset = (
                models.SamplingEventTypeDeviceTypeViewSet  # pylint: disable=E1101
                .objects.filter(sampling_event_type=sampling_event_type_id))
            return queryset

        if self.action == 'site_types':
            model = models.SamplingEventType.site_types.through  # pylint: disable=E1101
            sampling_event_type_id = self.kwargs['pk']
            return model.objects.filter(
                samplingeventtype_id=sampling_event_type_id)

        return super().get_queryset()

    @action(detail=True, methods=['GET'])
    def device_types(self, request, pk=None):
        return self.list_related_object_view()

    @device_types.mapping.post
    def add_device_types(self, request, pk=None):
        return self.create_related_object_view()

    @action(detail=True, methods=['GET'])
    def site_types(self, request, pk=None):
        return self.list_related_object_view()

    @site_types.mapping.post
    def add_site_types(self, request, pk=None):
        return self.create_related_object_view()
Ejemplo n.º 28
0
class AnnotationViewSet(mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                        mixins.DestroyModelMixin, mixins.ListModelMixin,
                        utils.CustomViewSetMixin, GenericViewSet):
    queryset = models.Annotation.objects.all()  # pylint: disable=E1101
    filterset_class = filters.annotations.Filter
    search_fields = filters.annotations.search_fields

    serializer_mapping = (utils.SerializerMapping.from_module(
        serializers.annotations.annotations).extend(
            vote=serializers.annotations.votes.CreateSerializer,
            votes=serializers.annotations.votes.ListSerializer,
            types=serializers.object_types.annotations.ListSerializer,
            add_type=serializers.object_types.annotations.CreateSerializer,
            tools=serializers.annotations.tools.ListSerializer,
            add_tool=serializers.annotations.tools.CreateSerializer,
        ))

    permission_mapping = utils.PermissionMapping(
        {
            utils.Actions.UPDATE: [
                IsAuthenticated,
                (permissions.IsCreator | permissions.HasUpdatePermission
                 | IsCurator | IsAdmin),
            ],
            utils.Actions.RETRIEVE: [
                IsAuthenticated,
                (permissions.IsCreator | permissions.HasViewPermission
                 | permissions.IsCollectionAdmin
                 | permissions.IsCollectionTypeAdmin | IsSpecialUser),
            ],
            utils.Actions.DESTROY: [
                IsAuthenticated,
                permissions.IsCreator | IsAdmin,
            ],
            'vote': [
                IsAuthenticated,
                (permissions.IsCreator | permissions.HasVotePermission
                 | IsCurator | IsAdmin),
            ],
            'votes': [
                IsAuthenticated,
                (permissions.IsCreator | permissions.HasViewPermission
                 | permissions.IsCollectionAdmin
                 | permissions.IsCollectionTypeAdmin | IsSpecialUser),
            ],
            'add_type': [IsAuthenticated, IsAdmin],
        },
        default=IsAuthenticated)

    def get_object(self):
        annotation_id = self.kwargs['pk']
        annotation = get_object_or_404(models.Annotation, pk=annotation_id)

        self.check_object_permissions(self.request, annotation)
        return annotation

    def get_serializer_context(self):
        context = super().get_serializer_context()

        try:
            annotation = self.get_object()
        except (KeyError, AssertionError, AttributeError):
            annotation = None

        context['annotation'] = annotation
        return context

    def get_queryset(self):
        if self.action == 'votes':
            annotation_id = self.kwargs['pk']
            return models.AnnotationVote.objects.filter(
                annotation=annotation_id)

        if self.action == 'types':
            return models.AnnotationType.objects.all()

        if self.action == 'tools':
            return models.AnnotationTool.objects.all()

        if self.action == utils.Actions.LIST:
            return self.get_list_queryset()

        return super().get_queryset()

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.annotation_votes.Filter,
            search_fields=filters.annotation_votes.search_fields)
    def votes(self, request, pk=None):
        return self.list_related_object_view()

    @votes.mapping.post
    def vote(self, request, pk=None):
        return self.create_related_object_view()

    @action(detail=False,
            methods=['GET'],
            filterset_class=filters.annotation_types.Filter,
            search_fields=filters.annotation_types.search_fields)
    def types(self, request):
        return self.list_related_object_view()

    @types.mapping.post
    def add_type(self, request):
        return self.create_related_object_view()

    @action(detail=False,
            methods=['GET'],
            filterset_class=filters.annotation_tools.Filter,
            search_fields=filters.annotation_tools.search_fields)
    def tools(self, request):
        return self.list_related_object_view()

    @tools.mapping.post
    def add_tool(self, request):
        return self.create_related_object_view()

    def get_list_queryset(self):
        user = self.request.user

        if user.is_special:
            return models.Annotation.objects.all()

        collection_type_queryset = self.get_collection_type_admin_queryset(
            user)
        collection_admin_queryset = self.get_collection_admin_queryset(user)
        view_pemission_queryset = self.get_view_permission_queryset(user)
        open_queryset = self.get_open_queryset()

        return open_queryset.union(collection_type_queryset,
                                   collection_admin_queryset,
                                   view_pemission_queryset)

    def get_collection_type_admin_queryset(self, user):
        return models.Annotation.objects.none()

    def get_collection_admin_queryset(self, user):
        return models.Annotation.objects.none()

    def get_view_permission_queryset(self, user):
        return models.Annotation.objects.none()

    def get_open_queryset(self):
        return models.Annotation.objects.none()
Ejemplo n.º 29
0
class DeviceViewSet(utils.CustomViewSetMixin, ModelViewSet):
    queryset = models.Device.objects.all()  # pylint: disable=E1101
    filterset_class = filters.devices.Filter
    search_fields = filters.devices.search_fields

    serializer_mapping = (utils.SerializerMapping.from_module(
        serializers.devices.devices).extend(
            types=serializers.object_types.devices.ListSerializer,
            add_type=serializers.object_types.devices.CreateSerializer,
            brands=serializers.devices.brands.ListSerializer,
            add_brand=serializers.devices.brands.CreateSerializer,
            physical_devices=serializers.devices.physical_devices.
            ListSerializer,
            add_physical_device=serializers.devices.physical_devices.
            CreateSerializer,
        ))

    permission_mapping = utils.PermissionMapping(
        {
            utils.Actions.UPDATE: IsAdmin,
            utils.Actions.DESTROY: IsAdmin,
            'add_type': IsAdmin,
        },
        default=IsAuthenticated)

    def get_queryset(self):
        if self.action == 'types':
            return models.DeviceType.objects.all()  # pylint: disable=E1101

        if self.action == 'brands':
            return models.DeviceBrand.objects.all()  # pylint: disable=E1101

        if self.action == 'physical_devices':
            # TODO: set adequate queryset for user
            return models.PhysicalDevice.objects.all()  # pylint: disable=E1101

        return super().get_queryset()

    @action(detail=False,
            methods=['GET'],
            filterset_class=filters.device_types.Filter,
            search_fields=filters.device_types.search_fields)
    def types(self, request):
        return self.list_related_object_view()

    @types.mapping.post
    def add_type(self, request):
        return self.create_related_object_view()

    @action(detail=False,
            methods=['GET'],
            filterset_class=filters.device_brands.Filter,
            search_fields=filters.device_brands.search_fields)
    def brands(self, request):
        return self.list_related_object_view()

    @brands.mapping.post
    def add_brand(self, request):
        return self.create_related_object_view()

    @action(detail=False,
            methods=['GET'],
            filterset_class=filters.physical_devices.Filter,
            search_fields=filters.physical_devices.search_fields)
    def physical_devices(self, request):
        return self.list_related_object_view()

    @physical_devices.mapping.post
    def add_physical_device(self, request):
        return self.create_related_object_view()
Ejemplo n.º 30
0
class UserViewSet(mixins.ListModelMixin, mixins.UpdateModelMixin,
                  mixins.CreateModelMixin, mixins.RetrieveModelMixin,
                  utils.CustomViewSetMixin, GenericViewSet):
    queryset = models.User.objects.all()  # pylint: disable=E1101
    filterset_class = filters.users.Filter
    search_fields = filters.users.search_fields

    permission_mapping = utils.PermissionMapping(
        {
            utils.Actions.CREATE: IsUnauthenticated,
            utils.Actions.UPDATE: [
                IsAuthenticated, permissions.IsSelf | IsAdmin
            ],  # TODO: Fix permissions
        },
        default=IsAuthenticated)

    serializer_mapping = (utils.SerializerMapping.from_module(
        serializers.users.users).extend(
            items=serializers.items.items.ListSerializer,
            devices=serializers.devices.physical_devices.ListSerializer,
            sites=serializers.sites.ListSerializer,
            roles=serializers.users.roles.ListSerializer,
            sampling_events=serializers.sampling_events.sampling_events.
            UserListSerializer,
            add_role=serializers.users.roles.CreateSerializer,
            collections=serializers.data_collections.data_collections.
            ListSerializer,
            institutions=serializers.users.institutions.ListSerializer,
            add_institution=serializers.users.institutions.CreateSerializer,
        ))

    def get_object(self):
        user_pk = self.kwargs['pk']
        user = get_object_or_404(models.User, pk=user_pk)

        self.check_object_permissions(self.request, user)
        return user

    def get_serializer_class(self):
        if self.action == 'retrieve':
            try:
                user = self.request.user
                viewed_user = self.get_object()

                if user == viewed_user or user.is_superuser:
                    return serializers.users.users.FullDetailSerializer
            except (AssertionError, AttributeError):
                return serializers.users.users.DetailSerializer
        return super().get_serializer_class()

    def get_queryset(self):
        if self.action == 'roles':
            return models.Role.objects.all()  # pylint: disable=E1101

        if self.action == 'institutions':
            return models.Institution.objects.all()  # pylint: disable=E1101

        if self.action == 'items' or self.action == 'item_locations':
            user_id = self.kwargs['pk']
            return models.Item.objects.filter(created_by=user_id)  # pylint: disable=E1101

        if self.action == 'devices':
            user_id = self.kwargs['pk']
            return models.PhysicalDevice.objects.filter(owner=user_id)  # pylint: disable=E1101

        if self.action == 'sites' or self.action == 'site_locations':
            user_id = self.kwargs['pk']
            return models.Site.objects.filter(created_by=user_id)  # pylint: disable=E1101

        if self.action == 'collections':
            user = self.get_object()
            return user.collection_users.all()

        if self.action == 'sampling_events' or self.action == 'sampling_event_locations':
            user = self.get_object()
            return user.sampling_event_created_by.all()

        return super().get_queryset()

    @action(detail=False,
            methods=['GET'],
            filterset_class=filters.roles.Filter,
            search_fields=filters.roles.search_fields)
    def roles(self, request):
        return self.list_related_object_view()

    @roles.mapping.post
    def add_role(self, request):
        return self.create_related_object_view()

    @action(detail=False,
            methods=['GET'],
            filterset_class=filters.institutions.Filter,
            search_fields=filters.institutions.search_fields)
    def institutions(self, request):
        return self.list_related_object_view()

    @institutions.mapping.post
    def add_institution(self, request):
        return self.create_related_object_view()

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.items.Filter,
            search_fields=filters.items.search_fields)
    def items(self, request, pk=None):
        return self.list_related_object_view()

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.physical_devices.Filter,
            search_fields=filters.physical_devices.search_fields)
    def devices(self, request, pk=None):
        return self.list_related_object_view()

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.sites.Filter,
            search_fields=filters.sites.search_fields)
    def sites(self, request, pk=None):
        return self.list_related_object_view()

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.sampling_events.Filter,
            search_fields=filters.sampling_events.search_fields)
    def sampling_events(self, request, pk=None):
        return self.list_related_object_view()

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.data_collections.Filter,
            search_fields=filters.data_collections.search_fields)
    def collections(self, request, pk=None):
        return self.list_related_object_view()

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.sites.Filter,
            search_fields=filters.sites.search_fields)
    def site_locations(self, request, pk=None):
        queryset = self.filter_queryset(self.get_queryset())

        serializer = serializers.sites.SiteLocationSerializer(queryset,
                                                              many=True,
                                                              read_only=True)
        return Response(serializer.data)

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.items.Filter,
            search_fields=filters.items.search_fields)
    def item_locations(self, request, pk=None):
        queryset = self.filter_queryset(self.get_queryset())

        serializer = serializers.sites.ItemLocationSerializer(queryset,
                                                              many=True,
                                                              read_only=True)
        return Response(serializer.data)

    @action(detail=True,
            methods=['GET'],
            filterset_class=filters.sampling_events.Filter,
            search_fields=filters.sampling_events.search_fields)
    def sampling_event_locations(self, request, pk=None):
        queryset = self.filter_queryset(self.get_queryset())

        serializer = serializers.sites.SamplingEventLocationSerializer(
            queryset, many=True, read_only=True)
        return Response(serializer.data)