Skip to content

Commit 3866aff

Browse files
authored
Taxon cover images and external references (#940)
* Import cover images & external references (#838) * feat: management command for updating fields on existing Taxa from CSV * feat: try another title for example occurrence image * feat: allow manual filter for showing taxa without occurrences * feat: allow sorting by reference image for better demos * Fields for Taxon reference images (#822) * feat: add fields for Taxon cover images and Fieldguide ID * feat: add cover image fields to Taxon model for the UI * fix: look up existing taxa by name only * fix: update existing genus parents if their rank is wrong, don't crash * fix: don't allow empty CSV columns to clear existing data * fix: ensure all taxa in import list are added to taxa list in DB
1 parent 2d238b8 commit 3866aff

File tree

5 files changed

+52
-4
lines changed

5 files changed

+52
-4
lines changed

ami/main/api/serializers.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,9 @@ class Meta:
263263
"rank",
264264
"details",
265265
"gbif_taxon_key",
266+
"fieldguide_id",
267+
"cover_image_url",
268+
"cover_image_credit",
266269
]
267270

268271

@@ -582,6 +585,7 @@ class Meta:
582585
"tags",
583586
"last_detected",
584587
"best_determination_score",
588+
"cover_image_url",
585589
"created_at",
586590
"updated_at",
587591
]
@@ -808,6 +812,9 @@ class Meta:
808812
"tags",
809813
"last_detected",
810814
"best_determination_score",
815+
"fieldguide_id",
816+
"cover_image_url",
817+
"cover_image_credit",
811818
]
812819

813820

ami/main/api/views.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,6 +1240,7 @@ class TaxonViewSet(DefaultViewSet, ProjectMixin):
12401240
"last_detected",
12411241
"best_determination_score",
12421242
"name",
1243+
"cover_image_url",
12431244
]
12441245
search_fields = ["name", "parent__name"]
12451246

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Generated by Django 4.2.10 on 2025-09-17 00:57
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("main", "0073_alter_project_feature_flags"),
9+
]
10+
11+
operations = [
12+
migrations.AddField(
13+
model_name="taxon",
14+
name="cover_image_credit",
15+
field=models.CharField(blank=True, max_length=255, null=True),
16+
),
17+
migrations.AddField(
18+
model_name="taxon",
19+
name="cover_image_url",
20+
field=models.URLField(blank=True, max_length=255, null=True),
21+
),
22+
migrations.AddField(
23+
model_name="taxon",
24+
name="fieldguide_id",
25+
field=models.CharField(blank=True, max_length=255, null=True),
26+
),
27+
]

ami/main/models.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2968,8 +2968,12 @@ class Taxon(BaseModel):
29682968
gbif_taxon_key = models.BigIntegerField("GBIF taxon key", blank=True, null=True)
29692969
bold_taxon_bin = models.CharField("BOLD taxon BIN", max_length=255, blank=True, null=True)
29702970
inat_taxon_id = models.BigIntegerField("iNaturalist taxon ID", blank=True, null=True)
2971+
fieldguide_id = models.CharField(max_length=255, blank=True, null=True)
29712972
# lepsai_id = models.BigIntegerField("LepsAI / Fieldguide ID", blank=True, null=True)
29722973

2974+
cover_image_url = models.URLField(max_length=255, blank=True, null=True)
2975+
cover_image_credit = models.CharField(max_length=255, blank=True, null=True)
2976+
29732977
notes = models.TextField(blank=True)
29742978

29752979
projects = models.ManyToManyField("Project", related_name="taxa")

ui/src/data-services/models/species.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,21 @@ export class Species extends Taxon {
5353
return `https://www.gbif.org/occurrence/gallery?advanced=1&verbatim_scientific_name=${this.name}`
5454
}
5555

56+
get fieldguideId(): string | null {
57+
return this._species.fieldguide_id || null
58+
}
59+
5660
get fieldguideUrl(): string | undefined {
57-
if (!this._species.fieldguide_id) {
58-
return undefined
59-
}
61+
if (!this.fieldguideId) return undefined
62+
return `https://leps.fieldguide.ai/categories?category=${this.fieldguideId}`
63+
}
64+
65+
get coverImageUrl(): string | null {
66+
return this._species.cover_image_url || null
67+
}
6068

61-
return `https://leps.fieldguide.ai/categories?category=${this._species.fieldguide_id}`
69+
get coverImageCredit(): string | null {
70+
return this._species.cover_image_credit || null
6271
}
6372

6473
get score(): number | undefined {

0 commit comments

Comments
 (0)