Skip to content

Commit 97ab2f8

Browse files
committed
Add SecretFieldModel and its serializer to handle secret fields.
1 parent d17988c commit 97ab2f8

File tree

5 files changed

+49
-5
lines changed

5 files changed

+49
-5
lines changed

tests/test_viewset_mixin.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from rest_framework.test import APIClient
55
from time_machine import TimeMachineFixture
66

7-
from tests.testapp.models import ExampleModel, AllFieldsModel, Tag
7+
from tests.testapp.models import ExampleModel, AllFieldsModel, Tag, SecretFieldModel
88

99
pytestmark = pytest.mark.django_db
1010

@@ -93,3 +93,20 @@ def test_all_fields_viewset(
9393
True,
9494
"test, example",
9595
]
96+
97+
98+
def test_secret_field_viewset(api_client, workbook_reader):
99+
SecretFieldModel.objects.create(title="foo", secret="bar")
100+
101+
response = api_client.get("/secret-field/")
102+
assert response.status_code == 200
103+
104+
wb = workbook_reader(response.content)
105+
sheet = wb.worksheets[0]
106+
rows = list(sheet.rows)
107+
assert len(rows) == 2
108+
header, data = rows
109+
110+
# Check that the secret field is not included in the header or data
111+
assert [col.value for col in header] == ["title"]
112+
assert [col.value for col in data] == ["foo"]

tests/testapp/models.py

+8
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,11 @@ def __str__(self):
3030

3131
def get_tag_names(self):
3232
return [tag.name for tag in self.tags.all()]
33+
34+
35+
class SecretFieldModel(models.Model):
36+
title = models.CharField(max_length=100)
37+
secret = models.CharField(max_length=100)
38+
39+
def __str__(self):
40+
return self.title

tests/testapp/serializers.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from rest_framework import serializers
22

3-
from .models import ExampleModel, AllFieldsModel
3+
from .models import ExampleModel, AllFieldsModel, SecretFieldModel
44

55

66
class ExampleSerializer(serializers.ModelSerializer):
@@ -23,3 +23,14 @@ class Meta:
2323
"is_active",
2424
"tags",
2525
)
26+
27+
class SecretFieldSerializer(serializers.ModelSerializer):
28+
secret_external = serializers.CharField(write_only=True)
29+
30+
class Meta:
31+
model = SecretFieldModel
32+
fields = ("title", "secret", "secret_external")
33+
34+
extra_kwargs = {
35+
"secret": {"write_only": True}
36+
}

tests/testapp/views.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from drf_excel.mixins import XLSXFileMixin
33
from drf_excel.renderers import XLSXRenderer
44

5-
from .models import ExampleModel, AllFieldsModel
6-
from .serializers import ExampleSerializer, AllFieldsSerializer
5+
from .models import ExampleModel, AllFieldsModel, SecretFieldModel
6+
from .serializers import ExampleSerializer, AllFieldsSerializer, SecretFieldSerializer
77

88

99
class ExampleViewSet(XLSXFileMixin, ReadOnlyModelViewSet):
@@ -18,3 +18,10 @@ class AllFieldsViewSet(XLSXFileMixin, ReadOnlyModelViewSet):
1818
serializer_class = AllFieldsSerializer
1919
renderer_classes = (XLSXRenderer,)
2020
filename = "al_fileds.xlsx"
21+
22+
23+
class SecretFieldViewSet(XLSXFileMixin, ReadOnlyModelViewSet):
24+
queryset = SecretFieldModel.objects.all()
25+
serializer_class = SecretFieldSerializer
26+
renderer_classes = (XLSXRenderer,)
27+
filename = "secret.xlsx"

tests/urls.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from rest_framework import routers
22

3-
from .testapp.views import ExampleViewSet, AllFieldsViewSet
3+
from .testapp.views import ExampleViewSet, AllFieldsViewSet, SecretFieldViewSet
44

55
router = routers.SimpleRouter()
66
router.register(r"examples", ExampleViewSet)
77
router.register(r"all-fields", AllFieldsViewSet)
8+
router.register(r"secret-field", SecretFieldViewSet)
89

910
urlpatterns = router.urls

0 commit comments

Comments
 (0)