diff --git a/ami/main/api/serializers.py b/ami/main/api/serializers.py index 3c8f60898..e5b268408 100644 --- a/ami/main/api/serializers.py +++ b/ami/main/api/serializers.py @@ -263,6 +263,9 @@ class Meta: "rank", "details", "gbif_taxon_key", + "fieldguide_id", + "cover_image_url", + "cover_image_credit", ] @@ -582,6 +585,7 @@ class Meta: "tags", "last_detected", "best_determination_score", + "cover_image_url", "created_at", "updated_at", ] @@ -808,6 +812,9 @@ class Meta: "tags", "last_detected", "best_determination_score", + "fieldguide_id", + "cover_image_url", + "cover_image_credit", ] diff --git a/ami/main/api/views.py b/ami/main/api/views.py index 7d7ee0705..c5306c892 100644 --- a/ami/main/api/views.py +++ b/ami/main/api/views.py @@ -1240,6 +1240,7 @@ class TaxonViewSet(DefaultViewSet, ProjectMixin): "last_detected", "best_determination_score", "name", + "cover_image_url", ] search_fields = ["name", "parent__name"] diff --git a/ami/main/migrations/0074_taxon_cover_image_credit_taxon_cover_image_url_and_more.py b/ami/main/migrations/0074_taxon_cover_image_credit_taxon_cover_image_url_and_more.py new file mode 100644 index 000000000..b4e48b1de --- /dev/null +++ b/ami/main/migrations/0074_taxon_cover_image_credit_taxon_cover_image_url_and_more.py @@ -0,0 +1,27 @@ +# Generated by Django 4.2.10 on 2025-09-17 00:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("main", "0073_alter_project_feature_flags"), + ] + + operations = [ + migrations.AddField( + model_name="taxon", + name="cover_image_credit", + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AddField( + model_name="taxon", + name="cover_image_url", + field=models.URLField(blank=True, max_length=255, null=True), + ), + migrations.AddField( + model_name="taxon", + name="fieldguide_id", + field=models.CharField(blank=True, max_length=255, null=True), + ), + ] diff --git a/ami/main/models.py b/ami/main/models.py index 6de38e592..30391a66e 100644 --- a/ami/main/models.py +++ b/ami/main/models.py @@ -2968,8 +2968,12 @@ class Taxon(BaseModel): gbif_taxon_key = models.BigIntegerField("GBIF taxon key", blank=True, null=True) bold_taxon_bin = models.CharField("BOLD taxon BIN", max_length=255, blank=True, null=True) inat_taxon_id = models.BigIntegerField("iNaturalist taxon ID", blank=True, null=True) + fieldguide_id = models.CharField(max_length=255, blank=True, null=True) # lepsai_id = models.BigIntegerField("LepsAI / Fieldguide ID", blank=True, null=True) + cover_image_url = models.URLField(max_length=255, blank=True, null=True) + cover_image_credit = models.CharField(max_length=255, blank=True, null=True) + notes = models.TextField(blank=True) projects = models.ManyToManyField("Project", related_name="taxa") diff --git a/ui/src/data-services/models/species.ts b/ui/src/data-services/models/species.ts index 9127fa0f3..1b857469c 100644 --- a/ui/src/data-services/models/species.ts +++ b/ui/src/data-services/models/species.ts @@ -53,12 +53,21 @@ export class Species extends Taxon { return `https://www.gbif.org/occurrence/gallery?advanced=1&verbatim_scientific_name=${this.name}` } + get fieldguideId(): string | null { + return this._species.fieldguide_id || null + } + get fieldguideUrl(): string | undefined { - if (!this._species.fieldguide_id) { - return undefined - } + if (!this.fieldguideId) return undefined + return `https://leps.fieldguide.ai/categories?category=${this.fieldguideId}` + } + + get coverImageUrl(): string | null { + return this._species.cover_image_url || null + } - return `https://leps.fieldguide.ai/categories?category=${this._species.fieldguide_id}` + get coverImageCredit(): string | null { + return this._species.cover_image_credit || null } get score(): number | undefined {