diff --git a/app/apps/cases/views/case.py b/app/apps/cases/views/case.py index 1aab18ac9..dad22092c 100644 --- a/app/apps/cases/views/case.py +++ b/app/apps/cases/views/case.py @@ -1,8 +1,10 @@ +import io +import mimetypes import operator from functools import reduce from apps.addresses.models import HousingCorporation -from apps.cases.models import Case, CaseProject, CaseReason, CaseStateType +from apps.cases.models import Case, CaseDocument, CaseProject, CaseReason, CaseStateType from apps.cases.serializers import ( AdvertisementSerializer, CaseDocumentSerializer, @@ -14,7 +16,7 @@ from apps.events.mixins import CaseEventsMixin from apps.main.filters import RelatedOrderingFilter from apps.main.pagination import EmptyPagination -from apps.openzaak.helpers import create_document +from apps.openzaak.helpers import create_document, get_document, get_document_inhoud from apps.schedules.models import DaySegment, Priority, Schedule, WeekSegment from apps.users.permissions import ( CanAccessSensitiveCases, @@ -28,6 +30,7 @@ ) from django.db.models import OuterRef, Q, Subquery from django.forms.fields import CharField, MultipleChoiceField +from django.http import FileResponse from django.shortcuts import get_object_or_404 from django_filters import rest_framework as filters from drf_spectacular.types import OpenApiTypes @@ -497,18 +500,37 @@ def documents(self, request, pk): ) @action( detail=True, - url_path="documents", + url_path="documents/create", methods=["post"], ) def add_document(self, request, pk): case = self.get_object() - print(request.FILES.get("file_uploaded")) file_uploaded = request.FILES.get("file_uploaded") - content_type = file_uploaded.content_type - print(content_type) response = create_document(case, file_uploaded, "Mijn docje") - print(response) serialized = CaseDocumentSerializer(response) - print(serialized) - print(serialized.data) return Response(serialized.data) + + +class CaseDocumentViewSet( + mixins.RetrieveModelMixin, + viewsets.GenericViewSet, +): + permission_classes = [CanAccessSensitiveCases] + serializer_class = CaseDocumentSerializer + queryset = CaseDocument.objects.all() + pagination_class = StandardResultsSetPagination + + def retrieve(self, request, *args, **kwargs): + casedocument = self.get_object() + document = get_document(casedocument.document_url) + print(document) + content = get_document_inhoud(casedocument.document_content) + + response = FileResponse(io.BytesIO(content)) + response[ + "Content-Disposition" + ] = f"attachment; filename={document.bestandsnaam}" + response["Content-Type"] = mimetypes.types_map[document.formaat] + response["Content-Length"] = document.bestandsomvang + response["Last-Modified"] = document.creatiedatum + return response diff --git a/app/apps/openzaak/helpers.py b/app/apps/openzaak/helpers.py index 02997beb4..9ef677617 100644 --- a/app/apps/openzaak/helpers.py +++ b/app/apps/openzaak/helpers.py @@ -3,9 +3,13 @@ Based on: https://github.com/VNG-Realisatie/zaken-api/blob/stable/1.0.x/src/notificaties.md """ +import base64 import hashlib +import pathlib +import uuid from datetime import date, datetime +import requests from apps.cases.models import CaseDocument from django.conf import settings from django.utils import timezone @@ -49,26 +53,19 @@ def _build_zaak_body(instance): def _build_document_body(file, title, language, lock=None): file.seek(0) content = file.read() - string_content = content.decode("utf-8", errors="ignore") + string_content = base64.b64encode(content).decode("utf-8") document_body = { + "identificatie": uuid.uuid4().hex, + "formaat": pathlib.Path(file.name).suffix, + "informatieobjecttype": settings.OPENZAAK_DEFAULT_INFORMATIEOBJECTTYPE, "bronorganisatie": settings.DEFAULT_RSIN, "creatiedatum": _parse_date(date.today()), "titel": title, "auteur": settings.DEFAULT_RSIN, "taal": language, "bestandsnaam": file.name, - "formaat": file.size, "inhoud": string_content, - "informatieobjecttype": settings.OPENZAAK_DEFAULT_INFORMATIEOBJECTTYPE, - "ontvangstdatum": _parse_date(date.today()), - "verzenddatum": _parse_date(date.today()), - "ondertekening": {"soort": "analoog", "datum": _parse_date(date.today())}, - "integriteit": { - "algoritme": "sha_3", - "waarde": _get_file_hash(content), - "datum": _parse_date(date.today()), - }, } if lock: document_body["lock"] = lock @@ -189,15 +186,20 @@ def get_document(document_url): response = drc_client.retrieve( "zaakinformatieobject", url=document_url, - request_kwargs={ - "headers": { - "Accept-Crs": "EPSG:4326", - } - }, ) return factory(Document, response) +def get_document_inhoud(document_inhoud_url): + client = Service.objects.filter(api_type=APITypes.drc).get().build_client() + response = requests.get( + document_inhoud_url, + headers=client.auth.credentials(), + ) + response.raise_for_status() + return response.content + + def update_document(case_document, file, title, language="nld"): drc_client = Service.objects.filter(api_type=APITypes.drc).get().build_client() lock = drc_client.request( diff --git a/app/apps/openzaak/signals.py b/app/apps/openzaak/signals.py index 4c3bc7245..357e68faf 100644 --- a/app/apps/openzaak/signals.py +++ b/app/apps/openzaak/signals.py @@ -40,7 +40,8 @@ def create_case_state_instance_in_openzaak(sender, instance, created, **kwargs): and not instance.system_build ): try: - create_open_zaak_case_state(instance) + pass + # create_open_zaak_case_state(instance) except ClientError as e: logger.error(e) except Exception as e: diff --git a/app/config/urls.py b/app/config/urls.py index 7b304c0ea..9a432b483 100644 --- a/app/config/urls.py +++ b/app/config/urls.py @@ -1,6 +1,7 @@ from apps.addresses.views import AddressViewSet from apps.cases.views import ( CaseCloseViewSet, + CaseDocumentViewSet, CaseThemeViewSet, CaseViewSet, ImportBWVCaseDataView, @@ -33,6 +34,7 @@ router = DefaultRouter() router.register(r"addresses", AddressViewSet, basename="addresses") router.register(r"cases", CaseViewSet, basename="cases") +router.register(r"documents", CaseDocumentViewSet, basename="documents") router.register(r"tasks", CaseUserTaskViewSet, basename="tasks") router.register(r"themes", CaseThemeViewSet, basename="themes") router.register(r"debriefings", DebriefingViewSet, basename="debriefings") diff --git a/open-zaak/open-zaak/.env b/open-zaak/open-zaak/.env index ba25adaeb..763f098c8 100644 --- a/open-zaak/open-zaak/.env +++ b/open-zaak/open-zaak/.env @@ -11,6 +11,7 @@ DB_PASSWORD=openzaak CACHE_DEFAULT=redis:6379 CACHE_AXES=redis:6379 EMAIL_HOST=mail.gemeente.nl +SENDFILE_BACKEND=django_sendfile.backends.simple CMIS_ENABLED=False CMIS_MAPPER_FILE="/app/config/cmis_mapper.json"