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

feat(double-check): Allow validation of imported annotations [ADEV-10] #191

Merged
merged 116 commits into from
Jun 24, 2024
Merged
Show file tree
Hide file tree
Changes from 98 commits
Commits
Show all changes
116 commits
Select commit Hold shift + click to select a range
acbf1aa
chore(frontend): initialize aplose frontend with Vite instead of depr…
rvovard Nov 8, 2023
2311abc
chore(frontend): initialize aplose frontend with Vite - part 2 (edit …
rvovard Nov 8, 2023
d6bf727
chore(frontend): move files to use TypeScript (editing will be done i…
rvovard Nov 24, 2023
47a1a61
chore(frontend): update main.tsx for ViteJS and add forgotten react-r…
rvovard Nov 24, 2023
7841cf9
chore(vitejs): update all component files with no big modifications t…
rvovard Nov 24, 2023
009cb2b
chore(frontend): update a new batch of components for typescript
rvovard Dec 14, 2023
2cdb599
chore(frontend): __WIP__ update AudioAnnotator component for typescri…
rvovard Dec 14, 2023
18a8ec5
App & Auth
ElodieENSTA Jan 3, 2024
faf1410
DatasetList
ElodieENSTA Jan 3, 2024
1c7b7e2
Annotation campaign list
ElodieENSTA Jan 3, 2024
c21d100
Annotation campaign detail
ElodieENSTA Jan 3, 2024
746e7e5
Annotation task list
ElodieENSTA Jan 3, 2024
b22597b
CreateAnnotationCampaign.tsx
ElodieENSTA Jan 3, 2024
4ecacb1
EditAnnotationCampaign.tsx
ElodieENSTA Jan 3, 2024
048615c
AudioAnnotator.tsx
ElodieENSTA Jan 4, 2024
a5e0ebf
fix DatasetList.tsx
ElodieENSTA Jan 4, 2024
4d79fea
fix wip
ElodieENSTA Jan 9, 2024
f7739a9
Cypress cherry pick
ElodieENSTA Jan 9, 2024
1aa3cbd
Datasets tests updated
ElodieENSTA Jan 9, 2024
90db1db
AnnotationCampaignDetail.tsx
ElodieENSTA Jan 9, 2024
29d2db7
wip - annotator
ElodieENSTA Jan 10, 2024
556aba8
wip - auth
ElodieENSTA Jan 11, 2024
3902966
wip - auth
ElodieENSTA Jan 11, 2024
b066fcd
wip - global components
ElodieENSTA Jan 11, 2024
e0e635b
wip - global components
ElodieENSTA Jan 11, 2024
a9b3454
wip - global components
ElodieENSTA Jan 11, 2024
88115d2
wip - login page
ElodieENSTA Jan 11, 2024
a691162
wip - dataset list page
ElodieENSTA Jan 11, 2024
879694d
wip - annotation campaign list page
ElodieENSTA Jan 11, 2024
6ce867d
wip - annotation campaign detail page
ElodieENSTA Jan 11, 2024
0efc57d
wip - annotation campaign create/edit page
ElodieENSTA Jan 11, 2024
2b0e104
wip - annotation task list page
ElodieENSTA Jan 11, 2024
0eb1951
wip - annotator
ElodieENSTA Jan 15, 2024
e75c46f
wip - annotator refacto done > next start testing
ElodieENSTA Jan 26, 2024
7a59c12
FIX login
ElodieENSTA Jan 26, 2024
098855d
FIX login
ElodieENSTA Jan 26, 2024
1109980
FIX datasets
ElodieENSTA Jan 29, 2024
707a16f
FIX campaigns
ElodieENSTA Jan 29, 2024
72ca34d
FIX campaign creation
ElodieENSTA Jan 29, 2024
63010fa
FIX Annotator - Spectro
ElodieENSTA Jan 30, 2024
1aa031d
FIX Annotator - Pointer
ElodieENSTA Jan 30, 2024
2b49e58
clean logs
ElodieENSTA Jan 30, 2024
96771a1
FIX annotator for whole files
ElodieENSTA Feb 1, 2024
757ba64
FIX annotator
ElodieENSTA Feb 1, 2024
45e6536
remove unused tests
ElodieENSTA Feb 1, 2024
7b37714
rebase - applied navgation fix from master
ElodieENSTA Feb 1, 2024
d9256be
Sort collaborators by level, name
ElodieENSTA Feb 1, 2024
c6aa569
Fix workflow
ElodieENSTA Feb 1, 2024
337d633
FIX Cypress CI
ElodieENSTA Feb 1, 2024
b7659d2
FIX CI
ElodieENSTA Feb 1, 2024
16aee92
Fix docker compose & small fixes
ElodieENSTA Feb 1, 2024
50620fc
FIX play/pause shortcut for annotation playing and minimal size for b…
ElodieENSTA Feb 1, 2024
8f0a103
remove dev logs
ElodieENSTA Feb 1, 2024
c41a819
[Data] Création du modèle "Detector"
ElodieENSTA Feb 2, 2024
dd8b805
[Data] Evolution des modèles
ElodieENSTA Feb 5, 2024
96b8717
New create campaign page with new style
ElodieENSTA Feb 6, 2024
149c54e
New create campaign page with new style
ElodieENSTA Feb 6, 2024
c9e80ea
Campaign creation form > annotation bloc component
ElodieENSTA Feb 6, 2024
fc4740c
Move searchbar component
ElodieENSTA Feb 7, 2024
4841b44
Import existing result for check campaign ok
ElodieENSTA Feb 20, 2024
6449237
annotator and result csv export updated
ElodieENSTA Feb 21, 2024
a51e0d9
Merge remote-tracking branch 'origin/master' into feature/double_check
ElodieENSTA Feb 21, 2024
4cfcbbd
Fix add instruction URL to annotation task retrieve
ElodieENSTA Feb 23, 2024
1d8f710
Remove materialize.min.css
ElodieENSTA Feb 23, 2024
8b16c40
Remove unused components
ElodieENSTA Feb 23, 2024
3e44888
Dataset list page
ElodieENSTA Mar 8, 2024
506c4e8
Login page: add autocomplete info on inputs
ElodieENSTA Mar 8, 2024
54f1624
Login page: add autocomplete info on inputs
ElodieENSTA Mar 8, 2024
9a34ec5
Annotation campaign list
ElodieENSTA Mar 8, 2024
bbbbc8f
New input component
ElodieENSTA Mar 11, 2024
fb64d76
New select component
ElodieENSTA Mar 12, 2024
5d9d9c5
New chips-input component
ElodieENSTA Mar 12, 2024
42cdf73
New textarea component
ElodieENSTA Mar 12, 2024
752fc7c
New Drag-n-drop file input component
ElodieENSTA Mar 12, 2024
608f98b
New searchbar component
ElodieENSTA Mar 12, 2024
93174f3
Improve Drag n drop file input test with actual input file
ElodieENSTA Mar 13, 2024
094522c
remove logs
ElodieENSTA Mar 13, 2024
4d7eae3
Fix seeding was creating 2 sound001.wav per dataset
ElodieENSTA Mar 14, 2024
737407d
Create campaign tests + backend tests
ElodieENSTA Mar 18, 2024
45cd1b4
Update recover campaign information tests
ElodieENSTA Mar 19, 2024
eb744ed
Edit campaign
ElodieENSTA Mar 19, 2024
0ffeba7
Seed now create whole file campaigns
ElodieENSTA Mar 19, 2024
b7642e4
FIX pointer indicator on leave should disappear
ElodieENSTA Mar 19, 2024
8a29143
Small fixes
ElodieENSTA Mar 19, 2024
134ea5b
Merge remote-tracking branch 'origin/master' into feature/double_check
ElodieENSTA Mar 19, 2024
7ea1168
Fix CI
ElodieENSTA Mar 19, 2024
949eaf7
FIX Pylint issues
ElodieENSTA Apr 2, 2024
ebf9ed0
[ADEV-10] Fix error while uploading only some of all detectors in file
ElodieENSTA Apr 3, 2024
e50bf92
Try fix CI
ElodieENSTA Apr 10, 2024
1b83e27
Try fix CI
ElodieENSTA Apr 10, 2024
3862e4c
FIX creating multiple detectors with same config
ElodieENSTA Apr 12, 2024
35c0b51
FIX: file upload on firefox
ElodieENSTA Apr 12, 2024
1295b9e
FIX create issue with confidence set
ElodieENSTA Apr 11, 2024
f149a9b
fix import
ElodieENSTA Apr 11, 2024
b90601f
fix css
ElodieENSTA Apr 11, 2024
da876b0
Remove useless TODO
ElodieENSTA Apr 11, 2024
ab5c6e6
Clean after review
ElodieENSTA Apr 15, 2024
40605f5
Fix import issues
ElodieENSTA Apr 16, 2024
eac483c
[ADEV-95] Handle task without annotations to check
ElodieENSTA Apr 17, 2024
3d90e4a
[ADEV-96] Replace "annotations" by "detections" in annotator for chec…
ElodieENSTA Apr 19, 2024
e6d0e2e
[ADEV-103] Show CSV import errors in view
ElodieENSTA Apr 22, 2024
659f9d6
[ADEV-93] Improve Detector form on CSV import
ElodieENSTA Apr 24, 2024
9c4dcd0
[ADEV-111] Import double-check annotations based on the timestamp rat…
ElodieENSTA Apr 30, 2024
4ce8a61
Fix test after review
ElodieENSTA Apr 30, 2024
0613447
Removed "campaign_user_list" tests after review
ElodieENSTA Apr 30, 2024
7227442
Update User interface to class after review
ElodieENSTA Apr 30, 2024
0c409a8
Update package.json
ElodieENSTA May 2, 2024
4f8b85b
[ADEV-111] Add error for results where back cannot associate files ; …
ElodieENSTA May 7, 2024
7bb4ff6
[ADEV-117] Add results counts on task list
ElodieENSTA May 7, 2024
3f19ee9
Add loading behavior at campaign creation submit
ElodieENSTA May 13, 2024
01eee4f
[ADEV-117] Fix: tasks request must filter annotator
ElodieENSTA May 13, 2024
9500ef9
Merge remote-tracking branch 'origin/master' into feature/double_check
ElodieENSTA Jun 11, 2024
6f935f5
Merge remote-tracking branch 'origin/master' into feature/double_check
ElodieENSTA Jun 17, 2024
e854379
Fix issue with required input next to select
ElodieENSTA Jun 18, 2024
97bd475
Small fixes: nav, style, and show full boxes as tags
ElodieENSTA Jun 18, 2024
411d9f5
FIX: annotation import and small other issues
ElodieENSTA Jun 24, 2024
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
1 change: 1 addition & 0 deletions .github/workflows/cypress.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ jobs:
env:
CYPRESS_CI_ENV: true
with:
component: true
working-directory: frontend
start: |
poetry run python ../manage.py runserver
Expand Down
95 changes: 15 additions & 80 deletions backend/api/admin.py → backend/api/admin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from django.db import IntegrityError, transaction
from django.utils.html import format_html


from backend.api.models import (
Dataset,
DatasetFile,
Expand All @@ -16,7 +15,6 @@
AnnotationCampaign,
AnnotationTask,
AnnotationComment,
AnnotationResult,
AnnotationSession,
SpectroConfig,
DatasetType,
Expand All @@ -26,6 +24,12 @@
ConfidenceIndicator,
ConfidenceIndicatorSet,
)
from backend.api.admin.annotation import (
DetectorAdmin,
DetectorConfigurationAdmin,
AnnotationResultAdmin,
AnnotationResultValidationAdmin,
)


def get_many_to_many(obj, field_name, related_field_name="name"):
Expand Down Expand Up @@ -55,7 +59,7 @@ class NewItemsForm(forms.ModelForm):


class ConfidenceIndicatorAdmin(admin.ModelAdmin):
"""Collection presentation in DjangoAdmin"""
"""ConfidenceIndicatorAdmin presentation in DjangoAdmin"""

list_display = (
"id",
Expand All @@ -75,7 +79,7 @@ def save_model(self, request, obj, form, change):


class ConfidenceIndicatorSetAdmin(admin.ModelAdmin):
"""Collection presentation in DjangoAdmin"""
"""ConfidenceIndicatorSet presentation in DjangoAdmin"""

list_display = (
"id",
Expand All @@ -84,12 +88,6 @@ class ConfidenceIndicatorSetAdmin(admin.ModelAdmin):
)


class CollectionAdmin(admin.ModelAdmin):
"""Collection presentation in DjangoAdmin"""

list_display = ("name", "desc", "owner")


class DatasetTypeAdmin(admin.ModelAdmin):
"""DatasetType presentation in DjangoAdmin"""

Expand All @@ -113,9 +111,7 @@ class DatasetAdmin(admin.ModelAdmin):
"dataset_type",
"geo_metadatum",
"owner",
"tabular_metadatum",
"show_spectro_configs",
"show_collections",
)
fields = (
"name",
Expand All @@ -129,18 +125,12 @@ class DatasetAdmin(admin.ModelAdmin):
"dataset_type",
"geo_metadatum",
"owner",
"tabular_metadatum",
"collections",
)

def show_spectro_configs(self, obj):
"""show_spectro_configs"""
return get_many_to_many(obj, "spectro_configs")

def show_collections(self, obj):
"""show_collections"""
return get_many_to_many(obj, "collections")

def show_audio_metadatum_url(self, obj):
"""show_audio_metadatum_url"""
return format_html(
Expand All @@ -159,7 +149,6 @@ class DatasetFileAdmin(admin.ModelAdmin):
"size",
"dataset",
"audio_metadatum",
"tabular_metadatum",
)


Expand All @@ -175,7 +164,6 @@ class AnnotationSetAdmin(admin.ModelAdmin):
list_display = (
"name",
"desc",
"owner",
"show_tags",
)

Expand All @@ -190,8 +178,6 @@ class AnnotationCommentAdmin(admin.ModelAdmin):
list_display = (
"id",
"comment",
"annotation_task",
"annotation_result",
)


Expand All @@ -212,7 +198,11 @@ class AnnotationCampaignAdmin(admin.ModelAdmin):
"show_datasets",
"show_annotators",
"confidence_indicator_set",
"usage",
)
search_fields = ("name", "desc")

list_filter = ("datasets", "usage")

def show_spectro_configs(self, obj):
"""show_spectro_configs"""
Expand All @@ -234,24 +224,10 @@ class AnnotationTaskAdmin(admin.ModelAdmin):
"status",
"annotation_campaign",
"dataset_file",
"annotator_id",
)
list_filter = ("status", "annotation_campaign", "annotator_id")


