Source code for swh.deposit.api.private
# Copyright (C) 2017-2022 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
from typing import Optional
from rest_framework.permissions import AllowAny
from rest_framework.views import APIView
from swh.deposit.config import METADATA_TYPE, APIConfig
from swh.deposit.models import Deposit, DepositRequest
[docs]
class DepositReadMixin:
    """Deposit Read mixin"""
    def _deposit_requests(self, deposit: Deposit, request_type: str):
        """Given a deposit, yields its associated deposit_request
        Args:
            deposit: Deposit to list requests for
            request_type: 'archive' or 'metadata'
        Yields:
            deposit requests of type request_type associated to the deposit,
            most recent first
        """
        deposit_requests = DepositRequest.objects.filter(
            type=request_type, deposit=deposit
        ).order_by("-id")
        for deposit_request in deposit_requests:
            yield deposit_request
    def _metadata_get(self, deposit: Deposit) -> Optional[bytes]:
        """Retrieve the last non-empty raw metadata object for that deposit, if any
        Args:
            deposit: The deposit instance to extract metadata from
        """
        for deposit_request in self._deposit_requests(
            deposit, request_type=METADATA_TYPE
        ):
            if deposit_request.raw_metadata is not None:
                return deposit_request.raw_metadata
        return None 
[docs]
class APIPrivateView(APIConfig, APIView):
    """Mixin intended as private api (so no authentication) based API view
    (for the private ones).
    """
    def __init__(self):
        super().__init__()
        self.authentication_classes = ()
        self.permission_classes = (AllowAny,)
[docs]
    def checks(self, req, collection_name, deposit=None):
        """Override default checks implementation to allow empty collection."""
        headers = self._read_headers(req)
        self.additional_checks(req, headers, collection_name, deposit)
        return {"headers": headers} 
[docs]
    def get(
        self,
        request,
        collection_name=None,
        deposit_id=None,
        *args,
        **kwargs,
    ):
        return super().get(request, collection_name, deposit_id) 
[docs]
    def put(
        self,
        request,
        collection_name=None,
        deposit_id=None,
        *args,
        **kwargs,
    ):
        return super().put(request, collection_name, deposit_id)