diff --git a/src/apps/api/serializers/datasets.py b/src/apps/api/serializers/datasets.py index 21f0d6f13..0b44b7ec1 100644 --- a/src/apps/api/serializers/datasets.py +++ b/src/apps/api/serializers/datasets.py @@ -24,6 +24,8 @@ class Meta: 'created_by', 'data_file', 'was_created_by_competition', + 'competition', + 'file_name', ) read_only_fields = ( 'key', @@ -71,6 +73,7 @@ class Meta: class DataDetailSerializer(serializers.ModelSerializer): created_by = serializers.CharField(source='created_by.username') + competition = serializers.SerializerMethodField() class Meta: model = Data @@ -86,8 +89,20 @@ class Meta: 'was_created_by_competition', 'in_use', 'file_size', + 'competition', + 'file_name', ) + def get_competition(self, obj): + + # return competition dict with id and title if available + if obj.competition: + return { + "id": obj.competition.id, + "title": obj.competition.title, + } + return None + class DataGroupSerializer(serializers.ModelSerializer): class Meta: diff --git a/src/apps/api/tests/test_datasets.py b/src/apps/api/tests/test_datasets.py index 9ac798553..664178116 100644 --- a/src/apps/api/tests/test_datasets.py +++ b/src/apps/api/tests/test_datasets.py @@ -21,6 +21,7 @@ def test_dataset_api_checks_duplicate_names_for_same_user(self): 'name': 'Test!', 'type': Data.COMPETITION_BUNDLE, 'request_sassy_file_name': faker.file_name(), + 'file_name': faker.file_name(), }) assert resp.status_code == 400 diff --git a/src/apps/api/views/datasets.py b/src/apps/api/views/datasets.py index 7bc235171..3e2be9eee 100644 --- a/src/apps/api/views/datasets.py +++ b/src/apps/api/views/datasets.py @@ -42,6 +42,7 @@ def get_serializer_class(self): return serializers.DataSerializer def create(self, request, *args, **kwargs): + serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) new_dataset = serializer.save() # request_sassy_file_name is temporarily set via this serializer diff --git a/src/apps/datasets/migrations/0005_auto_20230527_0837.py b/src/apps/datasets/migrations/0005_auto_20230527_0837.py new file mode 100644 index 000000000..7fd349ef9 --- /dev/null +++ b/src/apps/datasets/migrations/0005_auto_20230527_0837.py @@ -0,0 +1,25 @@ +# Generated by Django 2.2.17 on 2023-05-27 08:37 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('competitions', '0032_submission_worker_hostname'), + ('datasets', '0004_data_deleted'), + ] + + operations = [ + migrations.AddField( + model_name='data', + name='competition', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='submission', to='competitions.Competition'), + ), + migrations.AddField( + model_name='data', + name='file_name', + field=models.CharField(default='', max_length=64), + ), + ] diff --git a/src/apps/datasets/models.py b/src/apps/datasets/models.py index 9165814e8..ae96b76ef 100644 --- a/src/apps/datasets/models.py +++ b/src/apps/datasets/models.py @@ -10,6 +10,7 @@ from chahub.models import ChaHubSaveMixin from utils.data import PathWrapper from utils.storage import BundleStorage +from competitions.models import Competition class Data(ChaHubSaveMixin, models.Model): @@ -57,6 +58,9 @@ class Data(ChaHubSaveMixin, models.Model): # are NOT marked True, since they are not created by unpacking! was_created_by_competition = models.BooleanField(default=False) + competition = models.ForeignKey(Competition, on_delete=models.PROTECT, null=True, related_name='submission') + file_name = models.CharField(max_length=64, default="") + def get_download_url(self): return reverse('datasets:download', kwargs={'key': self.key}) diff --git a/src/static/js/ours/client.js b/src/static/js/ours/client.js index fd747afd1..5a912ffb4 100644 --- a/src/static/js/ours/client.js +++ b/src/static/js/ours/client.js @@ -153,6 +153,7 @@ CODALAB.api = { create_dataset: function (metadata, data_file, progress_update_callback) { // Pass the requested file name for the SAS url metadata.request_sassy_file_name = data_file.name + metadata.file_name = data_file.name // This will be set on successful dataset creation, then used to complete the dataset upload var dataset = {} diff --git a/src/static/riot/competitions/detail/submission_upload.tag b/src/static/riot/competitions/detail/submission_upload.tag index af46d230a..76728a5ee 100644 --- a/src/static/riot/competitions/detail/submission_upload.tag +++ b/src/static/riot/competitions/detail/submission_upload.tag @@ -413,7 +413,8 @@ task_ids_to_run = [self.selected_tasks[0].id] } var data_file_metadata = { - type: 'submission' + type: 'submission', + competition: self.opts.competition.id } var data_file = self.refs.data_file.refs.file_input.files[0] self.children = [] diff --git a/src/static/riot/datasets/management.tag b/src/static/riot/datasets/management.tag index 9fa7c6dbe..3940c6c69 100644 --- a/src/static/riot/datasets/management.tag +++ b/src/static/riot/datasets/management.tag @@ -31,7 +31,8 @@
| Name | +File Name | +Competition in | Type | Size | Uploaded | @@ -45,7 +46,12 @@|||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| { dataset.name } | + +{ dataset.file_name || dataset.name } | + +{ dataset.competition.title } | + +{ dataset.type } | { format_file_size(dataset.file_size) } | { timeSince(Date.parse(dataset.created_when)) } ago | @@ -80,7 +86,7 @@ Pagination -------------------------------------->|||||||||||
| + | ||||||||||||||||