class AnnotationResultAdmin(admin.ModelAdmin):
"""AnnotationResult presentation in DjangoAdmin"""

list_display = (
"id",
"start_time",
"end_time",
"start_frequency",
"end_frequency",
"annotation_tag",
"annotation_task",
"confidence_indicator",
"annotator",
)
search_fields = ("dataset_file__filename",)
list_filter = ("status", "annotation_campaign", "annotator")


class AnnotationSessionAdmin(admin.ModelAdmin):
Expand Down Expand Up @@ -332,40 +308,6 @@ class SpectroConfigAdmin(admin.ModelAdmin):
)


class TabularMetadatumAdmin(admin.ModelAdmin):
"""TabularMetadatum presentation in DjangoAdmin"""

list_display = (
"name",
"desc",
"dimension_count",
"variable_count",
)


class TabularMetadataVariableAdmin(admin.ModelAdmin):
"""TabularMetadataVariable presentation in DjangoAdmin"""

list_display = (
"name",
"desc",
"data_type",
"dimension_size",
"variable_position",
"tabular_metadata",
)


class TabularMetadataShapeAdmin(admin.ModelAdmin):
"""TabularMetadataShape presentation in DjangoAdmin"""

list_display = (
"dimension_position",
"tabular_metadata_dimension",
"tabular_metadata_variable",
)


