Extract image_url from Pl@ntNet API response (medium size). Show thumbnail
in each match card on identify_confirm. On plant creation, download the
selected match's reference image and save as PlantPhoto thumbnail. Scan
photos saved as gallery photos (non-thumbnail) with fallback to first scan
photo as thumbnail when Pl@ntNet has no image.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Idempotent sync via notion-id marker in issue body.
Initial 10 issues already created from BloomBase Notion workspace.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Rename Django project module plantdb/ → bloombase/, update all
references in manage.py, docker-compose.yml, wsgi/asgi/settings.
Replace PlantDB with BloomBase in all template titles and navbar.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Temp images uploaded during Pl@ntNet identification are now copied to
PlantPhoto records when the plant is created in step 3. First image is
auto-set as thumbnail. Temp files still deleted after transfer.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Nav '+' button now links to identify_upload instead of plant_add
- Remove Perenual toggle, results section, and 'Also search Perenual'
link from species_results partial
- Wrap Plant card / Crop thumbnail / Delete plant buttons in flex
container for consistent mobile alignment
- Fix pre-existing test assertion to match actual crop-thumbnail URL
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Plant-level watering/sunlight fields override the species defaults.
Rendered as btn-check radio buttons in the edit form; detail page
shows the plant value (with emoji) falling back to species data.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
slug_from_query() detects VPC URLs and bare slugs (must contain a hyphen
to avoid treating single search words as slugs). When matched, the search
bypasses the keyword search and shows the plant directly as a VPC result.
Updated search hint text to make this discoverable.
Fixes: VPC search by English name (e.g. "crowfoot") is a VPC limitation —
their search only indexes Latin titles, not custom fields like Engelse naam.
The URL paste workflow is the reliable workaround.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- vpc.py: target .wp-caption img for hero image (VPC uses Elementor, not
standard WooCommerce gallery); skip logo and placeholder images by URL pattern
- plant_edit view: pass plant.species as 'species' so the species info
banner (including scientific name) appears on the edit form
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Species.vpc_raw (JSONField) stores the full scrape payload at import time.
vpc_species_reset view restores bloom_months, sunlight, max_height_cm etc.
from that snapshot. If vpc_raw is missing (species imported before this
feature), it re-scrapes from VPC on demand and saves the result.
Reset button appears on plant detail page for any plant with a VPC species.
A 'next' hidden field returns the user to the same plant after reset.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New plants/services/vpc.py: search VPC (vasteplantencatalogus.nl) by
keyword and scrape full plant detail on select
- Both searches run in parallel via ThreadPoolExecutor
- species_results partial shows results from both sources with colour-coded
source badges (green = Perenual, blue = VPC)
- vpc_select view scrapes the detail page on select, creates Species with
bloom_months, max_height_cm, sunlight from the VPC page
- Species.vpc_slug field (migration 0005) prevents re-importing the same plant
- beautifulsoup4 added to requirements
- Handles VPC unavailability gracefully (empty results, no error shown to user)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Location model: plants now FK to Location instead of free-text CharField
- Data migration 0004 converts existing location strings to Location objects
- PlantForm uses ModelChoiceField dropdown + inline "add new location" text field
- PlantPhoto model: multiple photos per plant with is_thumbnail flag
- Plant.thumbnail_url property: picks marked thumbnail, falls back to first photo then legacy photo field
- Photo gallery partial: upload, set thumbnail (★), delete (✕) with HTMX swaps on #photo-gallery
- plant_detail: uses thumbnail_url for hero image, pruning history section removed
- plant_list search updated: location__name__icontains instead of location__icontains
- Three new URL routes: upload_photo, set_thumbnail, delete_photo
- All 53 tests updated and passing
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add bloom_months to Plant and Species models (migration 0003)
- Swap pruning_months form field for bloom_months throughout
- Plant detail shows green bloom strip instead of pruning strip
- Dashboard shows 'Blooming now' count and list instead of overdue pruning
- Remove ✂️ pruning calendar from nav (feature hidden, backend intact)
- Update dashboard tests to reflect new context
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previously only a log in the exact scheduled month cleared overdue.
Now any log on or after the start of the scheduled month counts,
so pruning late (e.g. in May for a March schedule) correctly shows upcoming.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add month_strip template tag rendering JFMAMJJASOND circles,
active months dark green, inactive light grey
- Replace raw number list in pruning_strip with visual month strip
- Restyle pruning month checkboxes as clickable circles in plant form
- Fix dashboard 'Need pruning' counter (broken filter chain always showed 0)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Covers local dev, Docker deployment, env vars, data model, and
a summary of plant data sources investigated (Perenual, OpenFarm,
Trefle, Wikipedia, Google) including the commercial data opportunity.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Shows Bootstrap spinner via htmx-indicator during the Perenual API
call, and disables the button to prevent double-submits.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>