Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GSGGR-209 Add maximum order area limit #66

Merged
merged 2 commits into from
Dec 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/management/commands/seed.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ def seed(self):
))

order_type_prive = self.getOrCreate(OrderType, name='Privé', defaults={})
public = self.getOrCreate(OrderType, name='Public', defaults={})

# Create orders
order1 = Order.objects.create(
Expand Down
21 changes: 21 additions & 0 deletions api/serializers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import json
import copy
import shapely
import shapely.ops as ops
from shapely.geometry.polygon import Polygon

from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import PasswordResetForm, SetPasswordForm
Expand All @@ -26,7 +30,9 @@

# Get the UserModel
UserModel = get_user_model()
import logging

logger = logging.getLogger(__name__)

class WKTPolygonField(serializers.Field):
"""
Expand Down Expand Up @@ -290,6 +296,21 @@ class OrderSerializer(serializers.ModelSerializer):
default=serializers.CurrentUserDefault(),
)

def validate(self, attrs):
super().validate(attrs)
self._errors = {}
if 'geom' not in attrs:
return attrs
geom = attrs['geom']
area = geom.area
if settings.MAX_ORDER_AREA > 0 and area > settings.MAX_ORDER_AREA:
raise ValidationError({
'message': _(f'Order area is too large'),
'expected': settings.MAX_ORDER_AREA,
'actual': area
})
return attrs

class Meta:
model = Order
exclude = ['date_downloaded', 'extract_result', 'download_guid']
Expand Down
41 changes: 40 additions & 1 deletion api/tests/test_order.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import json

from django.urls import reverse
from django.core import mail
from django.test import override_settings

from djmoney.money import Money
from rest_framework import status
Expand Down Expand Up @@ -427,4 +430,40 @@ def test_group_with_validation(self):
"""
Tests email is sent when a product inside a group needs validation
"""
self.order_item_validation(True)
self.order_item_validation(True)

@override_settings(MAX_ORDER_AREA = 1000)
def test_order_geom_is_too_big(self):
url = reverse('order-list')
self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + self.config.client_token)
self.order_data['geom'] = {
'type': 'Polygon',
'coordinates': [
[[2545488, 1203070],
[2545605, 1211390],
[2557441, 1202601],
[2557089, 1210921],
[2545488, 1203070]]
]}
response = self.client.post(url, self.order_data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.content)
errorDetails = json.loads(response.content)
self.assertEqual(errorDetails['message'], ['Order area is too large'])
self.assertEqual(errorDetails['expected'], ['1000'])
self.assertTrue(errorDetails['actual'][0].startswith('109980.5'))

@override_settings(MAX_ORDER_AREA = 1000000)
def test_order_geom_is_fine(self):
url = reverse('order-list')
self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + self.config.client_token)
self.order_data['geom'] = {
'type': 'Polygon',
'coordinates': [
[[2545488, 1203070],
[2545605, 1211390],
[2557441, 1202601],
[2557089, 1210921],
[2545488, 1203070]]
]}
response = self.client.post(url, self.order_data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED, response.content)
5 changes: 4 additions & 1 deletion default_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -370,4 +370,7 @@ def check_oidc() -> bool:
"request_encoding": 'REST', # optional
"format": 'image/png' # optional
}
}
}

# Limit maximum allowed area of an order, in square meters. 0 for unlimited
MAX_ORDER_AREA=0
Loading
Loading