Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
a54aef9
initial nabat models/api script
BryonLewis Feb 4, 2025
d8440c2
model updates and reset endpoints
BryonLewis Feb 6, 2025
760acc9
outlining tasks
BryonLewis Feb 7, 2025
da7d35c
nabat retrieval logic
BryonLewis Feb 11, 2025
0574aa4
NABat ingestion working
BryonLewis Feb 11, 2025
e83ef4c
rename acoustic_batch_initialize
BryonLewis Feb 11, 2025
91be416
remove flower, add spectrogram viewer script, move spectrogram creati…
BryonLewis Feb 18, 2025
ab9977d
nabat integration
BryonLewis Feb 19, 2025
45bb4b3
deduplicating functions
BryonLewis Feb 19, 2025
e495458
Merge branch 'main' into nabat-integration
BryonLewis Feb 21, 2025
8849abb
add species manual and auto ids to nabat retrieval
BryonLewis Feb 28, 2025
456cad6
non-compressed X-axis highlight, zooming legend fix, 2.5x default com…
BryonLewis Mar 20, 2025
9d05588
cursor time compressed fix, axis length fix, edit column reorder in R…
BryonLewis Mar 21, 2025
c31154b
recording annotation details
BryonLewis Mar 21, 2025
5491064
removing some commented out emits
BryonLewis Mar 24, 2025
f42c986
remove footer from details for inference annotations
BryonLewis Mar 27, 2025
230e8e3
Ignore egg-info directories
naglepuff Mar 26, 2025
024147d
Add additional configuration settings
naglepuff Mar 26, 2025
488a78c
Add new settings to admin page
naglepuff Mar 26, 2025
96caa74
Use configuration to set `compressed` ref
naglepuff Mar 27, 2025
370ac19
Move save button closer to settings
naglepuff Mar 27, 2025
31c089c
Check config setting before running inference
naglepuff Mar 28, 2025
2329da7
Use config setting for initial compressed scale
naglepuff Mar 28, 2025
b3ca903
reference the outputs.tags instead of outputs.results
BryonLewis Mar 31, 2025
e139f7a
renames acoustic batch to recording (#128)
BryonLewis Apr 2, 2025
f49e501
Merge branch 'main' into nabat-integration
BryonLewis Apr 2, 2025
d0bc693
Use slider for stretch setting
naglepuff Apr 2, 2025
5d3f361
Merge pull request #138 from Kitware/issue-134-configuration-settings
naglepuff Apr 3, 2025
e18b046
recording based nabat spectrograms
BryonLewis Apr 7, 2025
ced6425
Merge branch 'main' into ui-improvements
BryonLewis Apr 7, 2025
aa07187
Merge branch 'ui-improvements' into nabat-integration
BryonLewis Apr 7, 2025
de0adb1
migrations modifications
BryonLewis Apr 7, 2025
d2b0b10
public apis, adding apiToken access control
BryonLewis Apr 7, 2025
b0a28db
recording annotation endpoints
BryonLewis Apr 8, 2025
1a2ee94
nabat local annotaitons
BryonLewis Apr 8, 2025
9e78dcf
precition config, requesting annotations, updating species
BryonLewis Apr 8, 2025
d8be1bb
swapping to user_email from user_id
BryonLewis Apr 9, 2025
df75702
pushing annotations back
BryonLewis Apr 11, 2025
d801530
auth cleanup
BryonLewis Apr 11, 2025
71190d8
Merge branch 'main' into nabat-integration
BryonLewis Apr 11, 2025
6ee235d
Merge branch 'main' into nabat-integration
BryonLewis Apr 17, 2025
c0c0aca
convert to mutation
BryonLewis Apr 17, 2025
4d00bdc
Update scripts/USGS/naBatSpecies.py
BryonLewis Apr 24, 2025
a7d5e1b
addressing some of the comments
BryonLewis Apr 24, 2025
798fd4d
enum for processing task types, processing task get_or_create
BryonLewis Apr 24, 2025
454725a
client_id option, base environment file, updating instructions, NABAT…
BryonLewis Apr 25, 2025
332f59d
SSL verification hack
BryonLewis May 2, 2025
9c658cf
fixing get_or_create for processing tasks in celery tasks
BryonLewis May 2, 2025
fe32197
resolve lint warnings
BryonLewis May 2, 2025
723cd47
swap to logger.error in nabat recording creation
BryonLewis May 2, 2025
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
6 changes: 4 additions & 2 deletions DEPLOYMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,11 @@ to `.env` and change the default passwords for fields
to collect the static files
6. Run `docker compose -f docker-compose.prod.yml up` to start the server
add `-d` for a silent version to run in the background
7. Change the ID in the `./client/env.production` to a custom ID - this will
7. **OPTIONAL** Change the ID in the `./client/env.production` to a custom ID - this will
probably require a `docker compose -f docker-compose.prod.yml build` \
to build the app afterwards
to build the app afterwards. This Id is used to indetify the application and
isn't required to be changed especially if the building of the client is done
outside of deployment.
8. After creating the basic application log into the django admin `batdetectai.kitware.com/admin`
and change the ApplicationId to the ID in the `./client.env.production`
9. Test logging in/out and uploading data to the server.
Expand Down
5 changes: 5 additions & 0 deletions bats_ai/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@
ConfigurationRouter,
GRTSCellsRouter,
GuanoMetadataRouter,
ProcessingTaskRouter,
RecordingAnnotationRouter,
RecordingRouter,
SpeciesRouter,
)
from bats_ai.core.views.nabat import NABatConfigurationRouter, NABatRecordingRouter

