Compare commits

...

32 Commits

Author SHA1 Message Date
Daniel O'Connor
313e240eb9 Merge pull request #4337 from Growstuff/recursive-fallback
More recursive companions
2025-11-29 19:39:31 +10:30
Daniel O'Connor
14aa673440 Merge branch 'mainline' into dev 2025-11-29 19:31:17 +10:30
Daniel O'Connor
cef23b8212 More recursive companions 2025-11-29 08:55:29 +00:00
Daniel O'Connor
3b45dca6e2 Merge pull request #4335 from Growstuff/recursive-fallback
Recursive parent lookup
2025-11-29 19:17:12 +10:30
Daniel O'Connor
9060c45aed Recursive parent lookup 2025-11-29 08:36:43 +00:00
Daniel O'Connor
d4401b402a Merge pull request #4334 from Growstuff/dev
release 75
2025-11-29 18:21:22 +10:30
Daniel O'Connor
372a5edc29 Merge branch 'mainline' into dev 2025-11-29 18:21:07 +10:30
Daniel O'Connor
1f0777fda0 Merge pull request #4333 from Growstuff/parent-fallback
Crops > Show detail from parent
2025-11-29 17:03:57 +10:30
Daniel O'Connor
6503e2554c Better fallback 2025-11-29 06:15:18 +00:00
Daniel O'Connor
4fd544c0b8 Show parent crop 2025-11-29 05:53:58 +00:00
Daniel O'Connor
f7e1aafc25 Fallback to parent for photos, youtube 2025-11-29 05:52:27 +00:00
Daniel O'Connor
208720c46c Show parent crop details if known 2025-11-29 05:49:28 +00:00
Daniel O'Connor
370c8683fd On show, fall back to parent crop if no detail known 2025-11-29 05:46:23 +00:00
Daniel O'Connor
e5aa2aaa1f Release 74 (#4284)
* Bump icalendar from 2.11.2 to 2.12.0

Bumps [icalendar](https://github.com/icalendar/icalendar) from 2.11.2 to 2.12.0.
- [Changelog](https://github.com/icalendar/icalendar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/icalendar/icalendar/compare/v2.11.2...v2.12.0)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-version: 2.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rubocop from 1.81.0 to 1.81.1

Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.81.0 to 1.81.1.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.81.0...v1.81.1)

---
updated-dependencies:
- dependency-name: rubocop
  dependency-version: 1.81.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump haml-rails from 2.1.0 to 3.0.0

Bumps [haml-rails](https://github.com/haml/haml-rails) from 2.1.0 to 3.0.0.
- [Commits](https://github.com/haml/haml-rails/compare/v2.1.0...v3.0.0)

---
updated-dependencies:
- dependency-name: haml-rails
  dependency-version: 3.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump faraday from 2.13.4 to 2.14.0

Bumps [faraday](https://github.com/lostisland/faraday) from 2.13.4 to 2.14.0.
- [Release notes](https://github.com/lostisland/faraday/releases)
- [Changelog](https://github.com/lostisland/faraday/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lostisland/faraday/compare/v2.13.4...v2.14.0)

---
updated-dependencies:
- dependency-name: faraday
  dependency-version: 2.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rubocop-rails from 2.33.3 to 2.33.4

Bumps [rubocop-rails](https://github.com/rubocop/rubocop-rails) from 2.33.3 to 2.33.4.
- [Release notes](https://github.com/rubocop/rubocop-rails/releases)
- [Changelog](https://github.com/rubocop/rubocop-rails/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop-rails/compare/v2.33.3...v2.33.4)

---
updated-dependencies:
- dependency-name: rubocop-rails
  dependency-version: 2.33.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Merge pull request #4277 from Growstuff/add-activity-update-coverage

Add test coverage for updating an activity via the API

* Bump rack from 2.2.18 to 2.2.19

Bumps [rack](https://github.com/rack/rack) from 2.2.18 to 2.2.19.
- [Release notes](https://github.com/rack/rack/releases)
- [Changelog](https://github.com/rack/rack/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rack/rack/compare/v2.2.18...v2.2.19)

---
updated-dependencies:
- dependency-name: rack
  dependency-version: 2.2.19
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump active_record_union from 1.3.0 to 1.4.0

Bumps [active_record_union](https://github.com/brianhempel/active_record_union) from 1.3.0 to 1.4.0.
- [Commits](https://github.com/brianhempel/active_record_union/commits)

---
updated-dependencies:
- dependency-name: active_record_union
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump selenium-webdriver from 4.35.0 to 4.36.0

Bumps [selenium-webdriver](https://github.com/SeleniumHQ/selenium) from 4.35.0 to 4.36.0.
- [Release notes](https://github.com/SeleniumHQ/selenium/releases)
- [Changelog](https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES)
- [Commits](https://github.com/SeleniumHQ/selenium/compare/selenium-4.35.0...selenium-4.36.0)

---
updated-dependencies:
- dependency-name: selenium-webdriver
  dependency-version: 4.36.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rack from 2.2.19 to 2.2.20

Bumps [rack](https://github.com/rack/rack) from 2.2.19 to 2.2.20.
- [Release notes](https://github.com/rack/rack/releases)
- [Changelog](https://github.com/rack/rack/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rack/rack/compare/v2.2.19...v2.2.20)

---
updated-dependencies:
- dependency-name: rack
  dependency-version: 2.2.20
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump icalendar from 2.12.0 to 2.12.1

Bumps [icalendar](https://github.com/icalendar/icalendar) from 2.12.0 to 2.12.1.
- [Changelog](https://github.com/icalendar/icalendar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/icalendar/icalendar/compare/v2.12.0...v2.12.1)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-version: 2.12.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump puma from 7.0.4 to 7.1.0

Bumps [puma](https://github.com/puma/puma) from 7.0.4 to 7.1.0.
- [Release notes](https://github.com/puma/puma/releases)
- [Changelog](https://github.com/puma/puma/blob/main/History.md)
- [Commits](https://github.com/puma/puma/compare/v7.0.4...v7.1.0)

---
updated-dependencies:
- dependency-name: puma
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump chartkick from 5.2.0 to 5.2.1

Bumps [chartkick](https://github.com/ankane/chartkick) from 5.2.0 to 5.2.1.
- [Changelog](https://github.com/ankane/chartkick/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ankane/chartkick/compare/v5.2.0...v5.2.1)

---
updated-dependencies:
- dependency-name: chartkick
  dependency-version: 5.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rubocop from 1.81.1 to 1.81.6

Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.81.1 to 1.81.6.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.81.1...v1.81.6)

---
updated-dependencies:
- dependency-name: rubocop
  dependency-version: 1.81.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump jquery-rails from 4.6.0 to 4.6.1

Bumps [jquery-rails](https://github.com/rails/jquery-rails) from 4.6.0 to 4.6.1.
- [Changelog](https://github.com/rails/jquery-rails/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rails/jquery-rails/compare/v4.6.0...v4.6.1)

---
updated-dependencies:
- dependency-name: jquery-rails
  dependency-version: 4.6.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump actions/upload-artifact from 4 to 5

Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump haml from 6.3.0 to 7.0.0

Bumps [haml](https://haml.info) from 6.3.0 to 7.0.0.

---
updated-dependencies:
- dependency-name: haml
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump selenium-webdriver from 4.36.0 to 4.38.0

Bumps [selenium-webdriver](https://github.com/SeleniumHQ/selenium) from 4.36.0 to 4.38.0.
- [Release notes](https://github.com/SeleniumHQ/selenium/releases)
- [Changelog](https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES)
- [Commits](https://github.com/SeleniumHQ/selenium/compare/selenium-4.36.0...selenium-4.38.0)

---
updated-dependencies:
- dependency-name: selenium-webdriver
  dependency-version: 4.38.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump haml_lint from 0.66.0 to 0.67.0

Bumps [haml_lint](https://github.com/sds/haml-lint) from 0.66.0 to 0.67.0.
- [Release notes](https://github.com/sds/haml-lint/releases)
- [Changelog](https://github.com/sds/haml-lint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sds/haml-lint/compare/v0.66.0...v0.67.0)

---
updated-dependencies:
- dependency-name: haml_lint
  dependency-version: 0.67.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump haml from 7.0.0 to 7.0.1

Bumps [haml](https://haml.info) from 7.0.0 to 7.0.1.

---
updated-dependencies:
- dependency-name: haml
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rails from 7.2.2.2 to 7.2.3

Bumps [rails](https://github.com/rails/rails) from 7.2.2.2 to 7.2.3.
- [Release notes](https://github.com/rails/rails/releases)
- [Commits](https://github.com/rails/rails/compare/v7.2.2.2...v7.2.3)

---
updated-dependencies:
- dependency-name: rails
  dependency-version: 7.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump actions/setup-node from 5 to 6

Bumps [actions/setup-node](https://github.com/actions/setup-node) from 5 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump responders from 3.1.1 to 3.2.0

Bumps [responders](https://github.com/heartcombo/responders) from 3.1.1 to 3.2.0.
- [Release notes](https://github.com/heartcombo/responders/releases)
- [Changelog](https://github.com/heartcombo/responders/blob/main/CHANGELOG.md)
- [Commits](https://github.com/heartcombo/responders/compare/v3.1.1...v3.2.0)

---
updated-dependencies:
- dependency-name: responders
  dependency-version: 3.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump bullet from 8.0.8 to 8.1.0

Bumps [bullet](https://github.com/flyerhzm/bullet) from 8.0.8 to 8.1.0.
- [Changelog](https://github.com/flyerhzm/bullet/blob/main/CHANGELOG.md)
- [Commits](https://github.com/flyerhzm/bullet/compare/8.0.8...8.1.0)

---
updated-dependencies:
- dependency-name: bullet
  dependency-version: 8.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump query_diet from 0.7.2 to 0.7.3

Bumps [query_diet](https://github.com/makandra/query_diet) from 0.7.2 to 0.7.3.
- [Changelog](https://github.com/makandra/query_diet/blob/master/CHANGELOG.md)
- [Commits](https://github.com/makandra/query_diet/compare/v0.7.2...v0.7.3)

---
updated-dependencies:
- dependency-name: query_diet
  dependency-version: 0.7.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump oj from 3.16.11 to 3.16.12

Bumps [oj](https://github.com/ohler55/oj) from 3.16.11 to 3.16.12.
- [Release notes](https://github.com/ohler55/oj/releases)
- [Changelog](https://github.com/ohler55/oj/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/ohler55/oj/compare/v3.16.11...v3.16.12)

---
updated-dependencies:
- dependency-name: oj
  dependency-version: 3.16.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump scout_apm from 5.7.1 to 5.8.0

Bumps [scout_apm](https://github.com/scoutapp/scout_apm_ruby) from 5.7.1 to 5.8.0.
- [Changelog](https://github.com/scoutapp/scout_apm_ruby/blob/master/CHANGELOG.markdown)
- [Commits](https://github.com/scoutapp/scout_apm_ruby/compare/v5.7.1...v5.8.0)

---
updated-dependencies:
- dependency-name: scout_apm
  dependency-version: 5.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump axe-core-capybara from 4.10.3 to 4.11.0

Bumps [axe-core-capybara](https://github.com/dequelabs/axe-core-gems) from 4.10.3 to 4.11.0.
- [Release notes](https://github.com/dequelabs/axe-core-gems/releases)
- [Changelog](https://github.com/dequelabs/axe-core-gems/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/dequelabs/axe-core-gems/compare/v4.10.3...v4.11.0)

---
updated-dependencies:
- dependency-name: axe-core-capybara
  dependency-version: 4.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rake from 13.3.0 to 13.3.1

Bumps [rake](https://github.com/ruby/rake) from 13.3.0 to 13.3.1.
- [Release notes](https://github.com/ruby/rake/releases)
- [Changelog](https://github.com/ruby/rake/blob/master/History.rdoc)
- [Commits](https://github.com/ruby/rake/compare/v13.3.0...v13.3.1)

---
updated-dependencies:
- dependency-name: rake
  dependency-version: 13.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rubocop from 1.81.6 to 1.81.7

Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.81.6 to 1.81.7.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.81.6...v1.81.7)

---
updated-dependencies:
- dependency-name: rubocop
  dependency-version: 1.81.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rswag-specs from 2.16.0 to 2.17.0

Bumps [rswag-specs](https://github.com/rswag/rswag) from 2.16.0 to 2.17.0.
- [Release notes](https://github.com/rswag/rswag/releases)
- [Changelog](https://github.com/rswag/rswag/blob/2.17.0/CHANGELOG.md)
- [Commits](https://github.com/rswag/rswag/compare/2.16.0...2.17.0)

---
updated-dependencies:
- dependency-name: rswag-specs
  dependency-version: 2.17.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rswag-ui from 2.16.0 to 2.17.0

Bumps [rswag-ui](https://github.com/rswag/rswag) from 2.16.0 to 2.17.0.
- [Release notes](https://github.com/rswag/rswag/releases)
- [Changelog](https://github.com/rswag/rswag/blob/2.17.0/CHANGELOG.md)
- [Commits](https://github.com/rswag/rswag/compare/2.16.0...2.17.0)

---
updated-dependencies:
- dependency-name: rswag-ui
  dependency-version: 2.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rswag-api from 2.16.0 to 2.17.0

Bumps [rswag-api](https://github.com/rswag/rswag) from 2.16.0 to 2.17.0.
- [Release notes](https://github.com/rswag/rswag/releases)
- [Changelog](https://github.com/rswag/rswag/blob/2.17.0/CHANGELOG.md)
- [Commits](https://github.com/rswag/rswag/compare/2.16.0...2.17.0)

---
updated-dependencies:
- dependency-name: rswag-api
  dependency-version: 2.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rubocop-factory_bot from 2.27.1 to 2.28.0

Bumps [rubocop-factory_bot](https://github.com/rubocop/rubocop-factory_bot) from 2.27.1 to 2.28.0.
- [Release notes](https://github.com/rubocop/rubocop-factory_bot/releases)
- [Changelog](https://github.com/rubocop/rubocop-factory_bot/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop-factory_bot/compare/v2.27.1...v2.28.0)

---
updated-dependencies:
- dependency-name: rubocop-factory_bot
  dependency-version: 2.28.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump i18n-tasks from 1.0.15 to 1.1.0

Bumps [i18n-tasks](https://github.com/glebm/i18n-tasks) from 1.0.15 to 1.1.0.
- [Release notes](https://github.com/glebm/i18n-tasks/releases)
- [Changelog](https://github.com/glebm/i18n-tasks/blob/main/CHANGES.md)
- [Commits](https://github.com/glebm/i18n-tasks/compare/v1.0.15...v1.1.0)

---
updated-dependencies:
- dependency-name: i18n-tasks
  dependency-version: 1.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rubocop-rspec_rails from 2.31.0 to 2.32.0

Bumps [rubocop-rspec_rails](https://github.com/rubocop/rubocop-rspec_rails) from 2.31.0 to 2.32.0.
- [Release notes](https://github.com/rubocop/rubocop-rspec_rails/releases)
- [Changelog](https://github.com/rubocop/rubocop-rspec_rails/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop-rspec_rails/compare/v2.31.0...v2.32.0)

---
updated-dependencies:
- dependency-name: rubocop-rspec_rails
  dependency-version: 2.32.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump js-yaml from 3.14.1 to 3.14.2

Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.14.1 to 3.14.2.
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/3.14.1...3.14.2)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 3.14.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump haml from 7.0.1 to 7.0.2

Bumps [haml](https://github.com/haml/haml) from 7.0.1 to 7.0.2.
- [Release notes](https://github.com/haml/haml/releases)
- [Changelog](https://github.com/haml/haml/blob/main/CHANGELOG.md)
- [Commits](https://github.com/haml/haml/compare/v7.0.1...v7.0.2)

---
updated-dependencies:
- dependency-name: haml
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump actions/checkout from 5 to 6

Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rubocop-rspec from 3.7.0 to 3.8.0

Bumps [rubocop-rspec](https://github.com/rubocop/rubocop-rspec) from 3.7.0 to 3.8.0.
- [Release notes](https://github.com/rubocop/rubocop-rspec/releases)
- [Changelog](https://github.com/rubocop/rubocop-rspec/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop-rspec/compare/v3.7.0...v3.8.0)

---
updated-dependencies:
- dependency-name: rubocop-rspec
  dependency-version: 3.8.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rubocop-rails from 2.33.4 to 2.34.1

Bumps [rubocop-rails](https://github.com/rubocop/rubocop-rails) from 2.33.4 to 2.34.1.
- [Release notes](https://github.com/rubocop/rubocop-rails/releases)
- [Changelog](https://github.com/rubocop/rubocop-rails/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop-rails/compare/v2.33.4...v2.34.1)

---
updated-dependencies:
- dependency-name: rubocop-rails
  dependency-version: 2.34.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* feat: Add YouTube video to crop page

This commit introduces the following changes:

- Adds an `en_youtube_url` attribute to the `Crop` model to store a URL for an English language YouTube video.
- If a `en_youtube_url` is present for a crop, the video is embedded on the crop's show page.
- A link is added to the "Learn more" section of the crop's show page to search YouTube for "growing [crop name]".
- A helper method is added to extract the video ID from various YouTube URL formats.
- A validation is added to the `Crop` model to ensure that the `en_youtube_url` is a valid YouTube URL.

* feat: Add YouTube video to crop page

This commit introduces the following changes:

- Adds an `en_youtube_url` attribute to the `Crop` model to store a URL for an English language YouTube video.
- The `en_youtube_url` is now an editable field in the crop form.
- If a `en_youtube_url` is present for a crop, the video is embedded on the crop's show page.
- A link is added to the "Learn more" section of the crop's show page to search YouTube for "growing [crop name]".
- A helper method is added to extract the video ID from various YouTube URL formats.
- A validation is added to the `Crop` model to ensure that the `en_youtube_url` is a valid YouTube URL.

* Bump i18n-tasks from 1.1.0 to 1.1.2

Bumps [i18n-tasks](https://github.com/glebm/i18n-tasks) from 1.1.0 to 1.1.2.
- [Release notes](https://github.com/glebm/i18n-tasks/releases)
- [Changelog](https://github.com/glebm/i18n-tasks/blob/main/CHANGES.md)
- [Commits](https://github.com/glebm/i18n-tasks/compare/v1.1.0...v1.1.2)

---
updated-dependencies:
- dependency-name: i18n-tasks
  dependency-version: 1.1.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Rearrange

* feat: Migrate crop description to a dedicated column

This change migrates the crop description from the `openfarm_data` JSONB field to a new, dedicated `description` text column in the `crops` table.

A data migration is included to move the existing description data to the new column. The `OpenFarmData` concern is updated to remove the now-redundant `description` method.

* Merge pull request #4332 from Growstuff/crops-controller

Add coverage for crops

* I have added the `before_destroy` callback to the `Crop` model to destroy all `CropCompanion` records where the crop is `crop_b`. (#4266)

I have added a new test to `spec/models/crop_spec.rb` to verify that deleting a crop also destroys the associated `CropCompanion` records.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2025-11-29 15:36:34 +10:30
Daniel O'Connor
ba9117db4d I have added the before_destroy callback to the Crop model to destroy all CropCompanion records where the crop is crop_b. (#4266)
I have added a new test to `spec/models/crop_spec.rb` to verify that deleting a crop also destroys the associated `CropCompanion` records.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2025-11-29 15:32:47 +10:30
Daniel O'Connor
474f09e110 Merge pull request #4332 from Growstuff/crops-controller
Add coverage for crops
2025-11-29 15:32:08 +10:30
Daniel O'Connor
0a89ac7e28 Merge pull request #4331 from Growstuff/feature/migrate-crop-description
feat: Migrate crop description to a dedicated column
2025-11-29 14:49:24 +10:30
Daniel O'Connor
8485bec90d Merge pull request #4329 from Growstuff/add-youtube-video-to-crop
Add YouTube Video to Crop Page
2025-11-29 14:46:22 +10:30
Daniel O'Connor
1427446500 Merge pull request #4326 from Growstuff/dependabot/bundler/i18n-tasks-1.1.2
Bump i18n-tasks from 1.1.0 to 1.1.2
2025-11-29 14:41:19 +10:30
google-labs-jules[bot]
8f6738eefa feat: Migrate crop description to a dedicated column
This change migrates the crop description from the `openfarm_data` JSONB field to a new, dedicated `description` text column in the `crops` table.

A data migration is included to move the existing description data to the new column. The `OpenFarmData` concern is updated to remove the now-redundant `description` method.
2025-11-29 04:07:25 +00:00
Daniel O'Connor
be73a479ad Merge branch 'dev' into add-youtube-video-to-crop 2025-11-29 14:26:28 +10:30
Daniel O'Connor
e0aaa9e44f Rearrange 2025-11-29 14:26:15 +10:30
dependabot[bot]
d823bbb743 Bump i18n-tasks from 1.1.0 to 1.1.2
Bumps [i18n-tasks](https://github.com/glebm/i18n-tasks) from 1.1.0 to 1.1.2.
- [Release notes](https://github.com/glebm/i18n-tasks/releases)
- [Changelog](https://github.com/glebm/i18n-tasks/blob/main/CHANGES.md)
- [Commits](https://github.com/glebm/i18n-tasks/compare/v1.1.0...v1.1.2)

---
updated-dependencies:
- dependency-name: i18n-tasks
  dependency-version: 1.1.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-29 03:56:08 +00:00
google-labs-jules[bot]
73c7158454 feat: Add YouTube video to crop page
This commit introduces the following changes:

- Adds an `en_youtube_url` attribute to the `Crop` model to store a URL for an English language YouTube video.
- The `en_youtube_url` is now an editable field in the crop form.
- If a `en_youtube_url` is present for a crop, the video is embedded on the crop's show page.
- A link is added to the "Learn more" section of the crop's show page to search YouTube for "growing [crop name]".
- A helper method is added to extract the video ID from various YouTube URL formats.
- A validation is added to the `Crop` model to ensure that the `en_youtube_url` is a valid YouTube URL.
2025-11-29 03:45:23 +00:00
Daniel O'Connor
253fe0b903 Merge pull request #4324 from Growstuff/dependabot/bundler/rubocop-rails-2.34.1
Bump rubocop-rails from 2.33.4 to 2.34.1
2025-11-29 14:14:10 +10:30
Daniel O'Connor
08e47b89f1 Merge pull request #4319 from Growstuff/dependabot/bundler/rubocop-rspec-3.8.0
Bump rubocop-rspec from 3.7.0 to 3.8.0
2025-11-29 14:13:10 +10:30
google-labs-jules[bot]
684768ba5c feat: Add YouTube video to crop page
This commit introduces the following changes:

- Adds an `en_youtube_url` attribute to the `Crop` model to store a URL for an English language YouTube video.
- If a `en_youtube_url` is present for a crop, the video is embedded on the crop's show page.
- A link is added to the "Learn more" section of the crop's show page to search YouTube for "growing [crop name]".
- A helper method is added to extract the video ID from various YouTube URL formats.
- A validation is added to the `Crop` model to ensure that the `en_youtube_url` is a valid YouTube URL.
2025-11-29 03:40:59 +00:00
dependabot[bot]
ebdba592b3 Bump rubocop-rails from 2.33.4 to 2.34.1
Bumps [rubocop-rails](https://github.com/rubocop/rubocop-rails) from 2.33.4 to 2.34.1.
- [Release notes](https://github.com/rubocop/rubocop-rails/releases)
- [Changelog](https://github.com/rubocop/rubocop-rails/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop-rails/compare/v2.33.4...v2.34.1)

---
updated-dependencies:
- dependency-name: rubocop-rails
  dependency-version: 2.34.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-29 03:29:54 +00:00
dependabot[bot]
183d910e7e Bump rubocop-rspec from 3.7.0 to 3.8.0
Bumps [rubocop-rspec](https://github.com/rubocop/rubocop-rspec) from 3.7.0 to 3.8.0.
- [Release notes](https://github.com/rubocop/rubocop-rspec/releases)
- [Changelog](https://github.com/rubocop/rubocop-rspec/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop-rspec/compare/v3.7.0...v3.8.0)

---
updated-dependencies:
- dependency-name: rubocop-rspec
  dependency-version: 3.8.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-29 03:29:37 +00:00
Daniel O'Connor
4e91037f50 Release 73 (#4275)
* Bump puma from 7.0.3 to 7.0.4

Bumps [puma](https://github.com/puma/puma) from 7.0.3 to 7.0.4.
- [Release notes](https://github.com/puma/puma/releases)
- [Changelog](https://github.com/puma/puma/blob/master/History.md)
- [Commits](https://github.com/puma/puma/compare/v7.0.3...v7.0.4)

---
updated-dependencies:
- dependency-name: puma
  dependency-version: 7.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump geocoder from 1.8.5 to 1.8.6

Bumps [geocoder](https://github.com/alexreisner/geocoder) from 1.8.5 to 1.8.6.
- [Changelog](https://github.com/alexreisner/geocoder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/alexreisner/geocoder/compare/v1.8.5...v1.8.6)

---
updated-dependencies:
- dependency-name: geocoder
  dependency-version: 1.8.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rubocop from 1.80.2 to 1.81.0

Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.80.2 to 1.81.0.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.80.2...v1.81.0)

---
updated-dependencies:
- dependency-name: rubocop
  dependency-version: 1.81.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rack from 2.2.17 to 2.2.18

Bumps [rack](https://github.com/rack/rack) from 2.2.17 to 2.2.18.
- [Release notes](https://github.com/rack/rack/releases)
- [Changelog](https://github.com/rack/rack/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rack/rack/compare/v2.2.17...v2.2.18)

---
updated-dependencies:
- dependency-name: rack
  dependency-version: 2.2.18
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Extend planting API to render garden id in relationships

* Update planting_resource.rb

* Update photo_resource.rb

* Update seed_resource.rb

* Update harvest_resource.rb

* Update garden_resource.rb

* Update crop_resource.rb

* Update activity_resource.rb

* Create robots.txt based on wikipedia

* Merge pull request #4274 from Growstuff/CloCkWeRX-patch-3

API > Render activities links under member

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2025-09-29 01:12:18 +09:30
Daniel O'Connor
af74a2907f Sept 21 release (#4258)
* Format

* Bump puma from 7.0.2 to 7.0.3

Bumps [puma](https://github.com/puma/puma) from 7.0.2 to 7.0.3.
- [Release notes](https://github.com/puma/puma/releases)
- [Changelog](https://github.com/puma/puma/blob/master/History.md)
- [Commits](https://github.com/puma/puma/compare/v7.0.2...v7.0.3)

---
updated-dependencies:
- dependency-name: puma
  dependency-version: 7.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump active_utils from 3.5.0 to 3.6.0

Bumps [active_utils](https://github.com/shopify/active_utils) from 3.5.0 to 3.6.0.
- [Release notes](https://github.com/shopify/active_utils/releases)
- [Changelog](https://github.com/Shopify/active_utils/blob/main/CHANGELOG.md)
- [Commits](https://github.com/shopify/active_utils/compare/v3.5.0...v3.6.0)

---
updated-dependencies:
- dependency-name: active_utils
  dependency-version: 3.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rexml from 3.4.1 to 3.4.2

Bumps [rexml](https://github.com/ruby/rexml) from 3.4.1 to 3.4.2.
- [Release notes](https://github.com/ruby/rexml/releases)
- [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md)
- [Commits](https://github.com/ruby/rexml/compare/v3.4.1...v3.4.2)

---
updated-dependencies:
- dependency-name: rexml
  dependency-version: 3.4.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump recaptcha from 5.20.1 to 5.21.1

Bumps [recaptcha](https://github.com/ambethia/recaptcha) from 5.20.1 to 5.21.1.
- [Changelog](https://github.com/ambethia/recaptcha/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ambethia/recaptcha/compare/v5.20.1...v5.21.1)

---
updated-dependencies:
- dependency-name: recaptcha
  dependency-version: 5.21.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Merge pull request #4222 from Growstuff/feature/add-activity-prompts

feat: Add prompts for new activities

* Add ability to copy/duplicate an activity

* Rubocop

* Rubocop fixes

* Rubocop

* Rubocop

* Rubocop

* Rubocop

* Rubocop

* Add ability to create companion plantings

This change adds the ability for crop wranglers to create and manage companion plantings for crops.

- Adds a `source_url` to the `CropCompanion` model to store an optional reference URL.
- Restricts the management of companion plantings to users with the `crop_wrangler` role.
- Creates a new admin interface for managing companion plantings for a specific crop.
- Updates the crop show page to display companions from both the crop and its parent crop.

* Merge pull request #4262 from Growstuff/feature/github-releases-widget

feat: Add cached GitHub releases widget to homepage

* Add recurring activities feature without database persistence (#4261)

* This change introduces a new feature that allows users to create recurring activities.

A user can now specify that an activity should be repeated "X" times, every "Y" weeks. When an activity is created with these options, the application will create the initial activity and then "X" additional copies, with each copy's due date offset by "Y" weeks from the previous one.

The repeat information is not stored in the database. It is only used at the time of creation to generate the recurring activities.

The following changes were made:
- Updated the new activity form to include fields for "repeat times" and "repeat weeks".
- Modified the `ActivitiesController#create` action to handle the creation of recurring activities.
- Added feature tests to ensure the new functionality works as expected.

* Remove not very useful spec

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: Daniel O'Connor <daniel.oconnor@gmail.com>

* Adjust copy of activities and prompts (#4260)

* Adjust copy

* Adjust copy

* Move repeat prompt

* Improve prompts

* Clean up schema

* Fix spec

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2025-09-21 16:30:55 +09:30
Daniel O'Connor
3804ae3333 Merge pull request #4243 from Growstuff/dev
Release71
2025-09-10 20:46:27 +09:30
15 changed files with 140 additions and 29 deletions

View File

@@ -27,7 +27,7 @@ services:
command: sleep infinity
db:
image: postgres:latest
image: postgres:17
restart: unless-stopped
volumes:
- postgres-data:/var/lib/postgresql/data

View File

@@ -201,7 +201,7 @@ GEM
comfy_bootstrap_form (4.0.9)
rails (>= 5.0.0)
concurrent-ruby (1.3.5)
connection_pool (2.5.4)
connection_pool (2.5.5)
crass (1.0.6)
crowdin-api (1.12.0)
open-uri (>= 0.1.0, < 0.2.0)
@@ -327,7 +327,7 @@ GEM
multi_xml (>= 0.5.2)
i18n (1.14.7)
concurrent-ruby (~> 1.0)
i18n-tasks (1.1.0)
i18n-tasks (1.1.2)
activesupport (>= 4.0.2)
ast (>= 2.1.0)
erubi
@@ -417,7 +417,7 @@ GEM
mini_magick (4.12.0)
mini_mime (1.1.5)
mini_portile2 (2.8.9)
minitest (5.26.1)
minitest (5.26.2)
moneta (1.0.0)
msgpack (1.8.0)
multi_json (1.15.0)
@@ -548,7 +548,7 @@ GEM
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
ffi (~> 1.0)
rdoc (6.15.1)
rdoc (6.16.1)
erb
psych (>= 4.0.0)
tsort
@@ -630,7 +630,7 @@ GEM
rubocop-factory_bot (2.28.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop-rails (2.33.4)
rubocop-rails (2.34.1)
activesupport (>= 4.2.0)
lint_roller (~> 1.1)
rack (>= 1.1)
@@ -639,9 +639,9 @@ GEM
rubocop-rake (0.7.1)
lint_roller (~> 1.1)
rubocop (>= 1.72.1)
rubocop-rspec (3.7.0)
rubocop-rspec (3.8.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop (~> 1.81)
rubocop-rspec_rails (2.32.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
@@ -731,7 +731,7 @@ GEM
nokogiri (>= 1.2.0)
rack (>= 1.0)
rack-test (>= 0.5.3)
webrick (1.9.1)
webrick (1.9.2)
websocket (1.2.11)
websocket-driver (0.8.0)
base64

View File

@@ -188,10 +188,11 @@ class CropsController < ApplicationController
def crop_params
params.require(:crop).permit(
:name, :en_wikipedia_url,
:name, :en_wikipedia_url, :en_youtube_url,
:parent_id, :perennial,
:request_notes, :reason_for_rejection,
:rejection_notes,
:description,
:row_spacing, :spread, :height,
:sowing_method, :sun_requirements, :growing_degree_days,
scientific_names_attributes: %i(scientific_name _destroy id)

View File

@@ -1,6 +1,18 @@
# frozen_string_literal: true
module CropsHelper
def crop_or_parent(crop, attribute)
default = crop.send(attribute)
return default if default.present?
while parent = crop.parent do
return parent.send(attribute) if parent&.send(attribute).present?
end
# For scopes, arrays, etc return the empty value
default
end
def display_seed_availability(member, crop)
seeds = member.seeds.where(crop:)
total_quantity = seeds.where.not(quantity: nil).sum(:quantity)
@@ -17,4 +29,12 @@ module CropsHelper
def crop_ebay_seeds_url(crop)
"https://www.ebay.com/sch/i.html?_nkw=#{CGI.escape crop.name}"
end
def youtube_video_id(url)
return unless url
regex = %r{(?:youtube(?:-nocookie)?\.com/(?:[^/\n\s]+/\S+/|(?:v|e(?:mbed)?)/|\S*?[?&]v=)|youtu\.be/)([a-zA-Z0-9_-]{11})}
match = url.match(regex)
match[1] if match
end
end

View File

@@ -19,10 +19,6 @@ module OpenFarmData
fetch_attr('tags_array')
end
def description
fetch_attr('description')
end
def common_names
fetch_attr('common_names')
end

View File

@@ -55,6 +55,12 @@ class Crop < ApplicationRecord
message: 'is not a valid English Wikipedia URL'
},
if: :approved?
validates :en_youtube_url,
format: {
with: %r{\A(?:https?://)?(?:www\.)?(?:youtube(?:-nocookie)?\.com/(?:(?:v|e(?:mbed)?)/|\S*?[?&]v=)|youtu\.be/)[a-zA-Z0-9_-]{11}(?:[?&]\S*)?\z},
message: 'is not a valid YouTube URL'
},
allow_blank: true
validates :name, uniqueness: { scope: :approval_status }, if: :pending?
def to_s
@@ -156,11 +162,17 @@ class Crop < ApplicationRecord
def all_companions
return companions unless parent
(companions + parent.companions).uniq
(companions + parent.all_companions).uniq
end
before_destroy :destroy_reverse_companionships
private
def destroy_reverse_companionships
CropCompanion.where(crop_b: self).destroy_all
end
def count_uses_of_property(col_name)
plantings.unscoped
.where(crop_id: id)

View File

@@ -41,19 +41,37 @@
= f.radio_button(:perennial, true, label: "Perennial")
%span.help-block Living more than two years
%h2 OpenFarm Data
%h2 Data
= f.text_area :description, label: 'Description'
- if @crop.parent
%span.help-block Parent: #{@crop.parent.description}
= f.number_field :row_spacing, label: 'Row Spacing (cm)', min: 0
- if @crop.parent
%span.help-block Parent: #{@crop.parent.row_spacing}
= f.number_field :spread, label: 'Spread (cm)', min: 0
- if @crop.parent
%span.help-block Parent: #{@crop.parent.spread}
= f.number_field :height, label: 'Height (cm)', min: 0
- if @crop.parent
%span.help-block Parent: #{@crop.parent.height}
= f.text_field :sowing_method
- if @crop.parent
%span.help-block Parent: #{@crop.parent.sowing_method}
= f.text_field :sun_requirements
- if @crop.parent
%span.help-block Parent: #{@crop.parent.sun_requirements}
= f.number_field :growing_degree_days, min: 0
- if @crop.parent
%span.help-block Parent: #{@crop.parent.growing_degree_days}
- unless @crop.approved?
= link_to 'Search wikipedia', "https://en.wikipedia.org/w/index.php?search=#{@crop.name}", target: '_blank'
= f.url_field :en_wikipedia_url, id: "en_wikipedia_url", label: 'Wikipedia URL'
%span.help-block
Link to the crop's page on the English language Wikipedia (required).
= f.url_field :en_youtube_url, label: 'YouTube URL'
%span.help-block
Link to a YouTube video about the crop in English.
-# Only crop wranglers see the crop hierarchy (for now)
- if can? :wrangle, @crop

View File

@@ -6,14 +6,14 @@
- unless @crop.approved?
%badge.badge-warning=@crop.approval_status
%small.text-muted= @crop.default_scientific_name
- if @crop.sowing_method.present?
- if crop_or_parent(@crop, :sowing_method).present?
%p
%strong How to sow #{@crop.name}:
= @crop.sowing_method
- if @crop.sun_requirements.present?
= crop_or_parent(@crop, :sowing_method)
- if crop_or_parent(@crop, :sun_requirements).present?
%p
%strong Sun requirement for #{@crop}:
Plant in #{@crop.sun_requirements}
Plant in #{crop_or_parent(@crop, :sun_requirements)}
%p.text-muted
- if !@crop.plantings.empty?
#{@crop.name.titleize} has been planted
@@ -21,8 +21,8 @@
by #{ENV['GROWSTUFF_SITE_NAME']} members.
- else
Nobody is growing this yet. You could be the first!
- if @crop.description.present?
%p= simple_format @crop.description
- if crop_or_parent(@crop, :description).present?
%p= simple_format crop_or_parent(@crop, :description)
.col-md-3
= image_tag crop_image_path(@crop),
class: 'img-responsive shadow rounded crop-hero-photo', alt: "Image of #{@crop.name}"

View File

@@ -1,7 +1,7 @@
%h2 #{photo_icon} Photos
- [Crop, Planting, Harvest, Seed].each do |model_name|
- if crop.photos.by_model(model_name).any?
- if crop_or_parent(crop, :photos).by_model(model_name).any?
%h3 #{@crop.name.capitalize} #{t("activerecord.models.#{model_name.to_s.downcase}.other")}
= render 'photos/gallery', photos: crop.photos.by_model(model_name).includes(:owner).order(likes_count: :desc).limit(5)
= render 'photos/gallery', photos: crop_or_parent(crop, :photos).by_model(model_name).includes(:owner).order(likes_count: :desc).limit(5)
- if crop.photos.count.positive?
= link_to 'more photos »', crop_photos_path(@crop), class: 'btn'

View File

@@ -11,6 +11,8 @@
- content_for :breadcrumbs do
%li.breadcrumb-item= link_to 'Crops', crops_path
- if @crop.parent
%li.breadcrumb-item.active= link_to @crop.parent.name.capitalize, @crop.parent
%li.breadcrumb-item.active= link_to @crop.name.capitalize, @crop
= render 'approval_status_message', crop: @crop
@@ -30,6 +32,12 @@
- @crop.all_companions.each do |companion|
= render 'crops/tiny', crop: companion
- if crop_or_parent(@crop, :en_youtube_url).present?
%section.youtube
%h2 Video
.embed-responsive.embed-responsive-16by9
%iframe.embed-responsive-item{ src: "https://www.youtube.com/embed/#{youtube_video_id(crop_or_parent(@crop, :en_youtube_url))}", allowfullscreen: true }
%section.photos
= cute_icon
= render 'crops/photos', crop: @crop
@@ -157,3 +165,10 @@
= icon 'fas', 'external-link-alt'
Wikihow instructions
%li.list-group-item
= link_to "https://www.youtube.com/results?search_query=#{CGI.escape "growing #{@crop.name}"}",
target: "_blank",
class: 'card-link',
rel: "noopener noreferrer" do
= icon 'fab', 'youtube'
YouTube

View File

@@ -0,0 +1,5 @@
class AddEnYoutubeUrlToCrops < ActiveRecord::Migration[7.2]
def change
add_column :crops, :en_youtube_url, :string
end
end

View File

@@ -0,0 +1,25 @@
# frozen_string_literal: true
class AddDescriptionToCrops < ActiveRecord::Migration[7.2]
# Temporary model to avoid validation issues
class Crop < ApplicationRecord
end
def up
add_column :crops, :description, :text
# Ensure the new column is available to the temporary model
Crop.reset_column_information
Crop.find_each do |crop|
next if crop.openfarm_data.blank?
description = crop.openfarm_data.dig('attributes', 'description')
crop.update_column(:description, description) if description.present?
end
end
def down
remove_column :crops, :description
end
end

View File

@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.2].define(version: 2025_09_01_144900) do
ActiveRecord::Schema[7.2].define(version: 2025_11_28_200506) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -259,6 +259,8 @@ ActiveRecord::Schema[7.2].define(version: 2025_09_01_144900) do
t.string "sowing_method"
t.string "sun_requirements"
t.integer "growing_degree_days"
t.string "en_youtube_url"
t.text "description"
t.index ["creator_id"], name: "index_crops_on_creator_id"
t.index ["name"], name: "index_crops_on_name"
t.index ["parent_id"], name: "index_crops_on_parent_id"
@@ -583,7 +585,6 @@ ActiveRecord::Schema[7.2].define(version: 2025_09_01_144900) do
t.integer "harvests_count", default: 0
t.integer "likes_count", default: 0
t.boolean "failed", default: false, null: false
t.boolean "from_other_source"
t.integer "overall_rating"
t.index ["crop_id"], name: "index_plantings_on_crop_id"
t.index ["garden_id"], name: "index_plantings_on_garden_id"

View File

@@ -101,7 +101,7 @@ describe CropsController do
it { expect { subject }.to change(AlternateName, :count).by(2) }
it { expect { subject }.to change(ScientificName, :count).by(1) }
context 'with openfarm data' do
context 'with data' do
let(:crop_params) do
{
crop: {
@@ -110,16 +110,18 @@ describe CropsController do
row_spacing: 10,
spread: 20,
height: 30,
description: 'hello',
sowing_method: 'direct',
sun_requirements: 'full sun',
growing_degree_days: 100
growing_degree_days: 100,
en_youtube_url: 'https://www.youtube.com/watch?v=INZybkX8tLI'
},
alt_name: { '1': "egg plant", '2': "purple apple" },
sci_name: { '1': "fancy sci name", '2': "" }
}
end
it 'saves openfarm data' do
it 'saves data' do
subject
crop = Crop.last
expect(crop.row_spacing).to eq(10)
@@ -128,6 +130,8 @@ describe CropsController do
expect(crop.sowing_method).to eq('direct')
expect(crop.sun_requirements).to eq('full sun')
expect(crop.growing_degree_days).to eq(100)
expect(crop.description).to eq 'hello'
expect(crop.en_youtube_url).to eq 'https://www.youtube.com/watch?v=INZybkX8tLI'
end
end
end

View File

@@ -544,6 +544,20 @@ describe Crop do
end
end
context "destroying a crop" do
let!(:crop_a) { FactoryBot.create(:crop) }
let!(:crop_b) { FactoryBot.create(:crop) }
before do
CropCompanion.create(crop_a: crop_a, crop_b: crop_b)
CropCompanion.create(crop_a: crop_b, crop_b: crop_a)
end
it "destroys companion links" do
expect { crop_a.destroy }.to change { CropCompanion.count }.from(2).to(0)
end
end
context "crop rejections" do
let!(:rejected_reason) do
FactoryBot.create(:crop, name: 'tomato',