diff --git a/network/api/views.py b/network/api/views.py index 746329c..bcc2451 100644 --- a/network/api/views.py +++ b/network/api/views.py @@ -1,3 +1,4 @@ +from django.core.exceptions import ObjectDoesNotExist from django.shortcuts import get_object_or_404 from django.utils.timezone import now @@ -19,13 +20,26 @@ class ObservationView(viewsets.ModelViewSet, mixins.UpdateModelMixin): pagination_class = pagination.LinkedHeaderPageNumberPagination def update(self, request, *args, **kwargs): + instance = self.get_object() if request.data.get('client_version'): - instance = self.get_object() instance.ground_station.client_version = request.data.get('client_version') instance.ground_station.save() if request.data.get('demoddata'): - instance = self.get_object() - instance.demoddata.create(payload_demod=request.data.get('demoddata')) + try: + file_path = 'data_obs/{0}/{1}'.format(instance.id, request.data.get('demoddata')) + instance.demoddata.get(payload_demod=file_path) + return Response(data='This data file has already been uploaded', + status=status.HTTP_403_FORBIDDEN) + except ObjectDoesNotExist: + instance.demoddata.create(payload_demod=request.data.get('demoddata')) + if request.data.get('waterfall'): + if instance.has_waterfall: + return Response(data='Watefall has already been uploaded', + status=status.HTTP_403_FORBIDDEN) + if request.data.get('payload'): + if instance.has_audio: + return Response(data='Audio has already been uploaded', + status=status.HTTP_403_FORBIDDEN) super(ObservationView, self).update(request, *args, **kwargs) return Response(status=status.HTTP_200_OK) diff --git a/network/base/migrations/0056_unique_demoddata_payload.py b/network/base/migrations/0056_unique_demoddata_payload.py new file mode 100644 index 0000000..f6a90a4 --- /dev/null +++ b/network/base/migrations/0056_unique_demoddata_payload.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-03-07 18:17 +from __future__ import unicode_literals + +from django.db import migrations, models +import network.base.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0055_add_new_antenna_type'), + ] + + operations = [ + migrations.AlterField( + model_name='demoddata', + name='payload_demod', + field=models.FileField(unique=True, upload_to=network.base.models._name_obs_demoddata), + ), + ] diff --git a/network/base/migrations/0057_no_null_demoddata_observation_field.py b/network/base/migrations/0057_no_null_demoddata_observation_field.py new file mode 100644 index 0000000..bcc6bf0 --- /dev/null +++ b/network/base/migrations/0057_no_null_demoddata_observation_field.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-03-07 18:28 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0056_unique_demoddata_payload'), + ] + + operations = [ + migrations.AlterField( + model_name='demoddata', + name='observation', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='demoddata', to='base.Observation'), + ), + ] diff --git a/network/base/models.py b/network/base/models.py index 5f9715a..5e2847d 100644 --- a/network/base/models.py +++ b/network/base/models.py @@ -59,6 +59,7 @@ def _name_obs_files(instance, filename): def _name_obs_demoddata(instance, filename): + # On change of the string bellow, change it also at api/views.py return 'data_obs/{0}/{1}'.format(instance.observation.id, filename) @@ -610,8 +611,8 @@ post_save.connect(_observation_post_save, sender=Observation) class DemodData(models.Model): observation = models.ForeignKey(Observation, related_name='demoddata', - on_delete=models.CASCADE, blank=True, null=True) - payload_demod = models.FileField(upload_to=_name_obs_demoddata, blank=True, null=True) + on_delete=models.CASCADE) + payload_demod = models.FileField(upload_to=_name_obs_demoddata, unique=True) copied_to_db = models.BooleanField(default=False) def is_image(self):