logger = logging.getLogger(__name__)

Expand All @@ -37,3 +39,6 @@ def global_auth(request):
api.add_router('/guano/', GuanoMetadataRouter)
api.add_router('/recording-annotation/', RecordingAnnotationRouter)
api.add_router('/configuration/', ConfigurationRouter)
api.add_router('/processing-task/', ProcessingTaskRouter)
api.add_router('/nabat/recording/', NABatRecordingRouter)
api.add_router('/nabat/configuration/', NABatConfigurationRouter)
15 changes: 15 additions & 0 deletions bats_ai/core/admin/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
from .annotations import AnnotationsAdmin
from .compressed_spectrogram import CompressedSpectrogramAdmin
from .configuration import ConfigurationAdmin
from .grts_cells import GRTSCellsAdmin
from .image import ImageAdmin
from .nabat.admin import (
NABatCompressedSpectrogramAdmin,
NABatRecordingAdmin,
NABatRecordingAnnotationAdmin,
NABatSpectrogramAdmin,
)
from .processing_task import ProcessingTaskAdmin
from .recording import RecordingAdmin
from .recording_annotations import RecordingAnnotationAdmin
from .species import SpeciesAdmin
Expand All @@ -18,4 +26,11 @@
'GRTSCellsAdmin',
'CompressedSpectrogramAdmin',
'RecordingAnnotationAdmin',
'ProcessingTaskAdmin',
'ConfigurationAdmin',
# NABat Models
'NABatRecordingAnnotationAdmin',
'NABatCompressedSpectrogramAdmin',
'NABatSpectrogramAdmin',
'NABatRecordingAdmin',
]
24 changes: 24 additions & 0 deletions bats_ai/core/admin/configuration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from django.contrib import admin

from bats_ai.core.models.configuration import Configuration


@admin.register(Configuration)
class ConfigurationAdmin(admin.ModelAdmin):
list_display = (
'display_pulse_annotations',
'display_sequence_annotations',
'run_inference_on_upload',
'spectrogram_x_stretch',
'spectrogram_view',
)

def has_add_permission(self, request):
# Allow add only if there is no Configuration instance
if Configuration.objects.exists():
return False
return super().has_add_permission(request)

def has_delete_permission(self, request, obj=None):
# Prevent deleting the Configuration through the admin
return False
2 changes: 1 addition & 1 deletion bats_ai/core/admin/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from django.http import HttpRequest

from bats_ai.core.models import Image
from bats_ai.core.tasks import image_compute_checksum
from bats_ai.tasks.tasks import image_compute_checksum


@admin.register(Image)
Expand Down
66 changes: 66 additions & 0 deletions bats_ai/core/admin/nabat/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
from django.contrib import admin

from bats_ai.core.models.nabat import (
NABatCompressedSpectrogram,
NABatRecording,
NABatRecordingAnnotation,
NABatSpectrogram,
)


