Skip to content

feat(Water Body): add Stocking Site management (LAN-911)#341

Merged
barredterra merged 4 commits into
version-15-hotfixfrom
lan-911
Jul 17, 2026
Merged

feat(Water Body): add Stocking Site management (LAN-911)#341
barredterra merged 4 commits into
version-15-hotfixfrom
lan-911

Conversation

@barredterra

@barredterra barredterra commented Jul 11, 2026

Copy link
Copy Markdown
Member

To do in follow-up PR:

@barredterra barredterra changed the title lan 911 feat(Water Body): add Stocking Site management (LAN-911) Jul 11, 2026
@barredterra
barredterra marked this pull request as ready for review July 17, 2026 12:15
@greptile-apps

greptile-apps Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Confidence Score: 5/5

Safe to merge — the new Stocking Site DocType, its geolocation validation, and the StockingMeasure cross-reference guard are all correctly implemented with no new defects.

All server-side validation paths are covered: the geometry proximity check in StockingSite.validate, and the water-body ownership + fish-species membership check in StockingMeasure.validate_stocking_site. Whitelisted endpoints gate data behind permission checks. Unit tests cover the geometric helpers including boundary and malformed-input cases. Issues raised in previous review threads were either addressed (server-side stocking site validation, remove_water_body_layer null guard) or acknowledged as upstream framework bugs (location type stub). No new defects were found.

No files require special attention.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant U as User (Browser)
    participant FM as Frappe Form (JS)
    participant SS as StockingSite endpoint
    participant WB as Water Body DB
    participant SM as StockingMeasure.validate()
    participant FST as Fish Species Table DB

    U->>FM: Select Water Body on Stocking Site form
    FM->>SS: xcall get_water_body_map_data(water_body)
    SS->>WB: check_permission("read") + get location
    WB-->>SS: GeoJSON boundary
    SS-->>FM: "{location, margin_meters=500}"
    FM->>FM: Render boundary layer on Leaflet map

    U->>FM: Place marker on map
    FM->>SS: xcall is_point_near_water_body(water_body, lng, lat)
    SS->>WB: get location GeoJSON
    SS->>SS: point_near_water_body() (ray-cast + segment distance)
    SS-->>FM: true / false
    alt Marker outside 500m margin
        FM-->>U: msgprint error
    else Marker valid
        FM->>FM: editableLayers.addLayer → set_location_value()
    end

    U->>FM: Save Stocking Site
    FM->>FM: JS validate → get_location_point()
    FM->>SS: POST /api/resource/Stocking Site
    SS->>SS: StockingSite.validate() → get_location_point()
    SS->>WB: db.get_value(water_body, "location")
    SS->>SS: point_near_water_body()
    SS-->>FM: 200 OK / throw ValidationError

    U->>FM: Save Stocking Measure (with stocking_site)
    FM->>SM: POST /api/resource/Stocking Measure
    SM->>WB: db.get_value(stocking_site, "water_body")
    SM->>FST: "db.exists(Fish Species Table, {parent, fish_species})"
    alt Mismatched water body or missing fish species
        SM-->>FM: throw ValidationError
    else Valid
        SM-->>FM: 200 OK
    end
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant U as User (Browser)
    participant FM as Frappe Form (JS)
    participant SS as StockingSite endpoint
    participant WB as Water Body DB
    participant SM as StockingMeasure.validate()
    participant FST as Fish Species Table DB

    U->>FM: Select Water Body on Stocking Site form
    FM->>SS: xcall get_water_body_map_data(water_body)
    SS->>WB: check_permission("read") + get location
    WB-->>SS: GeoJSON boundary
    SS-->>FM: "{location, margin_meters=500}"
    FM->>FM: Render boundary layer on Leaflet map

    U->>FM: Place marker on map
    FM->>SS: xcall is_point_near_water_body(water_body, lng, lat)
    SS->>WB: get location GeoJSON
    SS->>SS: point_near_water_body() (ray-cast + segment distance)
    SS-->>FM: true / false
    alt Marker outside 500m margin
        FM-->>U: msgprint error
    else Marker valid
        FM->>FM: editableLayers.addLayer → set_location_value()
    end

    U->>FM: Save Stocking Site
    FM->>FM: JS validate → get_location_point()
    FM->>SS: POST /api/resource/Stocking Site
    SS->>SS: StockingSite.validate() → get_location_point()
    SS->>WB: db.get_value(water_body, "location")
    SS->>SS: point_near_water_body()
    SS-->>FM: 200 OK / throw ValidationError

    U->>FM: Save Stocking Measure (with stocking_site)
    FM->>SM: POST /api/resource/Stocking Measure
    SM->>WB: db.get_value(stocking_site, "water_body")
    SM->>FST: "db.exists(Fish Species Table, {parent, fish_species})"
    alt Mismatched water body or missing fish species
        SM-->>FM: throw ValidationError
    else Valid
        SM-->>FM: 200 OK
    end
Loading

Reviews (3): Last reviewed commit: "fix(Stocking Measure): validate stocking..." | Re-trigger Greptile

Comment thread landa/water_body_management/doctype/stocking_site/stocking_site.py
Comment thread landa/water_body_management/doctype/stocking_site/stocking_site.js
@barredterra
barredterra merged commit 0260e80 into version-15-hotfix Jul 17, 2026
11 checks passed
@barredterra
barredterra deleted the lan-911 branch July 17, 2026 16:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant