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

add created_at to dataset and Campaign #131

Merged
merged 6 commits into from
Nov 20, 2023
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
2 changes: 2 additions & 0 deletions backend/api/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ class DatasetAdmin(admin.ModelAdmin):
list_display = (
"name",
"desc",
"created_at",
"dataset_path",
"dataset_conf",
"status",
Expand Down Expand Up @@ -143,6 +144,7 @@ class AnnotationCampaignAdmin(admin.ModelAdmin):
list_display = (
"name",
"desc",
"created_at",
"instructions_url",
"start",
"end",
Expand Down
27 changes: 15 additions & 12 deletions backend/api/management/commands/seed.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import os, glob

from datetime import datetime
from random import randint, choice, shuffle

from datetime import datetime, timedelta

# TODO : Faker is a dev tool that shouldn't be needed in production
# however currently start.sh calls this command indiscriminately so it fails
Expand All @@ -15,7 +13,6 @@

from django.core import management, files
from django.utils.dateparse import parse_datetime
from datetime import timedelta
from django.utils import timezone

from django.contrib.auth.models import User
Expand Down Expand Up @@ -94,8 +91,8 @@ def _create_datasets(self):
)
self.dataset = Dataset.objects.create(
name="SPM Aural A 2010",
start_date="2010-08-19",
end_date="2010-11-02",
start_date=timezone.make_aware(datetime.strptime("2010-08-19", "%Y-%m-%d")),
end_date=timezone.make_aware(datetime.strptime("2010-11-02", "%Y-%m-%d")),
files_type=".wav",
status=1,
dataset_type=dataset_type,
Expand Down Expand Up @@ -151,25 +148,31 @@ def _create_annotation_campaigns(self):
{
"name": "Test SPM campaign",
"desc": "Test annotation campaign",
"start": "2010-08-19",
"end": "2010-11-02",
"start": timezone.make_aware(
datetime.strptime("2010-08-19", "%Y-%m-%d")
),
"end": timezone.make_aware(datetime.strptime("2010-11-02", "%Y-%m-%d")),
"instructions_url": "https://en.wikipedia.org/wiki/Saint_Pierre_and_Miquelon",
"annotation_scope": 1,
"annotation_set": self.annotation_sets["Test SPM campaign"],
},
{
"name": "Test DCLDE LF campaign",
"desc": "Test annotation campaign DCLDE LF 2015",
"start": "2012-06-22",
"end": "2012-06-26",
"start": timezone.make_aware(
datetime.strptime("2012-06-22", "%Y-%m-%d")
),
"end": timezone.make_aware(datetime.strptime("2012-06-26", "%Y-%m-%d")),
"annotation_set": self.annotation_sets["Test DCLDE LF campaign"],
"annotation_scope": 2,
},
{
"name": "Many tags campaign",
"desc": "Test annotation campaign with many tags",
"start": "2012-06-22",
"end": "2012-06-26",
"start": timezone.make_aware(
datetime.strptime("2012-06-22", "%Y-%m-%d")
),
"end": timezone.make_aware(datetime.strptime("2012-06-26", "%Y-%m-%d")),
"annotation_set": self.annotation_sets["Big tag set"],
"annotation_scope": 2,
},
Expand Down
37 changes: 37 additions & 0 deletions backend/api/migrations/0024_add_created_at_fields.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Generated by Django 3.2.21 on 2023-11-10 16:55

import datetime
from django.db import migrations, models
import django.utils.timezone


class Migration(migrations.Migration):

dependencies = [
("api", "0023_news"),
]

operations = [
migrations.AlterModelOptions(
name="annotationcampaign",
options={"ordering": ["name", "created_at"]},
),
migrations.AlterModelOptions(
name="dataset",
options={"ordering": ["name", "created_at"]},
),
migrations.AddField(
model_name="annotationcampaign",
name="created_at",
field=models.DateTimeField(
default=django.utils.timezone.now, editable=False
),
),
migrations.AddField(
model_name="dataset",
name="created_at",
field=models.DateTimeField(
default=django.utils.timezone.now, editable=False
),
),
]
4 changes: 3 additions & 1 deletion backend/api/models/annotations.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from collections import defaultdict
from random import shuffle

from django.utils import timezone
from django.db import models
from django.conf import settings

Expand Down Expand Up @@ -54,10 +54,12 @@ class AnnotationCampaign(models.Model):

class Meta:
db_table = "annotation_campaigns"
ordering = ["name", "created_at"]

def __str__(self):
return str(self.name)

created_at = models.DateTimeField(default=timezone.now, editable=False)
name = models.CharField(max_length=255, unique=True)
desc = models.TextField(null=True, blank=True)
instructions_url = models.TextField(null=True, blank=True)
Expand Down
4 changes: 4 additions & 0 deletions backend/api/models/datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from django.db import models
from django.conf import settings
from django.utils import timezone


class Collection(models.Model):
Expand Down Expand Up @@ -36,6 +37,7 @@ def __str__(self):


class Dataset(models.Model):
# pylint: disable=duplicate-code
"""
This table contains general metadata of the dataset as well as links to other metadata tables with more specific
scopes.
Expand All @@ -47,10 +49,12 @@ class Dataset(models.Model):

class Meta:
db_table = "datasets"
ordering = ["name", "created_at"]

def __str__(self):
return str(self.name)

created_at = models.DateTimeField(default=timezone.now, editable=False)
name = models.CharField(max_length=255, unique=True)
desc = models.TextField(null=True, blank=True)
dataset_path = models.CharField(max_length=255)
Expand Down
3 changes: 2 additions & 1 deletion backend/api/serializers/annotation_campaign.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

# Serializers have too many false-positives on the following warnings:
# pylint: disable=missing-function-docstring, abstract-method

from django.db.models import Count

from rest_framework import serializers
Expand Down Expand Up @@ -53,6 +52,7 @@ class Meta:
"complete_tasks_count",
"user_complete_tasks_count",
"files_count",
"created_at",
]

@extend_schema_field(serializers.IntegerField)
Expand Down Expand Up @@ -94,6 +94,7 @@ class Meta:
"end",
"annotation_set_id",
"datasets",
"created_at",
]


Expand Down
1 change: 1 addition & 0 deletions backend/api/serializers/dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class Meta:
"files_count",
"type",
"spectros",
"created_at",
]
depth = 1

Expand Down
42 changes: 23 additions & 19 deletions backend/api/views/annotation_campaign.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,27 +39,31 @@ class AnnotationCampaignViewSet(viewsets.ViewSet):

def list(self, request):
"""List annotation campaigns"""
queryset = self.queryset.annotate(
files_count=Count("datasets__files")
).prefetch_related(
"tasks",
Prefetch(
queryset = (
self.queryset.annotate(files_count=Count("datasets__files"))
.prefetch_related(
"tasks",
queryset=AnnotationTask.objects.filter(annotator_id=request.user.id),
to_attr="user_tasks",
),
Prefetch(
"tasks",
queryset=AnnotationTask.objects.filter(status=2),
to_attr="complete_tasks",
),
Prefetch(
"tasks",
queryset=AnnotationTask.objects.filter(
annotator_id=request.user.id, status=2
Prefetch(
"tasks",
queryset=AnnotationTask.objects.filter(
annotator_id=request.user.id
),
to_attr="user_tasks",
),
Prefetch(
"tasks",
queryset=AnnotationTask.objects.filter(status=2),
to_attr="complete_tasks",
),
to_attr="user_complete_tasks",
),
Prefetch(
"tasks",
queryset=AnnotationTask.objects.filter(
annotator_id=request.user.id, status=2
),
to_attr="user_complete_tasks",
),
)
.order_by("name", "created_at")
)
if not request.user.is_staff:
queryset = queryset.filter(annotators=request.user.id)
Expand Down
6 changes: 4 additions & 2 deletions backend/api/views/dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,10 @@ class DatasetViewSet(viewsets.ViewSet):

def list(self, request):
"""List available datasets"""
queryset = Dataset.objects.annotate(Count("files")).select_related(
"dataset_type"
queryset = (
Dataset.objects.annotate(Count("files"))
.select_related("dataset_type")
.order_by("name", "created_at")
)

serializer = self.serializer_class(queryset, many=True)
Expand Down
1 change: 1 addition & 0 deletions backend/tests/fixtures/datasets.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
files_type: .wav
start_date: 2010-08-19
end_date: 2010-11-02
created_at: 2023-11-02
audio_metadatum: 1
dataset_type: 1
geo_metadatum: 1
Expand Down
2 changes: 1 addition & 1 deletion backend/tests/serializers/annotation_campaign.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def test_with_valid_data(self):
create_serializer.save(owner_id=1)
self.assertEqual(AnnotationCampaign.objects.count(), old_count + 1)
self.assertEqual(AnnotationTask.objects.count(), old_tasks_count + 11)
new_campaign = AnnotationCampaign.objects.last()
new_campaign = AnnotationCampaign.objects.latest("id")
self.assertEqual(new_campaign.name, self.creation_data["name"])
self.assertEqual(new_campaign.owner_id, 1)
self.assertEqual(new_campaign.tasks.count(), 11)
Expand Down
22 changes: 17 additions & 5 deletions backend/tests/views/annotation_campaign.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
"""Annotation campaign DRF-Viewset test file"""

from freezegun import freeze_time
from django.urls import reverse
from django.utils.dateparse import parse_datetime
from django.utils import timezone
from django.contrib.auth.models import User

from datetime import datetime

from rest_framework import status
from rest_framework.test import APITestCase

Expand Down Expand Up @@ -44,6 +47,7 @@ def test_report_unauthenticated(self):
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)


@freeze_time("2012-01-14 00:00:00", tz_offset=-4)
class AnnotationCampaignViewSetTestCase(APITestCase):
"""Test AnnotationCampaignViewSet when request is authenticated"""

Expand All @@ -67,7 +71,9 @@ class AnnotationCampaignViewSetTestCase(APITestCase):
"annotation_method": 1,
"annotation_goal": 1,
"annotation_scope": 1,
"created_at": "2012-01-14T00:00:00Z",
}

add_annotators_data = {
"annotators": [3],
"annotation_method": 1,
Expand Down Expand Up @@ -104,10 +110,12 @@ def test_list_user_is_staff(self):
"complete_tasks_count",
"user_complete_tasks_count",
"files_count",
"created_at",
],
)
self.assertEqual(response.data[0]["name"], "Test RTF campaign")
self.assertEqual(response.data[1]["name"], "Test DCLDE LF campaign")

self.assertEqual(response.data[0]["name"], "Test DCLDE LF campaign")
self.assertEqual(response.data[1]["name"], "Test RTF campaign")
self.assertEqual(response.data[2]["tasks_count"], 11)

def test_list_user_no_campaign(self):
Expand Down Expand Up @@ -140,6 +148,7 @@ def test_list_user_two_campaign(self):
"complete_tasks_count",
"user_complete_tasks_count",
"files_count",
"created_at",
],
)
self.assertEqual(response.data[0]["name"], "Test DCLDE LF campaign")
Expand All @@ -165,8 +174,10 @@ def test_retrieve(self):
"end",
"annotation_set_id",
"datasets",
"created_at",
],
)

self.assertEqual(response.data["campaign"]["name"], "Test SPM campaign")
self.assertEqual(len(response.data["tasks"]), 2)
self.assertEqual(
Expand All @@ -181,7 +192,6 @@ def test_retrieve_for_unknown_campaign(self):
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

# Testing 'create'

def test_create(self):
"""AnnotationCampaign view 'create' adds new campaign to DB and returns campaign info"""
old_count = AnnotationCampaign.objects.count()
Expand All @@ -201,9 +211,11 @@ def test_create(self):
"end",
"annotation_set_id",
"datasets",
"created_at",
]
}
expected_reponse["id"] = AnnotationCampaign.objects.last().id

expected_reponse["id"] = AnnotationCampaign.objects.latest("id").id
self.assertEqual(dict(response.data), expected_reponse)

# Testing 'add_annotators'
Expand Down
4 changes: 3 additions & 1 deletion backend/tests/views/dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ def test_list(self):
"files_count",
"type",
"spectros",
"created_at",
],
)
self.assertEqual(response.data[0]["name"], "SPM Aural A 2010")
Expand Down Expand Up @@ -88,7 +89,7 @@ def test_datawork_import_for_staff_good(self):
response = self.client.post(url, data_send, format="json", follow=True)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(Dataset.objects.count(), old_count + 1)
self.assertEqual(Dataset.objects.last().files.count(), 10)
self.assertEqual(Dataset.objects.latest("id").files.count(), 10)
self.assertEqual(len(response.data), 1)
self.assertEqual(
list(response.data[0].keys()),
Expand All @@ -101,6 +102,7 @@ def test_datawork_import_for_staff_good(self):
"files_count",
"type",
"spectros",
"created_at",
],
)
self.assertEqual(response.data[0]["name"], "gliderSPAmsDemo (600_400)")
Expand Down
Loading
Loading