Skip to content

Commit e064a92

Browse files
FrankApiyokelvin-muchiri
authored andcommitted
Use logger.view_xform_data perm to filter data
1 parent bceffce commit e064a92

File tree

4 files changed

+33
-24
lines changed

4 files changed

+33
-24
lines changed

onadata/apps/api/permissions.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -581,19 +581,3 @@ def has_permission(self, request, view):
581581
return False
582582

583583
return True
584-
585-
586-
class ViewXFormDataPermissions(XFormPermissions):
587-
"""
588-
Applies view_(model)_data permissions for GET requests.
589-
"""
590-
591-
perms_map = {
592-
"GET": ["%(app_label)s.view_%(model_name)s_data"],
593-
"OPTIONS": [],
594-
"HEAD": [],
595-
"POST": ["%(app_label)s.add_%(model_name)s"],
596-
"PUT": ["%(app_label)s.change_%(model_name)s"],
597-
"PATCH": ["%(app_label)s.change_%(model_name)s"],
598-
"DELETE": ["%(app_label)s.delete_%(model_name)s"],
599-
}

onadata/apps/api/tests/viewsets/test_data_viewset.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1273,6 +1273,30 @@ def test_anon_data_list(self):
12731273
request = self.factory.get("/")
12741274
response = view(request)
12751275
self.assertEqual(response.status_code, 200)
1276+
self.assertEqual(len(response.data), 0)
1277+
1278+
self.xform.shared = True
1279+
self.xform.shared_data = True
1280+
self.xform.save()
1281+
response = view(request)
1282+
self.assertEqual(response.status_code, 200)
1283+
self.assertNotEqual(len(response.data), 0)
1284+
1285+
def test_authenticated_user_data_list_private_form(self):
1286+
self._make_submissions()
1287+
view = DataViewSet.as_view({"get": "list"})
1288+
self._create_user_and_login("alice", "alice")
1289+
1290+
request = self.factory.get("/")
1291+
request.user = self.user
1292+
response = view(request, pk=XForm.objects.all().first().id)
1293+
self.assertEqual(response.status_code, 404)
1294+
1295+
request = self.factory.get("/")
1296+
request.user = self.user
1297+
response = view(request)
1298+
self.assertEqual(response.status_code, 200)
1299+
self.assertEqual(len(response.data), 0)
12761300

12771301
def test_add_form_tag_propagates_to_data_tags(self):
12781302
"""Test that when a tag is applied on an xform,

onadata/apps/api/viewsets/data_viewset.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@
2323
from rest_framework.settings import api_settings
2424
from rest_framework.viewsets import ModelViewSet
2525

26-
from onadata.apps.api.permissions import (
27-
ConnectViewsetPermissions,
28-
ViewXFormDataPermissions,
29-
)
26+
from onadata.apps.api.permissions import ConnectViewsetPermissions, XFormPermissions
3027
from onadata.apps.api.tasks import delete_xform_submissions_async
3128
from onadata.apps.api.tools import add_tags_to_instance, get_baseviewset_class
3229
from onadata.apps.logger.models import MergedXForm, OsmData
@@ -144,12 +141,12 @@ class DataViewSet(
144141
]
145142

146143
filter_backends = (
147-
filters.AnonDjangoObjectPermissionFilter,
144+
filters.DataAnonDjangoObjectPermissionFilter,
148145
filters.XFormOwnerFilter,
149146
filters.DataFilter,
150147
)
151148
serializer_class = DataSerializer
152-
permission_classes = (ViewXFormDataPermissions,)
149+
permission_classes = (XFormPermissions,)
153150
lookup_field = "pk"
154151
lookup_fields = ("pk", "dataid")
155152
extra_lookup_fields = None
@@ -514,12 +511,12 @@ def _set_pagination_headers(
514511

515512
if (current_page * current_page_size) < num_of_records:
516513
next_page_url = (
517-
f"{base_url}?page={current_page + 1}&" f"page_size={current_page_size}"
514+
f"{base_url}?page={current_page + 1}&page_size={current_page_size}"
518515
)
519516

520517
if current_page > 1:
521518
prev_page_url = (
522-
f"{base_url}?page={current_page - 1}" f"&page_size={current_page_size}"
519+
f"{base_url}?page={current_page - 1}&page_size={current_page_size}"
523520
)
524521

525522
last_page = math.ceil(num_of_records / current_page_size)

onadata/libs/filters.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,10 @@ def filter_queryset(self, request, queryset, view):
194194
return queryset
195195

196196

197+
class DataAnonDjangoObjectPermissionFilter(AnonDjangoObjectPermissionFilter):
198+
perm_format = "%(app_label)s.view_%(model_name)s_data"
199+
200+
197201
class InstanceFilter(django_filter_filters.FilterSet):
198202
"""
199203
Instance FilterSet implemented using django-filter

0 commit comments

Comments
 (0)