Skip to content
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
3 changes: 0 additions & 3 deletions .github/workflows/all.yml
Original file line number Diff line number Diff line change
Expand Up @@ -181,9 +181,6 @@ jobs:
- name: Build
working-directory: frontend
run: npm run build
- name: Typescript compilation
working-directory: frontend
run: npx tsc

# ── Playwright tests ───────────────────────────────
- name: Run Playwright tests
Expand Down
17 changes: 17 additions & 0 deletions backend/api/migrations/0007_remove_annotation_analysis.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 3.2.25 on 2026-05-29 09:08

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("api", "0006_spectrogramanalysis_frequency_scale_parts"),
]

operations = [
migrations.RemoveField(
model_name="annotation",
name="analysis",
),
]
7 changes: 1 addition & 6 deletions backend/api/models/annotation/annotation.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from .confidence import Confidence
from .detector_configuration import DetectorConfiguration
from .label import Label
from ..data import Spectrogram, SpectrogramAnalysis
from ..data import Spectrogram


class AnnotationQuerySet(ExtendedQuerySet):
Expand Down Expand Up @@ -176,11 +176,6 @@ class Meta:
on_delete=models.CASCADE,
related_name="annotations",
)
analysis = models.ForeignKey(
SpectrogramAnalysis,
on_delete=models.CASCADE,
related_name="annotations",
)

detector_configuration = models.ForeignKey(
DetectorConfiguration,
Expand Down
4 changes: 0 additions & 4 deletions backend/api/serializers/annotation.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
Label,
Confidence,
AnnotationValidation,
SpectrogramAnalysis,
AnnotationComment,
)
from backend.aplose.models import ExpertiseLevel
Expand Down Expand Up @@ -80,9 +79,6 @@ def get_fields(self):
fields["spectrogram"].queryset = Spectrogram.objects.filter(
analysis__in=campaign.analysis.all()
).distinct()
fields["analysis"].queryset = SpectrogramAnalysis.objects.filter(
id__in=campaign.analysis.values_list("id", flat=True)
)
if campaign.confidence_set is not None:
fields["confidence"] = serializers.SlugRelatedField(
queryset=campaign.confidence_set.confidence_indicators.all(),
Expand Down
11 changes: 0 additions & 11 deletions backend/api/tests/fixtures/annotation/annotation.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
annotation_phase: 1
confidence: 1
spectrogram: 7
analysis: 1
created_at: 2010-11-02 00:00:00+00:00
last_updated_at: 2010-11-02 00:00:00+00:00
is_update_of:
Expand All @@ -30,7 +29,6 @@
annotation_phase: 1
confidence: 2
spectrogram: 7
analysis: 1
created_at: 2010-11-02 00:00:00+00:00
last_updated_at: 2010-11-02 00:00:00+00:00
is_update_of:
Expand All @@ -48,7 +46,6 @@
annotation_phase: 1
confidence: 1
spectrogram: 7
analysis: 1
created_at: 2010-11-02 00:00:00+00:00
last_updated_at: 2010-11-02 00:00:00+00:00
is_update_of:
Expand All @@ -66,7 +63,6 @@
annotation_phase: 1
confidence: 1
spectrogram: 8
analysis: 1
created_at: 2010-11-02 00:00:00+00:00
last_updated_at: 2010-11-02 00:00:00+00:00
is_update_of:
Expand All @@ -84,7 +80,6 @@
annotation_phase: 1
confidence: 1
spectrogram: 8
analysis: 1
created_at: 2010-11-02 00:00:00+00:00
last_updated_at: 2010-11-02 00:00:00+00:00
is_update_of:
Expand All @@ -102,7 +97,6 @@
annotation_phase: 1
confidence: 2
spectrogram: 8
analysis: 1
created_at: 2010-11-02 00:00:00+00:00
last_updated_at: 2010-11-02 00:00:00+00:00
is_update_of:
Expand All @@ -120,7 +114,6 @@
annotation_phase: 1
confidence: 1
spectrogram: 1
analysis: 1
created_at: 2010-11-02 00:00:00+00:00
last_updated_at: 2010-11-02 00:00:00+00:00
is_update_of:
Expand All @@ -138,7 +131,6 @@
annotator: 1
confidence: 1
spectrogram: 1
analysis: 1
created_at: 2010-11-02 00:00:00+00:00
last_updated_at: 2010-11-02 00:00:00+00:00
is_update_of:
Expand All @@ -157,7 +149,6 @@
confidence: 2
spectrogram: 1
acoustic_features: 1
analysis: 1
created_at: 2010-11-02 00:00:00+00:00
last_updated_at: 2010-11-02 00:00:00+00:00
is_update_of:
Expand All @@ -174,7 +165,6 @@
annotation_phase: 4
confidence: 2
spectrogram: 1
analysis: 1
created_at: 2010-11-02 00:00:00+00:00
last_updated_at: 2010-11-02 00:00:00+00:00
is_update_of:
Expand All @@ -191,7 +181,6 @@
annotation_phase: 5
confidence: 2
spectrogram: 1
analysis: 1
created_at: 2010-11-02 00:00:00+00:00
last_updated_at: 2010-11-02 00:00:00+00:00
is_update_of: 10
7 changes: 0 additions & 7 deletions backend/api/tests/schema/annotation/update_annotations.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
"startFrequency": None,
"endFrequency": None,
"acousticFeatures": None,
"analysis": "1",
"annotationPhase": "1",
}
box_annotation = {
Expand All @@ -60,7 +59,6 @@
"hasHarmonics": True,
"trend": "Modulated",
},
"analysis": "1",
"annotationPhase": "1",
}

