Skip to content

Commit c0a0626

Browse files
committed
add priority update option, Cruise Tracking API
1 parent 263d4cf commit c0a0626

16 files changed

Lines changed: 136 additions & 18 deletions

File tree

habhub-dataserver/config/settings/base.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,11 @@
335335
"task": "habhub.ifcb_datasets.tasks.get_ifcb_dashboard_data",
336336
"schedule": crontab(minute=0, hour=2),
337337
},
338+
"get_ifcb_dashboard_data_high_priority_task": {
339+
"task": "habhub.ifcb_datasets.tasks.get_ifcb_dashboard_data_high_priority",
340+
# Executes every 5 minutes
341+
'schedule': crontab(minute='*/10'),
342+
},
338343
# "prewarm_api_cache_task": {
339344
# "task": "habhub.core.tasks.prewarm_api_cache",
340345
# "schedule": crontab(minute="*/5"),

habhub-dataserver/config/settings/production.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class MediaRootS3Boto3Storage(S3Boto3Storage):
131131
# ------------------------------------------------------------------------------
132132
# https://docs.djangoproject.com/en/dev/ref/settings/#default-from-email
133133
DEFAULT_FROM_EMAIL = env(
134-
"DJANGO_DEFAULT_FROM_EMAIL", default="Starterkit <noreply@example.com>"
134+
"DJANGO_DEFAULT_FROM_EMAIL", default="HABhub <noreply@example.com>"
135135
)
136136
# https://docs.djangoproject.com/en/dev/ref/settings/#server-email
137137
SERVER_EMAIL = env("DJANGO_SERVER_EMAIL", default=DEFAULT_FROM_EMAIL)

habhub-dataserver/habhub/core/api/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
AutoclassScoreViewSet,
1515
BinMetadataViewSet,
1616
DatasetBasicViewSet,
17+
CruiseTrackViewSet
1718
)
1819
from habhub.closures.api.views import (
1920
ShellfishAreaViewSet,
@@ -40,6 +41,7 @@
4041
router.register(r"scores", AutoclassScoreViewSet, "scores")
4142
router.register(r"bins", BinMetadataViewSet, "bins")
4243
router.register(r"datasets", DatasetBasicViewSet, "datasets")
44+
router.register(r"cruise-tracks", CruiseTrackViewSet, "cruise-tracks")
4345
router.register(r"monitoring-systems", MonitoringSystemViewSet, "monitoring-systems")
4446
router.register(r"forecasting-systems", ForecastingSystemViewSet, "forecasting-systems")
4547

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 4.2.14 on 2026-08-09 18:28
2+
3+
import colorfield.fields
4+
from django.db import migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('core', '0020_auto_20231128_1935'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='targetspecies',
16+
name='primary_color',
17+
field=colorfield.fields.ColorField(default='#FF0000', image_field=None, max_length=25, samples=None),
18+
),
19+
]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 4.2.14 on 2026-08-09 18:28
2+
3+
import django.core.validators
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('esp_instrument', '0009_auto_20231128_1935'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='deployment',
16+
name='year',
17+
field=models.IntegerField(validators=[django.core.validators.MinValueValidator(1984), django.core.validators.MaxValueValidator(2026)]),
18+
),
19+
]

habhub-dataserver/habhub/ifcb_datasets/admin.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ class DatasetAdmin(LeafletGeoAdmin):
1313
"dashboard_base_url",
1414
"dashboard_id_name",
1515
"fixed_location",
16-
"geom",
16+
"high_priority_updates",
17+
"geom",
1718
)
1819
list_editable = ("geom",)
1920

habhub-dataserver/habhub/ifcb_datasets/api/mixins.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def handle_query_param_filters(self, queryset):
2929
if start_date:
3030
start_date_obj = datetime.datetime.strptime(start_date, "%Y-%m-%d").date()
3131
else:
32-
start_date_obj = timezone.now() - relativedelta(years=1)
32+
start_date_obj = (timezone.now() - relativedelta(years=1)).date()
3333

3434
print("LIMIT", limit_start_date)
3535
if limit_start_date:
@@ -46,7 +46,7 @@ def handle_query_param_filters(self, queryset):
4646
if end_date:
4747
end_date_obj = datetime.datetime.strptime(end_date, "%Y-%m-%d").date()
4848
else:
49-
end_date_obj = timezone.now()
49+
end_date_obj = timezone.now().date()
5050

5151
if end_date_obj < start_date_obj:
5252
# check if end_date is BEFORE start_date. Invalid option, so reset to no results
@@ -95,10 +95,10 @@ def handle_query_param_filters(self, queryset):
9595
print("RANGES", date_ranges)
9696
for dr in date_ranges:
9797
date_q_filters |= Q(
98-
sample_time__range=(dr["start_date"], dr["end_date"])
98+
sample_time__date__range=(dr["start_date"], dr["end_date"])
9999
) # 'or' the Q objects together
100100
else:
101-
date_q_filters |= Q(sample_time__range=([start_date_obj, end_date_obj]))
101+
date_q_filters |= Q(sample_time__date__range=([start_date_obj, end_date_obj]))
102102