admin.site.register(ConfidenceIndicator, ConfidenceIndicatorAdmin)
admin.site.register(ConfidenceIndicatorSet, ConfidenceIndicatorSetAdmin)
admin.site.register(DatasetType, DatasetTypeAdmin)
Expand All @@ -376,15 +318,8 @@ class TabularMetadataShapeAdmin(admin.ModelAdmin):
admin.site.register(AnnotationCampaign, AnnotationCampaignAdmin)
admin.site.register(AnnotationComment, AnnotationCommentAdmin)
admin.site.register(AnnotationTask, AnnotationTaskAdmin)
admin.site.register(AnnotationResult, AnnotationResultAdmin)
admin.site.register(AnnotationSession, AnnotationSessionAdmin)
admin.site.register(AudioMetadatum, AudioMetadatumAdmin)
admin.site.register(GeoMetadatum, GeoMetadatumAdmin)
admin.site.register(SpectroConfig, SpectroConfigAdmin)
admin.site.register(WindowType, WindowTypeAdmin)


# admin.site.register(Collection, CollectionAdmin)
# admin.site.register(TabularMetadatum, TabularMetadatumAdmin)
# admin.site.register(TabularMetadataVariable, TabularMetadataVariableAdmin)
# admin.site.register(TabularMetadataShape, TabularMetadataShapeAdmin)
23 changes: 23 additions & 0 deletions backend/api/admin/annotation/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
""" Annotation admin management """
from django.contrib import admin