Expand Down Expand Up @@ -112,7 +110,6 @@ def test_connected_annotator_add_presence(self):
self.assertEqual(new_annotation.type, Annotation.Type.WEAK)
self.assertEqual(new_annotation.label.name, "Boat")
self.assertEqual(new_annotation.confidence.label, "confident")
self.assertEqual(new_annotation.analysis_id, 1)
self.assertEqual(new_annotation.spectrogram_id, 9)
self.assertEqual(new_annotation.annotator_id, 4)
self.assertIsNone(new_annotation.acoustic_features)
Expand All @@ -132,7 +129,6 @@ def test_connected_annotator_add_box(self):
self.assertEqual(new_annotation.start_time, 0.0)
self.assertEqual(new_annotation.label.name, "Boat")
self.assertEqual(new_annotation.confidence.label, "confident")
self.assertEqual(new_annotation.analysis_id, 1)
self.assertEqual(new_annotation.spectrogram_id, 9)
self.assertEqual(new_annotation.annotator_id, 4)
self.assertEqual(new_annotation.acoustic_features.start_frequency, 10.0)
Expand Down Expand Up @@ -163,7 +159,6 @@ def test_connected_annotator_update_presence_to_box(self):
self.assertEqual(new_annotation.start_time, 0.0)
self.assertEqual(new_annotation.label.name, "Boat")
self.assertEqual(new_annotation.confidence.label, "confident")
self.assertEqual(new_annotation.analysis_id, 1)
self.assertEqual(new_annotation.spectrogram_id, 9)
self.assertEqual(new_annotation.annotator_id, 4)
self.assertEqual(new_annotation.acoustic_features.start_frequency, 10.0)
Expand Down Expand Up @@ -275,7 +270,6 @@ def test_connected_annotator_does_not_exists(self):
**presence_annotation,
"label": "DCall", # label exist in different label set
"confidence": "test",
"analysis": "-1",
}
],
},
Expand All @@ -285,7 +279,6 @@ def test_connected_annotator_does_not_exists(self):
errors = json.loads(response.content)["data"]["updateAnnotations"]["errors"]
self.assertEqual(errors[0][0]["field"], "label")
self.assertEqual(errors[0][1]["field"], "confidence")
self.assertEqual(errors[0][2]["field"], "analysis")

def test_connected_annotator_min_value(self):
previous_count = Annotation.objects.count()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,6 @@
relativeMaxFrequencyCount
hasHarmonics
}
analysis {
id
}
}
}
}
Expand Down
22 changes: 5 additions & 17 deletions backend/api/tests/serializers/annotation.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
AnnotationPhase,
Annotation,
AcousticFeatures,
SpectrogramAnalysis,
)
from backend.api.serializers import AnnotationSerializer
from backend.aplose.models import User
Expand All @@ -33,7 +32,6 @@
"validations": [],
"comments": [],
"acoustic_features": None,
"analysis": 1,
}
box_result = {
"label": "Boat",
Expand All @@ -46,7 +44,6 @@
"validations": [],
"comments": [],
"acoustic_features": features,
"analysis": 1,
}