103103
queryset = (
104104
queryset.filter(date_q_filters)
@@ -145,7 +145,7 @@ def handle_query_param_filters(self, queryset):
145145
if start_date:
146146
start_date_obj = datetime.datetime.strptime(start_date, "%Y-%m-%d").date()
147147
else:
148-
start_date_obj = timezone.now() - relativedelta(years=1)
148+
start_date_obj = (timezone.now() - relativedelta(years=1)).date()
149149

150150
if limit_start_date:
151151
# if limit_start_date param exists, limit results to specified range
@@ -160,7 +160,7 @@ def handle_query_param_filters(self, queryset):
160160
if end_date:
161161
end_date_obj = datetime.datetime.strptime(end_date, "%Y-%m-%d").date()
162162
else:
163-
end_date_obj = timezone.now()
163+
end_date_obj = timezone.now().date()
164164

165165
if end_date_obj < start_date_obj:
166166
# check if end_date is BEFORE start_date. Invalid option, so reset to no results
@@ -210,10 +210,10 @@ def handle_query_param_filters(self, queryset):
210210

211211
for dr in date_ranges:
212212
date_q_filters |= Q(
213-
sample_time__range=(dr["start_date"], dr["end_date"])
213+
sample_time__date__range=(dr["start_date"], dr["end_date"])
214214
) # 'or' the Q objects together
215215
else:
216-
date_q_filters |= Q(sample_time__range=([start_date_obj, end_date_obj]))
216+
date_q_filters |= Q(sample_time__date__range=([start_date_obj, end_date_obj]))
217217

218218
queryset = queryset.prefetch_related(
219219
Prefetch(

habhub-dataserver/habhub/ifcb_datasets/api/serializers.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,17 @@ class Meta:
4040
"cell_concentration_data",
4141
]
4242

43-
43+
class CruiseTrackViewSetSerializer(serializers.ModelSerializer):
44+
bins = BinSerializer(many=True, read_only=True)
45+
class Meta:
46+
model = Dataset
47+
fields = [
48+
"id",
49+
"name",
50+
"location",
51+
"dashboard_id_name",
52+
"bins"
53+
]
4454
class AutoclassScoreSerializer(serializers.ModelSerializer):
4555
os_id = serializers.SerializerMethodField()
4656
image_pid = serializers.CharField(source="pid")

habhub-dataserver/habhub/ifcb_datasets/api/views.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
BinSpatialGridDetailSerializer,
2323
AutoclassScoreSerializer,
2424
DatasetBasicSerializer,
25+
CruiseTrackViewSetSerializer
2526
)
2627
from .mixins import DatasetFiltersMixin, BinFiltersMixin
2728

@@ -180,3 +181,13 @@ def retrieve(self, request, pk=None):
180181
# set cache
181182
cache.set(cache_key, serializer.data)
182183
return Response(serializer.data)
184+
185+
# Viewset to show full cruise track of vessel-based Datasets
186+
class CruiseTrackViewSet(DatasetFiltersMixin, viewsets.ReadOnlyModelViewSet):
187+
serializer_class = CruiseTrackViewSetSerializer
188+
189+
def get_queryset(self):
190+
queryset = Dataset.objects.filter(fixed_location=False).defer('bins')
191+
# call custom filter method from mixin
192+
queryset = self.handle_query_param_filters(queryset)
193+
return queryset

habhub-dataserver/habhub/ifcb_datasets/api_requests.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
env = environ.Env()
1717

1818
# IFCB_DASHBOARD_URL = env("IFCB_DASHBOARD_URL", default="https://habon-ifcb.whoi.edu")
19-
IFCB_DASHBOARD_THROTTLE_RATE = env("IFCB_DASHBOARD_THROTTLE_RATE", default=50)
19+
IFCB_DASHBOARD_THROTTLE_RATE = env("IFCB_DASHBOARD_THROTTLE_RATE", default=500)
2020
MVCO_GEOM_POINT = Point(41.325, -70.5667)
2121

2222

@@ -71,17 +71,20 @@ def run_species_classifed_import(dataset_obj):
7171
"""
7272

7373

74-
def run_species_classifed_import(dataset_obj):
74+
def run_species_classifed_import(dataset_obj, throttle_rate=100):
7575
"""
7676
Function to run import of Bins/Autoclass/Image data from IFCB dashboard
7777
Args: 'dataset_obj' - Dataset object
7878
"""
7979
# Get all new bins
8080
_get_ifcb_bins_dataset(dataset_obj)
81+
print("Throttle Rate", throttle_rate)
8182
print("Complete Bin import.")
82-
bins = dataset_obj.bins.filter(cell_concentration_data__isnull=True)[
83-
:IFCB_DASHBOARD_THROTTLE_RATE
84-
]
83+
if throttle_rate:
84+
bins = dataset_obj.bins.filter(cell_concentration_data__isnull=True)[throttle_rate]
85+
else:
86+
bins = dataset_obj.bins.filter(cell_concentration_data__isnull=True)
87+
8588
for bin in bins:
8689
print("Start autoclass processing...")
8790
_get_ifcb_autoclass_file(bin)

0 commit comments

Comments
 (0)