# Register models for the NaBat category
@admin.register(NABatRecordingAnnotation)
class NABatRecordingAnnotationAdmin(admin.ModelAdmin):
list_display = (
'nabat_recording',
'comments',
'model',
'confidence',
'additional_data',
'species_codes',
)
search_fields = ('nabat_recording_name', 'comments', 'model')
list_filter = ('nabat_recording',)

@admin.display(description='Species Codes')
def species_codes(self, obj):
# Assuming species have a `species_code` field
return ', '.join([species.species_code for species in obj.species.all()])


@admin.register(NABatSpectrogram)
class NABatSpectrogramAdmin(admin.ModelAdmin):
list_display = (
'nabat_recording',
'image_file',
'width',
'height',
'duration',
'frequency_min',
'frequency_max',
'colormap',
)
search_fields = ('nabat_recording__name', 'colormap')
list_filter = ('nabat_recording', 'colormap')


@admin.register(NABatCompressedSpectrogram)
class NABatCompressedSpectrogramAdmin(admin.ModelAdmin):
list_display = ('nabat_recording', 'spectrogram', 'length', 'cache_invalidated')
search_fields = ('nabat_recording__name', 'spectrogram__id')
list_filter = ('nabat_recording', 'cache_invalidated')


@admin.register(NABatRecording)
class NABatRecordingAdmin(admin.ModelAdmin):
list_display = (
'name',
'recording_id',
'equipment',
'comments',
'recording_location',
'grts_cell_id',
'grts_cell',
)
search_fields = ('name', 'recording_id', 'recording_location')
list_filter = ('name', 'recording_id', 'recording_location')
28 changes: 28 additions & 0 deletions bats_ai/core/admin/processing_task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from django.contrib import admin

from bats_ai.core.models import ProcessingTask


@admin.register(ProcessingTask)
class ProcessingTaskAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'status', 'created', 'modified', 'celery_id', 'metadata', 'error')
list_filter = ('status', 'created', 'modified')
search_fields = ('name', 'celery_id', 'metadata', 'error')
ordering = ('-created',)
readonly_fields = ('created', 'modified')
fieldsets = (
(None, {'fields': ('name', 'status', 'celery_id', 'error')}),
(
'Metadata',
{
'classes': ('collapse',),
'fields': ('metadata',),
},
),
(
'Timestamps',
{
'fields': ('created', 'modified'),
},
),
)
2 changes: 1 addition & 1 deletion bats_ai/core/admin/recording.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from django.utils.safestring import mark_safe

from bats_ai.core.models import Recording
from bats_ai.core.tasks import recording_compute_spectrogram
from bats_ai.tasks.tasks import recording_compute_spectrogram


@admin.register(Recording)
Expand Down
25 changes: 20 additions & 5 deletions bats_ai/core/management/commands/makeclient.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import os

from django.contrib.auth.models import User
import djclick as click
from oauth2_provider.models import Application

CLIENT_ID = 'HSJWFZ2cIpWQOvNyCXyStV9hiOd7DfWeBOCzo4pP'
CLIENT_ID = os.environ.get('APPLICATION_CLIENT_ID', 'HSJWFZ2cIpWQOvNyCXyStV9hiOd7DfWeBOCzo4pP')


# create django oauth toolkit appliction (client)
Expand All @@ -12,10 +14,23 @@
required=True,
help='superuser username for application creator',
)
@click.option('--uri', type=click.STRING, required=True, help='redirect uri for application')
@click.option(
'--uri',
type=click.STRING,
default='http://localhost:3000/',
required=False,
help='redirect uri for application',
)
@click.option(
'--clientid',
type=click.STRING,
default=CLIENT_ID,
required=False,
help='clientID used in the application',
)
@click.command()
def command(username, uri):
if Application.objects.filter(client_id=CLIENT_ID).exists():
def command(username, uri, clientid):
if Application.objects.filter(client_id=clientid).exists():
click.echo('The client already exists. You can administer it from the admin console.')
return

Expand All @@ -29,7 +44,7 @@ def command(username, uri):
if user:
application = Application(
name='batsai-client',
client_id=CLIENT_ID,
client_id=clientid,
client_secret='',
client_type='public',
redirect_uris=uri,
Expand Down
Loading