from backend.api.admin.annotation.detector import (
DetectorAdmin,
DetectorConfigurationAdmin,
)
from backend.api.admin.annotation.result import (
AnnotationResultAdmin,
AnnotationResultValidationAdmin,
)
from backend.api.models.annotation import (
Detector,
DetectorConfiguration,
AnnotationResult,
AnnotationResultValidation,
)

admin.site.register(Detector, DetectorAdmin)
admin.site.register(DetectorConfiguration, DetectorConfigurationAdmin)

admin.site.register(AnnotationResult, AnnotationResultAdmin)
admin.site.register(AnnotationResultValidation, AnnotationResultValidationAdmin)
16 changes: 16 additions & 0 deletions backend/api/admin/annotation/detector.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""Detector model"""
from django.contrib import admin


class DetectorAdmin(admin.ModelAdmin):
"""Detector in DjangoAdmin"""

search_fields = ["name", "configurations__configuration"]
list_display = ["name"]


class DetectorConfigurationAdmin(admin.ModelAdmin):
"""Detector in DjangoAdmin"""

search_fields = ["configuration", "detector"]
list_display = ["configuration", "detector"]
66 changes: 66 additions & 0 deletions backend/api/admin/annotation/result.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
"""Detector model"""
from django.contrib import admin


class AnnotationResultAdmin(admin.ModelAdmin):
"""AnnotationResult presentation in DjangoAdmin"""

list_display = (
"id",
"start_time",
"end_time",
"start_frequency",
"end_frequency",
"annotation_tag",
"confidence_indicator",
"annotation_campaign",
"dataset_file",
"annotator",
"detector_configuration",
)
search_fields = (
"annotation_tag__name",
"confidence_indicator__label",
"annotator__username",
"annotator__first_name",
"annotator__last_name",
"detector_configuration__detector__name",
)
list_filter = (
"annotation_campaign",
"annotator",
)


class AnnotationResultValidationAdmin(admin.ModelAdmin):
"""AnnotationResultValidation presentation in DjangoAdmin"""

list_display = (
"id",
"is_valid",
"annotator",
"result",
"get_campaign",
"get_detector",
)
search_fields = (
"annotator__username",
"annotator__first_name",
"annotator__last_name",
"result__annotation_campaign__name",
"result__detector_configuration__detector__name",
)
list_filter = ("is_valid",)

@admin.display(description="Campaign")
def get_campaign(self, result_validation):
"""Get campaign for given result validation"""
return result_validation.result.annotation_campaign

@admin.display(description="Detector")
def get_detector(self, result_validation):
"""Get detector for given result validation"""
conf = result_validation.result.detector_configuration
if conf is None:
return None
return conf.detector
Loading
Loading