USER_ID = 4
Expand Down Expand Up @@ -86,7 +83,7 @@ def test_presence(self):
self.assertEqual(instance.type, Annotation.Type.WEAK)
self.assertEqual(instance.label.name, "Boat")
self.assertEqual(instance.confidence.label, "confident")
self.assertEqual(instance.analysis_id, PHASE_ID)
self.assertEqual(instance.annotation_phase_id, PHASE_ID)
self.assertEqual(instance.spectrogram_id, SPECTROGRAM_ID)
self.assertEqual(instance.annotator_id, USER_ID)
self.assertIsNone(instance.acoustic_features)
Expand All @@ -103,7 +100,7 @@ def test_box(self):
self.assertEqual(instance.start_time, 0.0)
self.assertEqual(instance.label.name, "Boat")
self.assertEqual(instance.confidence.label, "confident")
self.assertEqual(instance.analysis_id, PHASE_ID)
self.assertEqual(instance.annotation_phase_id, PHASE_ID)
self.assertEqual(instance.spectrogram_id, SPECTROGRAM_ID)
self.assertEqual(instance.annotator_id, USER_ID)
self.assertEqual(instance.acoustic_features.start_frequency, 10.0)
Expand Down Expand Up @@ -131,7 +128,6 @@ def test_required(self):
self.assertFalse(serializer.is_valid(raise_exception=False))
self.assertEqual(serializer.errors["label"][0].code, "required")
self.assertEqual(serializer.errors["confidence"][0].code, "required")
self.assertEqual(serializer.errors["analysis"][0].code, "required")

def test_null(self):
serializer = self._get_serializer(
Expand All @@ -143,7 +139,6 @@ def test_null(self):
"annotator": None,
"detector_configuration": None,
"label": None,
"analysis": None,
"confidence": None, # Cannot be null since campaign has a confidence indicator set
"comments": [],
"validations": [],
Expand All @@ -155,12 +150,10 @@ def test_null(self):
[
"label",
"confidence",
"analysis",
],
)
self.assertEqual(serializer.errors["label"][0].code, "null")
self.assertEqual(serializer.errors["confidence"][0].code, "null")
self.assertEqual(serializer.errors["analysis"][0].code, "null")

def test_null_confidence_in_campaign_without_confidence(self):
serializer = self._get_serializer(
Expand All @@ -177,13 +170,11 @@ def test_does_not_exist(self):
{
"label": "DCall", # label exist in different label set
"confidence": "test",
"analysis": -1,
}
)
self.assertFalse(serializer.is_valid(raise_exception=False))
self.assertEqual(serializer.errors["label"][0].code, "does_not_exist")
self.assertEqual(serializer.errors["confidence"][0].code, "does_not_exist")
self.assertEqual(serializer.errors["analysis"][0].code, "does_not_exist")

