Skip to content

Commit

Permalink
Merge pull request #71 from dev-lymar/feat/dev-add-document-download-…
Browse files Browse the repository at this point in the history
…view

Feat/dev add document download view
  • Loading branch information
dev-lymar committed Jun 21, 2024
2 parents c24fe87 + 2ae7074 commit 9df925a
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 48 deletions.
20 changes: 20 additions & 0 deletions makedoc/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,24 @@ def authorized_client(user):
client = APIClient()
refresh = RefreshToken.for_user(user)
client.credentials(HTTP_AUTHORIZATION=f"Bearer {str(refresh.access_token)}")
client.user = user
return client


@pytest.fixture
def make_test_data(faker):
return {
"delivery_type": faker.random_element(elements=("auto", "rw", "self-delivery")),
"client_id": faker.random_int(min=1, max=100),
"items": [
{"product_id": faker.random_int(min=1, max=100),
"quantity": faker.random_int(min=1, max=10),
"discount": faker.random_int(min=0, max=100)},
{"product_id": faker.random_int(min=1, max=100),
"quantity": faker.random_int(min=1, max=10),
"discount": faker.random_int(min=0, max=100)},
],
"factory_id": faker.random_int(min=1, max=100),
"destination": faker.city(),
"delivery_cost": faker.random_int(min=0, max=5000),
}
81 changes: 40 additions & 41 deletions makedoc/tests/test_views_makedoc.py
Original file line number Diff line number Diff line change
@@ -1,58 +1,57 @@
import json

import pytest
from django.core.cache import cache
from django.urls import reverse
from rest_framework.test import APIClient


@pytest.mark.django_db
def test__data_doc_view__unauthorized_user_cannot_post_data() -> None:
def test__data_doc_view__unauthorized_user_cannot_post_data(make_test_data):
client = APIClient()
url = reverse("data")
data = {
"delivery_type": "auto",
"client_id": 1,
"items": [
{"product_id": 1, "quantity": 2, "discount": 10},
{"product_id": 2, "quantity": 5, "discount": 4},
],
"factory_id": 1,
"destination": "New York",
"delivery_cost": 1500,
}
response = client.post(url, data, format="json")
assert response.status_code == 401 # Unauthorized
response = client.post(url, make_test_data, format="json")
assert response.status_code == 401


@pytest.mark.django_db
def test__data_doc_view__authorized_user_can_post_data(authorized_client) -> None:
def test__data_doc_view__authorized_user_can_post_data(authorized_client, make_test_data):
url = reverse("data")
data = {
"delivery_type": "auto",
"client_id": 1,
"items": [
{"product_id": 1, "quantity": 2, "discount": 10},
{"product_id": 2, "quantity": 5, "discount": 4},
],
"factory_id": 1,
"destination": "New York",
"delivery_cost": 1500,
}
response = authorized_client.post(url, data, format="json")
response = authorized_client.post(url, make_test_data, format="json")
assert response.status_code == 200


@pytest.mark.django_db
def test__data_doc_view__authorized_user_post_data_response_is_correct(authorized_client) -> None:
def test__data_doc_view__authorized_user_post_data_response_is_correct(authorized_client,
make_test_data):
url = reverse("data")
data = {
"delivery_type": "auto",
"client_id": 1,
"items": [
{"product_id": 1, "quantity": 2, "discount": 10},
{"product_id": 2, "quantity": 5, "discount": 4},
],
"factory_id": 1,
"destination": "New York",
"delivery_cost": 1500,
}
response = authorized_client.post(url, data, format="json")
assert response.json() == {"success": True, "data": data}
response = authorized_client.post(url, make_test_data, format="json")
assert response.status_code == 200
assert response.json() == {"Success": True}


@pytest.mark.django_db
def test__create_docs_view__authorized_user_get_valid_data(authorized_client, make_test_data):
url = reverse("file")
cache_key = f"validated_data_{authorized_client.user.id}"
cache.set(cache_key, json.dumps(make_test_data), timeout=120)
response = authorized_client.get(url)
assert response.status_code == 200
assert response.json() == {"message": "Documents saved"}
cache.delete(cache_key)


@pytest.mark.django_db
def test__create_docs_view__authorized_user_get_no_data(authorized_client):
url = reverse("file")
response = authorized_client.get(url)
assert response.status_code == 400
assert response.json() == {"error": "No data found in cache"}


@pytest.mark.django_db
def test__download_doc_view__returns_404_when_no_file_exists(authorized_client):
url = reverse("downloadfile")
response = authorized_client.get(url)
assert response.status_code == 404
assert response.json() == {"error": "No file found"}
3 changes: 2 additions & 1 deletion makedoc/urls.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from django.urls import path

from .views import DataDocView, CreateDocsView
from .views import DataDocView, CreateDocsView, DownloadDocView

urlpatterns = [
path("filemake/", CreateDocsView.as_view(), name="file"),
path("downloadfile/", DownloadDocView.as_view(), name="downloadfile"),
path("data/", DataDocView.as_view(), name="data"),
]
39 changes: 33 additions & 6 deletions makedoc/views.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import json
import os
from typing import Any

from django.core.cache import cache
from django.http import FileResponse
from rest_framework import generics, status
from rest_framework.exceptions import ValidationError
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

from makedoc.services import Documents

from .serializers import DataDocSerializer, DocumentsSimpleSerializer


Expand Down Expand Up @@ -42,9 +43,36 @@ def get(self, request, *args, **kwargs):
if docs.transport_sheet:
docs.form_transport_sheet(request)

return Response(
{"message": "Документы сохранены", "data": validated_data}, status=status.HTTP_200_OK
)
cache_key = f"last_created_file_user:{request.user.id}"
cache.set(cache_key, docs.archive_name, 300)

return Response({"message": "Documents saved"}, status=status.HTTP_200_OK)


class DownloadDocView(APIView):
permission_classes = [IsAuthenticated]

def get(self, request, *args, **kwargs):
cache_key = f"last_created_file_user:{request.user.id}"
file_name = cache.get(cache_key)

if not file_name:
return Response({"error": "No file found"}, status=status.HTTP_404_NOT_FOUND)

file_path = os.path.join("makedoc", "tempdoc", str(request.user.id), file_name)

if not os.path.exists(file_path):
return Response({"error": "File path not found!"}, status=status.HTTP_404_NOT_FOUND)

response = FileResponse(open(file_path, "rb"))
response["Content-Disposition"] = f'attachment; filename="{os.path.basename(file_name)}"'

cache.delete(cache_key)

response["message"] = "File successfully downloaded"
response.status_code = status.HTTP_200_OK

return response


class DataDocView(generics.GenericAPIView[Any]):
Expand All @@ -60,8 +88,7 @@ def post(self, request, *args, **kwargs):

validated_data = serializer.validated_data

# Use a more unique cache key
cache_key = f"validated_data_{request.user.id}"
cache.set(cache_key, json.dumps(validated_data), 120)

return Response({"success": True, "data": validated_data}, status=status.HTTP_200_OK)
return Response({"Success": True}, status=status.HTTP_200_OK)

0 comments on commit 9df925a

Please sign in to comment.