From 9e5403333c9b2f255c0d57be35000a58f3cf1259 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 24 Mar 2022 11:55:44 +0100 Subject: [PATCH] Add JSONField for device metadata (#2550) --- doc/api/deviceauth.rst | 3 ++- src/pretix/api/views/device.py | 4 ++++ src/pretix/base/migrations/0209_device_info.py | 18 ++++++++++++++++++ src/pretix/base/models/devices.py | 3 +++ src/tests/api/test_deviceauth.py | 8 ++++++-- 5 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 src/pretix/base/migrations/0209_device_info.py diff --git a/doc/api/deviceauth.rst b/doc/api/deviceauth.rst index c5b92f2a4..2ca8ee3bb 100644 --- a/doc/api/deviceauth.rst +++ b/doc/api/deviceauth.rst @@ -99,7 +99,8 @@ following endpoint: "hardware_brand": "Samsung", "hardware_model": "Galaxy S", "software_brand": "pretixdroid", - "software_version": "4.1.0" + "software_version": "4.1.0", + "info": {"arbitrary": "data"} } You will receive a response equivalent to the response of your initialization request. diff --git a/src/pretix/api/views/device.py b/src/pretix/api/views/device.py index 915d285f3..875faa927 100644 --- a/src/pretix/api/views/device.py +++ b/src/pretix/api/views/device.py @@ -42,6 +42,7 @@ class InitializationRequestSerializer(serializers.Serializer): hardware_model = serializers.CharField(max_length=190) software_brand = serializers.CharField(max_length=190) software_version = serializers.CharField(max_length=190) + info = serializers.JSONField(required=False, allow_null=True) class UpdateRequestSerializer(serializers.Serializer): @@ -49,6 +50,7 @@ class UpdateRequestSerializer(serializers.Serializer): hardware_model = serializers.CharField(max_length=190) software_brand = serializers.CharField(max_length=190) software_version = serializers.CharField(max_length=190) + info = serializers.JSONField(required=False, allow_null=True) class GateSerializer(serializers.ModelSerializer): @@ -94,6 +96,7 @@ class InitializeView(APIView): device.hardware_model = serializer.validated_data.get('hardware_model') device.software_brand = serializer.validated_data.get('software_brand') device.software_version = serializer.validated_data.get('software_version') + device.info = serializer.validated_data.get('info') device.api_token = generate_api_token() device.save() @@ -114,6 +117,7 @@ class UpdateView(APIView): device.hardware_model = serializer.validated_data.get('hardware_model') device.software_brand = serializer.validated_data.get('software_brand') device.software_version = serializer.validated_data.get('software_version') + device.info = serializer.validated_data.get('info') device.save() device.log_action('pretix.device.updated', data=serializer.validated_data, auth=device) diff --git a/src/pretix/base/migrations/0209_device_info.py b/src/pretix/base/migrations/0209_device_info.py new file mode 100644 index 000000000..4532b16fd --- /dev/null +++ b/src/pretix/base/migrations/0209_device_info.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-03-22 11:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0208_auto_20220214_1632'), + ] + + operations = [ + migrations.AddField( + model_name='device', + name='info', + field=models.JSONField(null=True), + ), + ] diff --git a/src/pretix/base/models/devices.py b/src/pretix/base/models/devices.py index 2328edb46..af388137f 100644 --- a/src/pretix/base/models/devices.py +++ b/src/pretix/base/models/devices.py @@ -156,6 +156,9 @@ class Device(LoggedModel): null=True, blank=False ) + info = models.JSONField( + null=True, blank=True, + ) objects = ScopedManager(organizer='organizer') diff --git a/src/tests/api/test_deviceauth.py b/src/tests/api/test_deviceauth.py index 2eb8cb15e..bd2fdd86e 100644 --- a/src/tests/api/test_deviceauth.py +++ b/src/tests/api/test_deviceauth.py @@ -128,11 +128,15 @@ def test_update_valid_fields(device_client, device: Device): 'hardware_brand': 'Samsung', 'hardware_model': 'Galaxy S', 'software_brand': 'pretixdroid', - 'software_version': '5.0.0' - }) + 'software_version': '5.0.0', + 'info': { + 'foo': 'bar' + }, + }, format='json') assert resp.status_code == 200 device.refresh_from_db() assert device.software_version == '5.0.0' + assert device.info == {'foo': 'bar'} @pytest.mark.django_db