def test_min_value(self):
serializer = self._get_serializer(
Expand Down Expand Up @@ -227,12 +218,10 @@ def setUp(self):
annotator = (
AnnotationFileRange.objects.filter(annotation_phase=phase).first().annotator
)
analysis: SpectrogramAnalysis = phase.annotation_campaign.analysis.first()
features_instance = AcousticFeatures.objects.create(**features)
self.instance = Annotation.objects.create(
annotation_phase=phase,
analysis=analysis,
spectrogram=analysis.spectrograms.first(),
spectrogram=phase.annotation_campaign.spectrograms.first(),
annotator=annotator,
label=phase.annotation_campaign.label_set.labels.first(),
confidence=phase.annotation_campaign.confidence_set.confidence_indicators.first(),
Expand Down Expand Up @@ -271,7 +260,7 @@ def test_presence(self):
self.assertEqual(instance.type, Annotation.Type.WEAK)
self.assertEqual(instance.label.name, "Boat")
self.assertEqual(instance.confidence.label, "confident")
self.assertEqual(instance.analysis_id, PHASE_ID)
self.assertEqual(instance.annotation_phase_id, PHASE_ID)
self.assertEqual(instance.spectrogram_id, SPECTROGRAM_ID)
self.assertEqual(instance.annotator_id, USER_ID)
self.assertIsNone(instance.acoustic_features)
Expand All @@ -288,7 +277,7 @@ def test_box(self):
self.assertEqual(instance.start_time, 0.0)
self.assertEqual(instance.label.name, "Boat")
self.assertEqual(instance.confidence.label, "confident")
self.assertEqual(instance.analysis_id, PHASE_ID)
self.assertEqual(instance.annotation_phase_id, PHASE_ID)
self.assertEqual(instance.spectrogram_id, SPECTROGRAM_ID)
self.assertEqual(instance.annotator_id, USER_ID)
self.assertEqual(instance.acoustic_features.start_frequency, 10.0)
Expand Down Expand Up @@ -321,7 +310,6 @@ def test_box_update_label(self):
serializer = AnnotationSerializer(
data={
"is_update_of": 1,
"analysis": 1,
"label": "Mysticetes",
"confidence": "confident",
"start_time": 0.0,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,analysis,detector_configuration__configuration
Dataset,-1,-1,click,nnini,2012-10-03T10:00:00.800+00:00,2012-10-03T10:00:01.800+00:00,1,sure,1,1,test
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,detector_configuration__configuration
Dataset,-1,-1,click,nnini,2012-10-03T10:00:00.800+00:00,2012-10-03T10:00:01.800+00:00,1,sure,1,test
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,analysis,detector_configuration__configuration
Dataset,100,200,click,nnini,2012-10-03T10:00:00.800+00:00,2012-10-03T10:00:01.800+00:00,1,sure,1,1,test
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,detector_configuration__configuration
Dataset,100,200,click,nnini,2012-10-03T10:00:00.800+00:00,2012-10-03T10:00:01.800+00:00,1,sure,1,test
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,analysis,detector_configuration__configuration
Dataset,100,200,click,nnini,2012-10-03T10:00:00.800+00:00,2012-10-03T11:00:08+00:00,1,sure,1,1,test
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,detector_configuration__configuration
Dataset,100,200,click,nnini,2012-10-03T10:00:00.800+00:00,2012-10-03T11:00:08+00:00,1,sure,1,test
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,analysis,detector_configuration__configuration
Dataset,100,200,click,nnini,2032-10-03T10:00:00+00:00,2032-10-03T10:15:00+00:00,1,sure,1,1,test
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,detector_configuration__configuration
Dataset,100,200,click,nnini,2032-10-03T10:00:00+00:00,2032-10-03T10:15:00+00:00,1,sure,1,test
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,analysis,detector_configuration__configuration
Dataset,300000,400000,click,nnini,2012-10-03T10:00:00.800+00:00,2012-10-03T10:00:01.800+00:00,1,sure,1,1,test
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,detector_configuration__configuration
Dataset,300000,400000,click,nnini,2012-10-03T10:00:00.800+00:00,2012-10-03T10:00:01.800+00:00,1,sure,1,test
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,analysis,detector_configuration__configuration
Dataset,100,100,click,nnini,2012-10-03T10:00:00.800+00:00,2012-10-03T10:00:00.800+00:00,1,sure,1,1,test
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,detector_configuration__configuration
Dataset,100,100,click,nnini,2012-10-03T10:00:00.800+00:00,2012-10-03T10:00:00.800+00:00,1,sure,1,test
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,analysis,detector_configuration__configuration
Dataset,100,,click,nnini,2012-10-03T10:00:00.800+00:00,2012-10-03T10:00:00.800+00:00,1,sure,1,1,test
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,detector_configuration__configuration
Dataset,100,,click,nnini,2012-10-03T10:00:00.800+00:00,2012-10-03T10:00:00.800+00:00,1,sure,1,test
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,analysis,detector_configuration__configuration
Dataset,0,240,click,nnini,2012-10-03T10:00:00+00:00,2012-10-03T10:15:00+00:00,0,sure,1,1,test
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,detector_configuration__configuration
Dataset,0,240,click,nnini,2012-10-03T10:00:00+00:00,2012-10-03T10:15:00+00:00,0,sure,1,test
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,analysis,detector_configuration__configuration
Dataset,0,240,click,nnini,2012-10-03T10:00:00+00:00,2012-10-03T11:10:00+00:00,0,sure,1,1,test
dataset,start_frequency,end_frequency,label__name,detector__name,start_datetime,end_datetime,is_box,confidence__label,confidence__level,detector_configuration__configuration
Dataset,0,240,click,nnini,2012-10-03T10:00:00+00:00,2012-10-03T11:10:00+00:00,0,sure,1,test
Loading
Loading