mirror of
https://gitlab.com/bramw/baserow.git
synced 2025-04-17 02:17:49 +00:00
made it possible to update and delete existing applications
This commit is contained in:
parent
b5df7da903
commit
8da650c3a4
5 changed files with 123 additions and 4 deletions
backend
src/baserow/api/v0/applications
tests/baserow/api/v0/applications
1
backend/src/baserow/api/v0/applications/errors.py
Normal file
1
backend/src/baserow/api/v0/applications/errors.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ERROR_USER_NOT_IN_GROUP = 'ERROR_USER_NOT_IN_GROUP'
|
|
@ -27,3 +27,10 @@ class ApplicationCreateSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Application
|
model = Application
|
||||||
fields = ('name', 'type')
|
fields = ('name', 'type')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ApplicationUpdateSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Application
|
||||||
|
fields = ('name',)
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
from django.conf.urls import url
|
from django.conf.urls import url
|
||||||
|
|
||||||
from .views import ApplicationsView
|
from .views import ApplicationsView, ApplicationView
|
||||||
|
|
||||||
|
|
||||||
app_name = 'baserow.api.v0.group'
|
app_name = 'baserow.api.v0.group'
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'(?P<group_id>[0-9]+)/$', ApplicationsView.as_view(), name='list')
|
url(r'group/(?P<group_id>[0-9]+)/$', ApplicationsView.as_view(), name='list'),
|
||||||
|
url(r'(?P<application_id>[0-9]+)/$', ApplicationView.as_view(), name='item'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -5,11 +5,15 @@ from rest_framework.views import APIView
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
|
||||||
from baserow.api.v0.decorators import validate_body
|
from baserow.api.v0.decorators import validate_body, map_exceptions
|
||||||
from baserow.core.models import GroupUser, Application
|
from baserow.core.models import GroupUser, Application
|
||||||
from baserow.core.handler import CoreHandler
|
from baserow.core.handler import CoreHandler
|
||||||
|
from baserow.core.exceptions import UserNotIngroupError
|
||||||
|
|
||||||
from .serializers import ApplicationSerializer, ApplicationCreateSerializer
|
from .serializers import (
|
||||||
|
ApplicationSerializer, ApplicationCreateSerializer, ApplicationUpdateSerializer
|
||||||
|
)
|
||||||
|
from .errors import ERROR_USER_NOT_IN_GROUP
|
||||||
|
|
||||||
|
|
||||||
class ApplicationsView(APIView):
|
class ApplicationsView(APIView):
|
||||||
|
@ -45,3 +49,38 @@ class ApplicationsView(APIView):
|
||||||
request.user, group_user.group, data['type'], name=data['name'])
|
request.user, group_user.group, data['type'], name=data['name'])
|
||||||
|
|
||||||
return Response(ApplicationSerializer(application).data)
|
return Response(ApplicationSerializer(application).data)
|
||||||
|
|
||||||
|
|
||||||
|
class ApplicationView(APIView):
|
||||||
|
permission_classes = (IsAuthenticated,)
|
||||||
|
core_handler = CoreHandler()
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
|
@validate_body(ApplicationUpdateSerializer)
|
||||||
|
@map_exceptions({
|
||||||
|
UserNotIngroupError: ERROR_USER_NOT_IN_GROUP
|
||||||
|
})
|
||||||
|
def patch(self, request, data, application_id):
|
||||||
|
"""Updates the application if it belongs to a user."""
|
||||||
|
application = get_object_or_404(
|
||||||
|
Application.objects.select_related('group').select_for_update(),
|
||||||
|
pk=application_id
|
||||||
|
)
|
||||||
|
application = self.core_handler.update_application(
|
||||||
|
request.user, application, name=data['name'])
|
||||||
|
|
||||||
|
return Response(ApplicationSerializer(application).data)
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
|
@map_exceptions({
|
||||||
|
UserNotIngroupError: ERROR_USER_NOT_IN_GROUP
|
||||||
|
})
|
||||||
|
def delete(self, request, application_id):
|
||||||
|
"""Deletes an existing application if the user belongs to the group."""
|
||||||
|
application = get_object_or_404(
|
||||||
|
Application.objects.select_related('group'),
|
||||||
|
pk=application_id
|
||||||
|
)
|
||||||
|
self.core_handler.delete_application(request.user, application)
|
||||||
|
|
||||||
|
return Response(status=204)
|
||||||
|
|
|
@ -92,3 +92,74 @@ def test_create_application(api_client, data_fixture):
|
||||||
assert response_json['id'] == database.id
|
assert response_json['id'] == database.id
|
||||||
assert response_json['name'] == database.name
|
assert response_json['name'] == database.name
|
||||||
assert response_json['order'] == database.order
|
assert response_json['order'] == database.order
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_update_application(api_client, data_fixture):
|
||||||
|
user, token = data_fixture.create_user_and_token()
|
||||||
|
user_2, token_2 = data_fixture.create_user_and_token()
|
||||||
|
group = data_fixture.create_group(user=user)
|
||||||
|
group_2 = data_fixture.create_group(user=user_2)
|
||||||
|
application = data_fixture.create_database_application(group=group)
|
||||||
|
application_2 = data_fixture.create_database_application(group=group_2)
|
||||||
|
|
||||||
|
url = reverse('api_v0:applications:item',
|
||||||
|
kwargs={'application_id': application_2.id})
|
||||||
|
response = api_client.patch(
|
||||||
|
url,
|
||||||
|
{'name': 'Test 1'},
|
||||||
|
format='json',
|
||||||
|
HTTP_AUTHORIZATION=f'JWT {token}'
|
||||||
|
)
|
||||||
|
response_json = response.json()
|
||||||
|
assert response.status_code == 400
|
||||||
|
assert response_json['error'] == 'ERROR_USER_NOT_IN_GROUP'
|
||||||
|
|
||||||
|
url = reverse('api_v0:applications:item', kwargs={'application_id': application.id})
|
||||||
|
response = api_client.patch(
|
||||||
|
url,
|
||||||
|
{'UNKNOWN_FIELD': 'Test 1'},
|
||||||
|
format='json',
|
||||||
|
HTTP_AUTHORIZATION=f'JWT {token}'
|
||||||
|
)
|
||||||
|
response_json = response.json()
|
||||||
|
assert response.status_code == 400
|
||||||
|
assert response_json['error'] == 'ERROR_REQUEST_BODY_VALIDATION'
|
||||||
|
|
||||||
|
url = reverse('api_v0:applications:item', kwargs={'application_id': application.id})
|
||||||
|
response = api_client.patch(
|
||||||
|
url,
|
||||||
|
{'name': 'Test 1'},
|
||||||
|
format='json',
|
||||||
|
HTTP_AUTHORIZATION=f'JWT {token}'
|
||||||
|
)
|
||||||
|
response_json = response.json()
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert response_json['id'] == application.id
|
||||||
|
assert response_json['name'] == 'Test 1'
|
||||||
|
|
||||||
|
application.refresh_from_db()
|
||||||
|
assert application.name == 'Test 1'
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_delete_application(api_client, data_fixture):
|
||||||
|
user, token = data_fixture.create_user_and_token()
|
||||||
|
user_2, token_2 = data_fixture.create_user_and_token()
|
||||||
|
group = data_fixture.create_group(user=user)
|
||||||
|
group_2 = data_fixture.create_group(user=user_2)
|
||||||
|
application = data_fixture.create_database_application(group=group)
|
||||||
|
application_2 = data_fixture.create_database_application(group=group_2)
|
||||||
|
|
||||||
|
url = reverse('api_v0:applications:item',
|
||||||
|
kwargs={'application_id': application_2.id})
|
||||||
|
response = api_client.delete(url, HTTP_AUTHORIZATION=f'JWT {token}')
|
||||||
|
response_json = response.json()
|
||||||
|
assert response.status_code == 400
|
||||||
|
assert response_json['error'] == 'ERROR_USER_NOT_IN_GROUP'
|
||||||
|
|
||||||
|
url = reverse('api_v0:applications:item', kwargs={'application_id': application.id})
|
||||||
|
response = api_client.delete(url, HTTP_AUTHORIZATION=f'JWT {token}')
|
||||||
|
assert response.status_code == 204
|
||||||
|
|
||||||
|
assert Database.objects.all().count() == 1
|
||||||
|
|
Loading…
Add table
Reference in a new issue