Compare commits

...

938 Commits

Author SHA1 Message Date
Shiny
53eb171dfc Merge pull request #1317 from Growstuff/dev
release 22
2017-04-17 05:00:59 +00:00
deppbot
b0b6931678 Bundle Update on 2017-04-17 2017-04-17 03:45:39 +00:00
Daniel O'Connor
d515dba7f2 Merge pull request #1316 from Br3nda/garden-thumbnail
Garden thumbnail display cleanup
2017-04-16 15:50:52 +09:30
Shiny
4958330c9e Merge branch 'master' into dev 2017-04-16 02:42:38 +00:00
Brenda Wallace
17236a4a8a Garden thumbnail display cleanup 2017-04-16 13:48:22 +12:00
Daniel O'Connor
3ccab3f857 Merge pull request #1309 from Br3nda/fix_1305
Fix 1305
2017-04-15 17:11:02 +09:30
Daniel O'Connor
0201e873eb Merge branch 'dev' into fix_1305 2017-04-15 17:03:15 +09:30
Daniel O'Connor
20289e6566 Merge pull request #1310 from Br3nda/counter-caches
Adding counter caches
2017-04-15 17:01:20 +09:30
Shiny
85ded414ec Merge branch 'dev' into fix_1305 2017-04-15 06:50:16 +00:00
Shiny
299c95c5f5 Merge branch 'dev' into counter-caches 2017-04-14 07:40:19 +00:00
Taylor Griffin
8f51090098 make mentionbot settings file 2017-04-14 07:40:01 +00:00
deppbot
5551eeba24 Bundle Update on 2017-04-14 2017-04-14 07:10:10 +00:00
Shiny
7a5a68f511 Merge branch 'dev' into counter-caches 2017-04-14 01:44:44 +00:00
Shiny
6d4ec9ad34 Merge branch 'dev' into fix_1305 2017-04-14 01:44:35 +00:00
Brenda Wallace
fffef75813 Ignore ConsecutiveComments and IdNames in haml for now 2017-04-14 01:43:42 +00:00
Brenda Wallace
0e2d7b4393 Allow instance variables in partials for now 2017-04-14 01:43:42 +00:00
Brenda Wallace
f08068c289 Upgrade haml_lint 2017-04-14 01:43:42 +00:00
deppbot
ff653934ad Bundle Update on 2017-04-08 2017-04-14 01:43:42 +00:00
Brenda Wallace
c4bed2cf4d Merge branch 'haml-lint-fix' into counter-caches 2017-04-14 11:42:02 +12:00
Brenda Wallace
47c0f74f81 Ignore ConsecutiveComments and IdNames in haml for now 2017-04-14 11:40:52 +12:00
Brenda Wallace
171e34914b Allow instance variables in partials for now 2017-04-14 11:40:46 +12:00
Brenda Wallace
8010a8b56c Upgrade haml_lint 2017-04-14 11:40:40 +12:00
Brenda Wallace
ac165ce0cd Adding counter caches 2017-04-14 11:32:31 +12:00
Brenda Wallace
4925fde28f Ignore ConsecutiveComments and IdNames in haml for now 2017-04-14 09:43:16 +12:00
Brenda Wallace
6580cf38b0 Allow instance variables in partials for now 2017-04-13 23:02:16 +12:00
Brenda Wallace
fdf10202ba Upgrade haml_lint 2017-04-13 22:56:07 +12:00
Brenda Wallace
85a368999b we love rubocop 2017-04-13 14:30:51 +12:00
Daniel O'Connor
6ba4b4560e Fix #1305 by adding aggregation
Expand test coverage
member_id is owner_id on plantings
Argue with ActionView::Template::Error about what we can group on

Rename variable
2017-04-13 14:30:41 +12:00
Cesy
71aedb136a Merge pull request #1300 from Growstuff/bundle-update-2017-04-02-131809
Bundle Update on 2017-04-02
2017-04-08 15:06:16 +01:00
Shiny
65c988790b Merge branch 'dev' into bundle-update-2017-04-02-131809 2017-04-06 08:04:46 +12:00
Brenda Wallace
0372d3b9b0 Removing pre-commit.sh script 2017-04-06 08:04:09 +12:00
Shiny
3272ea1ca5 Merge branch 'dev' into bundle-update-2017-04-02-131809 2017-04-06 07:51:19 +12:00
Shiny
39b461c348 Merge pull request #1243 from Growstuff/dev
Release 21
2017-04-06 07:49:08 +12:00
pozorvlak
a8f7031447 Merge pull request #1303 from Br3nda/disable-eslint
Disable eslint

Fixes #1302, at least temporarily.
2017-04-05 11:15:10 +01:00
Shiny
17967b7c72 Merge branch 'dev' into disable-eslint 2017-04-04 09:07:02 +12:00
Brenda Wallace
e422c8b072 Disable eslint 2017-04-03 21:05:35 +00:00
Cesy
5392d7d900 Merge branch 'dev' into bundle-update-2017-04-02-131809 2017-04-03 08:47:32 +01:00
Cesy
d42bbe7fa3 Merge pull request #1299 from Br3nda/gemfile-ruby-bump
Gemfile.lock bumping ruby version to match other files
2017-04-03 08:46:19 +01:00
deppbot
45f2abeab5 Bundle Update on 2017-04-02 2017-04-02 13:18:11 +08:00
Brenda Wallace
7e754b8293 Gemfile.lock bumping ruby version to match other files 2017-04-01 15:19:18 +13:00
pozorvlak
1dcd84009a Merge pull request #1298 from CloCkWeRX/ruby_234
Ruby 2.3.4
2017-03-31 14:07:36 +01:00
Daniel O'Connor
8615df264e Ruby 2.3.4 2017-03-31 16:29:21 +10:00
Daniel O'Connor
4e400cc899 Merge pull request #1295 from Growstuff/bundle-update-2017-03-30-121732
Bundle Update on 2017-03-30
2017-03-31 16:27:43 +10:00
Daniel O'Connor
3cead5fb6b Pin to earlier rubocop 2017-03-31 16:15:55 +10:00
Shiny
1decf6ea11 Merge branch 'dev' into bundle-update-2017-03-30-121732 2017-03-30 21:37:57 +13:00
Harry Brodsky
23c0f901c6 Add name to CONTRIBUTORS.md 2017-03-30 19:15:48 +13:00
Harry Brodsky
78f4b3dbf3 Update irregular crop pluralizations 2017-03-30 19:15:48 +13:00
deppbot
9340b8d7e5 Bundle Update on 2017-03-30 2017-03-30 12:17:33 +08:00
pozorvlak
0094473bbe Merge pull request #1287 from Br3nda/bw/readme-new-contributors
Readme update for new contributors - force-merging because it only touches README.md.
2017-03-28 23:56:37 +01:00
pozorvlak
743f482818 Merge pull request #1292 from Br3nda/query-optimising
Query optimising
2017-03-28 23:55:05 +01:00
Brenda Wallace
b8ea6116d4 Add photos to plantings to make them interesting in the spec 2017-03-29 10:46:15 +13:00
Brenda Wallace
2521e52d71 Remove test called to Planting.interesting(...)
Interesting plantings with no photos is not used in the code.
The method was converted to a scope.
2017-03-29 08:28:58 +13:00
Brenda Wallace
d44f9ef4e9 Removed assignment of useless variable 2017-03-29 08:21:34 +13:00
Brenda Wallace
63cee1edc9 Back to reading @garden.plantings 2017-03-29 08:21:02 +13:00
Brenda Wallace
3791b34fe3 One planting per owner (used for intersetingness) 2017-03-28 22:39:03 +13:00
Brenda Wallace
5d58be110e Fixed crop.interesting, no more duplicate crops 2017-03-28 19:33:34 +13:00
Brenda Wallace
911593b480 Reduces query numbes on gardens#show 2017-03-24 21:10:45 +13:00
Shiny
b72a3d6942 Merge branch 'dev' into query-optimising 2017-03-24 18:31:18 +13:00
Brenda Wallace
804ac8662a Rubocop fix ups 2017-03-24 17:29:39 +13:00
Brenda Wallace
1601e966ad Planting.interesting is in a scope 2017-03-24 16:59:09 +13:00
Brenda Wallace
e7553868f2 Removed variables on homes controller
following the comment there
2017-03-24 16:57:51 +13:00
Brenda Wallace
5e8ca392d2 Moved Member.interest near top of file 2017-03-24 16:45:55 +13:00
Brenda Wallace
815915d933 Loading child records of interesting crops 2017-03-24 16:45:36 +13:00
Brenda Wallace
6223076dae Pull in interesting members data in controller 2017-03-24 16:30:56 +13:00
Brenda Wallace
0182a99654 Optimising Member.interesting 2017-03-24 16:28:37 +13:00
Brenda Wallace
5baa357bb3 Use bullet to find queries to optomise 2017-03-24 16:07:05 +13:00
deppbot
0fb4d74685 Bundle Update on 2017-03-24 2017-03-24 09:24:40 +13:00
Daniel O'Connor
eebaef6fde Merge branch 'dev' into bw/readme-new-contributors 2017-03-21 14:03:22 +10:30
Daniel O'Connor
59fc550f3c Merge pull request #1290 from Growstuff/bundle-update-2017-03-19-161121
Bundle Update on 2017-03-19
2017-03-20 14:15:06 +10:30
Shiny
64ffaab1ec Merge branch 'dev' into bundle-update-2017-03-19-161121 2017-03-20 10:01:48 +13:00
Cesy
21f53e362f Merge pull request #1279 from Br3nda/plantings-harvests
View harvests for a planting
2017-03-19 09:46:57 +00:00
deppbot
20cfa0c5b2 Bundle Update on 2017-03-19 2017-03-19 16:11:22 +08:00
Shiny
204633d533 Merge branch 'dev' into bw/readme-new-contributors 2017-03-18 14:21:43 +13:00
Shiny
c77ed8c6d0 Merge branch 'dev' into plantings-harvests 2017-03-17 08:18:56 +13:00
Shiny
fe7ae18e7b Merge pull request #1285 from Growstuff/add-contributor-megan
Added Megan to contributors
2017-03-17 08:13:03 +13:00
Shiny
8746cc67e2 Merge branch 'dev' into plantings-harvests 2017-03-17 08:11:33 +13:00
Shiny
f1feb59818 Merge branch 'dev' into add-contributor-megan 2017-03-17 08:10:32 +13:00
Shiny
bb62b11070 Merge branch 'dev' into bw/readme-new-contributors 2017-03-16 21:15:30 +13:00
deppbot
1660d54c01 Bundle Update on 2017-03-16 2017-03-16 21:15:11 +13:00
Shiny
cb7715b6d9 Merge branch 'dev' into bw/readme-new-contributors 2017-03-16 15:35:22 +13:00
Shiny
a60d0faedd Merge branch 'dev' into add-contributor-megan 2017-03-16 15:35:15 +13:00
Shiny
7f592579cd Merge branch 'dev' into plantings-harvests 2017-03-16 15:35:06 +13:00
Brenda Wallace
998befb30f Limited plantings to member's own garden, and approved crops 2017-03-16 15:29:25 +13:00
Shiny
ebbf6df87d Merge branch 'dev' into plantings-harvests 2017-03-16 14:59:54 +13:00
Shiny
40e4f8df8a Merge branch 'dev' into add-contributor-megan 2017-03-16 14:59:26 +13:00
Brenda Wallace
81d41398a2 Link to waffle from readme 2017-03-16 14:55:30 +13:00
Brenda Wallace
4f02f45ae8 Updated wiki link 2017-03-16 14:55:22 +13:00
Arun Kumar
f7ec1826b0 Use presence instead of regex validation 2017-03-16 13:27:13 +13:00
Shiny
d619cd160d Added Megan to contributors 2017-03-16 13:04:31 +13:00
Daniel O'Connor
4a20f68d3a Merge branch 'dev' into plantings-harvests 2017-03-16 09:40:56 +10:30
Daniel O'Connor
62d2b5e9fb Merge pull request #1273 from Br3nda/yaml-cleanup
Yaml file clean up
2017-03-16 09:39:33 +10:30
Daniel O'Connor
5935d2e73f Merge pull request #1276 from Br3nda/bw/install-linters
Install npm modules locally
2017-03-16 09:38:54 +10:30
Daniel O'Connor
92b8972b24 Merge pull request #1278 from Br3nda/bw/crop-model-dupe
Reduced duplication of the term "approved" in crop model
2017-03-16 09:37:24 +10:30
Daniel O'Connor
12254fe0ca Merge pull request #1275 from Br3nda/bw/discourse-removal
Removing references to Discourse (talk.growstuff.org)
2017-03-16 09:36:29 +10:30
Daniel O'Connor
ea54fca2b2 Merge pull request #1282 from Br3nda/gardens-order
Gardens order
2017-03-16 09:35:17 +10:30
Daniel O'Connor
d7db9007fd Merge pull request #1280 from Br3nda/public-error-pages
Update public error pages
2017-03-16 09:32:52 +10:30
Daniel O'Connor
c2acb8cf73 Merge pull request #1274 from Br3nda/fix-traxis-badge
Tie travis badge to a branch
2017-03-16 09:30:27 +10:30
Shiny
8d04d4b223 Merge branch 'dev' into plantings-harvests 2017-03-15 23:10:15 +13:00
Shiny
35d9c8e9f1 Merge branch 'dev' into bw/crop-model-dupe 2017-03-15 23:09:31 +13:00
Shiny
b23118a9db Merge branch 'dev' into public-error-pages 2017-03-15 23:09:21 +13:00
Shiny
5585dbada1 Merge branch 'dev' into gardens-order 2017-03-15 23:09:09 +13:00
Thomas Countz
fa49234669 remove "add new garden" on other member's page (#1283)
* update garden#show view logic
* added name to contributors
Closes #1167
2017-03-15 23:06:32 +13:00
Shiny
8833571ab3 Merge branch 'dev' into bw/discourse-removal 2017-03-14 16:21:44 +13:00
Shiny
a54e66f2fd Merge branch 'dev' into bw/install-linters 2017-03-12 22:56:11 +13:00
Shiny
7913f85cf4 Merge branch 'dev' into yaml-cleanup 2017-03-12 22:55:11 +13:00
Shiny
bf46c0a6d2 Merge branch 'dev' into bw/crop-model-dupe 2017-03-12 22:54:32 +13:00
Shiny
082bdb035f Merge branch 'dev' into plantings-harvests 2017-03-12 22:54:17 +13:00
Shiny
15bedb1659 Merge branch 'dev' into public-error-pages 2017-03-12 22:54:03 +13:00
Shiny
5995812215 Merge branch 'dev' into gardens-order 2017-03-12 22:53:34 +13:00
Brenda Wallace
195d1bbdbb order gardens by recently updated 2017-03-12 20:12:28 +13:00
deppbot
55e0579384 Bundle Update on 2017-03-12 2017-03-12 18:50:42 +13:00
Megan Talbot
d167a427b9 Update public error pages
Author:    Megan Talbot <meganftalbot@gmail.com>
Date:      Wed Mar 1 15:55:30 2017 -0700
2017-03-12 14:46:40 +13:00
Brenda Wallace
c89c20e842 View harvests for a planting 2017-03-12 14:44:11 +13:00
Shiny
ad04a48c8f Merge branch 'dev' into bw/discourse-removal 2017-03-12 13:56:04 +13:00
Shiny
d3a47b3dc6 Merge branch 'dev' into fix-traxis-badge 2017-03-12 12:49:22 +13:00
Brenda Wallace
02de30f617 Reduced duplication of the term "approved" in crop model 2017-03-12 12:31:38 +13:00
Shiny
a4360a0fa5 Merge branch 'dev' into yaml-cleanup 2017-03-12 11:44:21 +13:00
Brenda Wallace
39d4dec294 Npm sourced linters in package.json 2017-03-12 11:26:50 +13:00
Brenda Wallace
4c189b4d56 Lock haml_lint to 0.20.0 and update other gems 2017-03-12 10:53:55 +13:00
Brenda Wallace
8267b7d16d Removing references to Discource (talk.growstuff.org)
and adding one link to github issues.
2017-03-12 10:51:25 +13:00
Brenda Wallace
bf9f86d516 Tie travis badge to a branch
Instead of showing the most recent buid (on any branch),
show the dev branch.
2017-03-12 10:42:17 +13:00
Brenda Wallace
a93c4e9fb8 Yaml file clean up 2017-03-12 10:38:39 +13:00
deppbot
3243716d13 Bundle Update on 2017-03-06 2017-03-08 10:41:52 +13:00
Cesy
685418507b Merge pull request #1266 from Br3nda/spec-fixups
bugfix in some spec expectations
2017-03-05 08:32:09 +00:00
Shiny
418c5fdcd0 Merge branch 'dev' into spec-fixups 2017-03-05 21:11:06 +13:00
Brenda Wallace
322f28eaa6 bugfix in some spec expectations 2017-03-05 00:36:10 +13:00
Cesy
7a06ab0b61 Merge pull request #1264 from Br3nda/js-clean
Added missing semicolons to js files
2017-03-04 11:07:19 +00:00
Shiny
a5dda8ab9b Merge branch 'dev' into js-clean 2017-03-04 23:58:04 +13:00
Cesy
54b5c139f3 Merge pull request #1263 from Br3nda/bundle-audit-update
Bundle audit needs updating in test runs
2017-03-04 10:34:39 +00:00
Shiny
864990dc8a Merge branch 'dev' into js-clean 2017-03-04 17:09:01 +13:00
Brenda Wallace
1e0ccd72a2 Added missing semicolons to js files 2017-03-04 17:06:29 +13:00
Shiny
513a8924d8 Merge branch 'dev' into bundle-audit-update 2017-03-04 16:52:19 +13:00
Brenda Wallace
478d68ee25 Bundle audit needs updating 2017-03-04 16:45:43 +13:00
deppbot
175780aa06 Bundle Update on 2017-03-03 2017-03-04 16:33:18 +13:00
Miles Gould
c9558be2d3 Add deppbot to CONTRIBUTORS.md
This prevents deppbot-generated pull requests from failing the "are you
in CONTRIBUTORS.md?" check in CI.
2017-03-04 16:16:28 +13:00
Miles Gould
f1d3a70bbd Install git-guilt linter 2017-03-03 14:25:03 +13:00
Miles Gould
d3dd6f88f2 Fix typo in CONTRIBUTING.md 2017-03-03 14:25:03 +13:00
Brenda Wallace
882d641683 Photo changes expire homepage too 2017-03-03 08:49:24 +13:00
pozorvlak
a53f6073a6 Merge pull request #1253 from Br3nda/rubocop-progress
Rubocop progress
2017-03-02 17:45:39 +00:00
pozorvlak
7c7020f50a Merge branch 'dev' into rubocop-progress 2017-03-02 14:31:39 +00:00
pozorvlak
41b3c0f4fc Merge pull request #1254 from Br3nda/bw/unneeded-percent-q
Rubocop fix for unneeded %Q
2017-03-02 14:29:05 +00:00
pozorvlak
314087321c Merge branch 'dev' into bw/unneeded-percent-q 2017-03-02 13:41:01 +00:00
pozorvlak
c67067acaf Merge pull request #1247 from Br3nda/overcommit
Run the linters etc from overcommit
2017-03-02 13:11:19 +00:00
Shiny
d23be43c2f Merge branch 'dev' into overcommit 2017-03-02 22:24:18 +13:00
Brenda Wallace
6c282ffbd7 rubocop fix for redundant self assignment 2017-03-02 22:21:15 +13:00
Brenda Wallace
0ecc65bbe0 rubocop fix for redundant self 2017-03-02 22:21:15 +13:00
Brenda Wallace
076da040b5 Revert "Intentionally making rubocop fail"
This reverts commit 17858cc17c.
2017-03-02 21:53:20 +13:00
Brenda Wallace
17858cc17c Intentionally making rubocop fail 2017-03-02 21:50:48 +13:00
Brenda Wallace
66fec1f4a3 Adding yaml linter 2017-03-02 21:32:53 +13:00
Brenda Wallace
69848f11ca Docs on using overcommit 2017-03-02 21:22:22 +13:00
Brenda Wallace
affbe2a460 renamed ruby files to .rb
so rubocop cop catches these in her net
2017-03-02 21:13:35 +13:00
Brenda Wallace
cc40bb35fb bundle exec on the contributor check 2017-03-02 21:04:21 +13:00
Shiny
542cc1f546 Merge branch 'dev' into bw/unneeded-percent-q 2017-03-02 21:02:28 +13:00
Brenda Wallace
0d2fb25881 Removed gemfile check. overcommit can do this 2017-03-02 20:59:45 +13:00
Brenda Wallace
29f050d19f Removed check_conflicts. overcommit does this 2017-03-02 20:48:21 +13:00
Brenda Wallace
2238374080 Moved overcommit call into check_static 2017-03-02 20:47:18 +13:00
Brenda Wallace
cad8ecad8f Added bundle-audit 2017-03-02 20:40:25 +13:00
Brenda Wallace
d161053328 Always create db - so we can check rails schema is up to date 2017-03-02 20:19:22 +13:00
Brenda Wallace
dbb74c5675 Moved phantom verion output to script 2017-03-02 20:10:47 +13:00
Brenda Wallace
6422070f04 Moved linter installs to own script 2017-03-02 20:06:47 +13:00
Brenda Wallace
b6512ce8e4 RailsSchemaUpToDate and BundleAudit added to overcommit 2017-03-02 20:00:46 +13:00
Brenda Wallace
a3e0bc0798 Rubocop fix for Gemfile 2017-03-02 19:59:59 +13:00
Brenda Wallace
5ec70d1438 Moved merge conflict checking to overcommit 2017-03-02 19:54:18 +13:00
Brenda Wallace
e848e18574 Removed commented out overcommit linters 2017-03-02 19:49:49 +13:00
Brenda Wallace
cfff970812 Revert "Intentionally making rubocop unhappy"
This reverts commit 6e3f5f9d77fb4b3b81265665adea1e1b416469fe.
2017-03-01 20:48:15 +00:00
Brenda Wallace
0db8c2feb2 Intentionally making rubocop unhappy
to test travis
2017-03-01 20:48:15 +00:00
Brenda Wallace
7e06bf4fd0 Wrap shell script variables in "" 2017-03-01 20:48:15 +00:00
Brenda Wallace
dd710860de Run the linters etc from overcommit 2017-03-01 20:48:15 +00:00
pozorvlak
4718a9edab Merge pull request #1256 from Br3nda/numeric
Rubocop fix for some numerics
2017-03-01 13:31:10 +00:00
Brenda Wallace
8c5db9229a fixed forced octal 2017-03-01 17:49:42 +13:00
Brenda Wallace
e229438997 rubocop fox for numeric literals 2017-03-01 17:46:12 +13:00
Brenda Wallace
85a4490740 Rubocop fix for unneeded %Q 2017-03-01 17:35:06 +13:00
Brenda Wallace
9684e84420 Moved metrics to bottom of rubocop.yml
Waiting to be completed
2017-03-01 11:38:16 +13:00
Brenda Wallace
4364c028a2 Removed offense counts 2017-03-01 11:36:40 +13:00
Brenda Wallace
4e44e26c6c Removed rubocop todos that are done 2017-03-01 11:24:26 +13:00
Daniel O'Connor
b07c033863 Merge pull request #1249 from Growstuff/bundle-update-2017-02-28-091217
Bundle Update on 2017-02-28
2017-02-28 11:59:57 +10:30
deppbot
f167f5cbd4 Bundle Update on 2017-02-28 2017-02-28 09:12:18 +08:00
pozorvlak
7a1b192392 Merge pull request #1238 from CloCkWeRX/bundle-update-2017-02-23-1
Upgrade rails, other gems
2017-02-27 15:18:43 +00:00
pozorvlak
642f371416 Merge branch 'dev' into bundle-update-2017-02-23-1 2017-02-27 15:01:14 +00:00
pozorvlak
f4e2b6e115 Merge pull request #1244 from Br3nda/photos-controller
DRY the photos controller
2017-02-27 11:26:14 +00:00
Daniel O'Connor
1873d28b50 Merge branch 'dev' into bundle-update-2017-02-23-1 2017-02-27 16:08:50 +10:30
Brenda Wallace
ce03b4efde DRY the photos controller 2017-02-26 17:03:29 +13:00
Shiny
102c113b0c Merge branch 'master' into dev 2017-02-25 22:56:23 +13:00
Shiny
245cd2e44c Merge branch 'dev' into bundle-update-2017-02-23-1 2017-02-25 22:56:01 +13:00
Cesy
f28456875b Merge pull request #1242 from Br3nda/schema-update
Schema is out of sync -- fixing
2017-02-24 21:15:12 +00:00
Brenda Wallace
9604eed2f3 Schema is out of sync -- fixing 2017-02-24 20:19:01 +13:00
Brenda Wallace
4eda3a506b Fix up csv importer, should make duplicates
Now matches the old functionality.
2017-02-24 20:08:01 +13:00
Daniel O'Connor
14f3dc7526 Add explaining notes 2017-02-23 14:34:38 +10:30
Daniel O'Connor
f2d3c88c85 Revert "Upgrade to the 4.x series of d3-rails"
This reverts commit 5bd7d9aa43.
2017-02-23 14:33:33 +10:30
Daniel O'Connor
f4e0efc8da Update autoprefixer-rails 2017-02-23 14:32:47 +10:30
Daniel O'Connor
13bfdeaa1a Pin Kaminari for the moment, until https://github.com/kaminari/kaminari/blob/master/CHANGELOG.md#100 assessed 2017-02-23 14:31:47 +10:30
Daniel O'Connor
e2fb7c940f Upgrade js-routes 2017-02-23 14:30:10 +10:30
Daniel O'Connor
5bd7d9aa43 Upgrade to the 4.x series of d3-rails 2017-02-23 14:28:19 +10:30
Daniel O'Connor
117c717391 Upgrade capybara, codeclimate-test-reporter 2017-02-23 14:25:51 +10:30
Daniel O'Connor
72603a2db0 Pin to specific omniauth versions for the moment, to avoid login test regression 2017-02-23 14:24:29 +10:30
Daniel O'Connor
9f8cfa8de3 Update sexp_processor, ruby-units 2017-02-23 14:23:01 +10:30
Daniel O'Connor
221dd45681 Upgrade to d3 3.5 “Mount Sharp” 2017-02-23 14:19:33 +10:30
Daniel O'Connor
fb2a600433 Pin d3-rails for the moment 2017-02-23 14:18:31 +10:30
Daniel O'Connor
296f8dddfa Update selenium-webdriver, haml_lint, jasmine 2017-02-23 14:15:27 +10:30
Daniel O'Connor
da16a38d1f Upgrade rails 2017-02-23 14:12:27 +10:30
Brenda Wallace
5abc1fb80e duplicate alt name spec (and adding to crop) 2017-02-23 15:35:29 +13:00
Brenda Wallace
86d5f5febd sciname/altnames adding code is very similar 2017-02-23 15:35:29 +13:00
Brenda Wallace
0a840abc58 Added specs for duplicate sci names 2017-02-23 15:35:29 +13:00
Brenda Wallace
968e9bd3ad Rubocop fix up in spec 2017-02-23 15:35:29 +13:00
Brenda Wallace
ddd0e0c285 Fixed typo in string causing spec to fail 2017-02-23 15:35:29 +13:00
Brenda Wallace
00952d5ef6 Updating more specs for new csv importer interface 2017-02-23 15:35:29 +13:00
Brenda Wallace
a0e1d8b11d Update scientific name model spec 2017-02-23 15:35:29 +13:00
Brenda Wallace
3d7f2ec20c Updating specs to match new csv importer 2017-02-23 15:35:29 +13:00
Brenda Wallace
abbd2cf0a4 fix bug: look up parent crop by name in csv import 2017-02-23 15:35:29 +13:00
Brenda Wallace
2f9961651f Call new csv importer from specs 2017-02-23 15:35:29 +13:00
Brenda Wallace
3089c28233 Adding validations to sci names and alt names 2017-02-23 15:35:29 +13:00
Brenda Wallace
4e722dd123 Move crop csv import to own file 2017-02-23 15:35:29 +13:00
Brenda Wallace
5698a78d9b DRY the accounts controller 2017-02-23 09:45:57 +13:00
Daniel O'Connor
71804a0b41 Merge pull request #1235 from Br3nda/accounttypes-controller-DRY
DRY the account types controller
2017-02-22 11:03:00 +10:30
Brenda Wallace
d500c9093d DRY the account types controller 2017-02-22 13:21:59 +13:00
Shiny
9ff468aa50 Merge pull request #1228 from Growstuff/dev
Release 20
2017-02-22 09:21:01 +13:00
Shiny
4261f16cd0 Merge pull request #1133 from pozorvlak/test_runners
Refactor test-runners
2017-02-21 11:59:09 +13:00
Shiny
b8884beb2f Merge branch 'dev' into test_runners 2017-02-21 11:31:02 +13:00
pozorvlak
bc88c4d8c7 Merge pull request #1231 from Br3nda/seeds-controller
DRY seeds controller
2017-02-20 13:49:29 +00:00
pozorvlak
3ac4fbcdb8 Merge branch 'dev' into seeds-controller 2017-02-20 13:36:50 +00:00
pozorvlak
549426e3e0 Merge pull request #1230 from Br3nda/gardens-controller
DRY the gardens controller
2017-02-20 13:36:40 +00:00
pozorvlak
25a1f0da9a Merge branch 'dev' into gardens-controller 2017-02-20 13:11:18 +00:00
pozorvlak
3be2fc6241 Merge pull request #1229 from Br3nda/harvests-controller
DRY the Harvests controller
2017-02-20 13:11:04 +00:00
pozorvlak
837934167b Merge branch 'dev' into harvests-controller 2017-02-20 13:02:58 +00:00
pozorvlak
d43d8ae0e7 Merge pull request #1217 from Br3nda/MultilineMethodCallBraceLayout
Fix up to match rubocop's MultilineMethodCallBraceLayout recommendation
2017-02-20 12:46:17 +00:00
Brenda Wallace
035b2399ca DRY seeds controller 2017-02-20 20:54:06 +13:00
Brenda Wallace
1a3e976ba5 DRY the gardens controller 2017-02-20 02:36:51 +00:00
Brenda Wallace
d31739f86a Further code clarity on the harvest csv filename 2017-02-20 10:07:14 +13:00
Brenda Wallace
0f523381f0 DRY the harvest controller 2017-02-20 09:58:36 +13:00
Brenda Wallace
550848a513 ParenthesesAroundCondition fixup 2017-02-19 16:20:45 +13:00
Brenda Wallace
ae3752e021 DefWithParentheses fixup 2017-02-19 16:19:16 +13:00
Brenda Wallace
50624fb2cb Style/MultilineBlockLayout fix 2017-02-19 16:17:03 +13:00
Brenda Wallace
818466a142 MethodCallWithoutArgsParentheses fixup 2017-02-19 16:17:03 +13:00
Brenda Wallace
e184503caa Fix up to match rubocop's MultilineMethodCallBraceLayout recommendation 2017-02-19 16:17:03 +13:00
Brenda Wallace
d00f743c47 rubocop fix up on spec 2017-02-17 16:00:11 +13:00
pozorvlak
b19a991106 Merge pull request #1226 from Br3nda/scinames-controller
DRY scientific names controller
2017-02-16 23:00:29 +00:00
pozorvlak
88e019a19f Merge branch 'dev' into scinames-controller 2017-02-16 22:52:07 +00:00
pozorvlak
e954ba801b Merge pull request #1225 from Br3nda/comments-controller
DRY comments controller
2017-02-16 22:51:42 +00:00
Brenda Wallace
be23bfc419 DRY scientific names controller 2017-02-17 10:18:34 +13:00
Shiny
5e984ce04a Merge branch 'dev' into comments-controller 2017-02-17 09:57:29 +13:00
Brenda Wallace
d15eb32133 Added some utf8, kōrero mai (te reo māori) 2017-02-17 09:47:12 +13:00
Brenda Wallace
21f11a4d5d highest MethodLength is now 34 2017-02-17 09:26:30 +13:00
Brenda Wallace
ae398f1a63 Spec checks you can't change post id in comments#update 2017-02-17 09:20:15 +13:00
Brenda Wallace
cd3cee5d5f DRY comments controller and add more spec scenarios 2017-02-17 09:14:01 +13:00
Miles Gould
9030e5b978 Merge branch 'dev' into test_runners 2017-02-16 13:31:39 +00:00
Miles Gould
9d6ac9fd8b LINT ALL THE HAML!
.
.
.
lint *all* the HAML?
2017-02-16 13:30:20 +00:00
pozorvlak
403a8814e1 Merge pull request #1222 from Br3nda/forums-controller
Small clean ups on forums controller
2017-02-16 13:26:38 +00:00
Miles Gould
00c34ef30c Document test-running process in CONTRIBUTING.md 2017-02-16 13:25:59 +00:00
Miles Gould
738c0d4e08 Store spec failures, for rspec --only-failures
The list of failing tests is stored in tmp/examples.txt, which is
already gitignored.
2017-02-16 13:24:50 +00:00
Miles Gould
82e27f8a71 Delete reference to Discussion Forums wiki page
The wiki is dead, that page hasn't been preserved, and most of the
forums it described are dead too. Sic transit gloria mundi.
2017-02-16 13:07:56 +00:00
Miles Gould
fbc203ca0d Make Jasmine tests pass in CI
One test relied on reading the innerHTML attribute of an SVGElement
object; this worked in the browser, but not when run with
`rake jasmine:ci`. I've changed the test to use the `textContent`
attribute instead, which works in both places.
2017-02-16 13:01:40 +00:00
Miles Gould
c83bfc101e Allow console.log in Jasmine tests, for debugging 2017-02-16 13:00:34 +00:00
pozorvlak
22905235c1 Merge branch 'dev' into forums-controller 2017-02-16 12:41:20 +00:00
pozorvlak
4d3b94b7f0 Merge pull request #1216 from Br3nda/more-rubocop
Rubocop fix for MultilineHashBraceLayout
2017-02-16 12:41:10 +00:00
pozorvlak
9e19aae0ca Merge branch 'dev' into forums-controller 2017-02-16 12:33:55 +00:00
pozorvlak
d8c3f7ed34 Merge branch 'dev' into more-rubocop 2017-02-16 12:30:38 +00:00
pozorvlak
28a6cfe25c Merge pull request #1223 from Br3nda/posts-controller
DRY the posts controller
2017-02-16 12:28:47 +00:00
pozorvlak
630d539f7d Merge branch 'dev' into more-rubocop 2017-02-16 12:24:20 +00:00
Brenda Wallace
4704bd89f8 DRY the posts controller 2017-02-16 22:15:30 +13:00
Brenda Wallace
076695d349 Added name presence validation to forum 2017-02-16 21:52:28 +13:00
Brenda Wallace
3925a54340 DRY the forums controller 2017-02-16 21:52:07 +13:00
Brenda Wallace
6c566c56d8 removed unnecesary reloads of @forum 2017-02-16 20:16:13 +13:00
Daniel O'Connor
bcc89674d4 Upgrade to current Hashie 2017-02-16 17:18:44 +13:00
Shiny
e1dab634a2 Merge branch 'dev' into more-rubocop 2017-02-16 13:23:07 +13:00
Daniel O'Connor
e06e002282 Merge pull request #1218 from Br3nda/UnneededInterpolation
Fix up all UnneededInterpolation
2017-02-16 10:29:19 +10:30
Daniel O'Connor
23ed7f91ba Merge pull request #1220 from Br3nda/ReversibleMigration
Marked our one ReversibleMigration as okay
2017-02-16 10:29:02 +10:30
Daniel O'Connor
aa511aedb4 Merge pull request #1219 from Br3nda/TrailingCommas
Removed trailing commas
2017-02-16 10:28:43 +10:30
Brenda Wallace
2b03381a24 Removed trailing commas 2017-02-15 23:33:06 +00:00
Brenda Wallace
6017c4ba23 Marked our one ReversibleMigration as okay 2017-02-16 12:32:37 +13:00
Brenda Wallace
a46b8ebe76 Fix up all UnneededInterpolation 2017-02-16 12:26:47 +13:00
Brenda Wallace
a4f8b3a0e6 Rubocop fix for MultilineHashBraceLayout 2017-02-16 12:20:32 +13:00
Daniel O'Connor
1b8c413b90 Merge pull request #1215 from Br3nda/likeable-dry
Likeable even more dry
2017-02-14 10:27:51 +10:30
Shiny
7a334abf1d Merge branch 'dev' into likeable-dry 2017-02-14 12:40:05 +13:00
pozorvlak
5c067c87b8 Merge pull request #1201 from Br3nda/bw/harvest-planting-link
Linking existing harvests to a planting
2017-02-13 23:02:04 +00:00
Brenda Wallace
87bc1becb0 Reduced repeating code in likes controller 2017-02-14 11:52:20 +13:00
pozorvlak
7c0d6c04df Merge branch 'dev' into bw/harvest-planting-link 2017-02-13 22:39:15 +00:00
pozorvlak
01415fd04f Merge pull request #1214 from Br3nda/authentication-scoping
User can only sign out their own session
2017-02-13 22:38:40 +00:00
pozorvlak
e0def646ce Merge branch 'dev' into authentication-scoping 2017-02-13 22:22:47 +00:00
pozorvlak
a52731dc4b Merge pull request #1198 from Br3nda/bw/grand-haml-cleanup-of-2017
All the haml clean up
2017-02-13 22:20:16 +00:00
Shiny
cd2500c99a Merge branch 'dev' into bw/harvest-planting-link 2017-02-14 00:19:28 +13:00
Shiny
c9a197bc61 Merge branch 'dev' into bw/grand-haml-cleanup-of-2017 2017-02-14 00:18:53 +13:00
Mackenzie Morgan
c5439c8650 use symbols for status codes 2017-02-13 20:56:22 +13:00
Brenda Wallace
6d0a7ebc8f Only show plantings with overlapping date ranges on harvest options 2017-02-13 20:41:43 +13:00
Brenda Wallace
0d1bab04d5 don't load the record again 2017-02-13 20:28:29 +13:00
Brenda Wallace
e6b23262da User can only sign out their own session 2017-02-13 20:08:31 +13:00
Brenda Wallace
06ea3db252 Use .field to format planting options on harvests 2017-02-13 17:30:41 +13:00
Brenda Wallace
8d24ffbffb spec for harvesting from a planting 2017-02-13 17:21:11 +13:00
Brenda Wallace
cce9f513db Linking existing harvests to a planting 2017-02-13 17:21:11 +13:00
Brenda Wallace
c37ba9f041 Use @harvest.planting, instead of @planting 2017-02-13 17:21:11 +13:00
Shiny
f8c56cc217 Merge branch 'dev' into bw/grand-haml-cleanup-of-2017 2017-02-13 17:19:58 +13:00
Daniel O'Connor
d11e6f484a Pin leaflet-rails for the moment, until we fix tests 2017-02-13 17:19:40 +13:00
Daniel O'Connor
9218a03e2b Upgrade only geocoder 2017-02-13 17:19:40 +13:00
Daniel O'Connor
da760a8a4c Revert "Update geocoder, leaflet-rails"
This reverts commit ecd2bb1c01.
2017-02-13 17:19:40 +13:00
Daniel O'Connor
9ccecf0e04 Update i18n-tasks bootstrap_form font-awesome-sass 2017-02-13 17:19:40 +13:00
Daniel O'Connor
5ec105ad19 Upgrade sidekiq 2017-02-13 17:19:40 +13:00
Daniel O'Connor
5c1f5f4312 Update poltergeist 2017-02-13 17:19:40 +13:00
Daniel O'Connor
48d3a64e7b Update cancancan 2017-02-13 17:19:40 +13:00
Daniel O'Connor
decd48a970 Update geocoder, leaflet-rails 2017-02-13 17:19:40 +13:00
Daniel O'Connor
540ac7b034 Update warden 2017-02-13 17:19:40 +13:00
Daniel O'Connor
8112133cf2 Update unicorn 2017-02-13 17:19:40 +13:00
Daniel O'Connor
55f00ed0f8 Update newrelic 2017-02-13 17:19:40 +13:00
Daniel O'Connor
d0999c2f9a Update activemerchant 2017-02-13 17:19:40 +13:00
Daniel O'Connor
47150a8ad8 Update selenium-webdriver 2017-02-13 17:19:40 +13:00
Daniel O'Connor
9301688763 Update guard 2017-02-13 17:19:40 +13:00
Daniel O'Connor
248b89a564 Update elasticsearch 2017-02-13 17:19:40 +13:00
Daniel O'Connor
8e9ffac64e Pin to hashie 3.4.* for https://github.com/intridea/hashie/issues/408 2017-02-13 17:19:40 +13:00
Brenda Wallace
65024d8f83 Moved hash in haml onto one line, for clarity and glory 2017-02-12 20:41:25 +00:00
Shiny
8ab70a1c1c Merge branch 'dev' into bw/grand-haml-cleanup-of-2017 2017-02-13 08:04:41 +13:00
Brenda Wallace
2c871abd03 don't allow owner in params 2017-02-13 07:41:53 +13:00
Brenda Wallace
8b4491d0ab Tabulation on wrapped form_for 2017-02-13 07:38:26 +13:00
Brenda Wallace
93202fc13c haml clean up for devise views 2017-02-13 07:34:41 +13:00
Brenda Wallace
0f520c0928 More haml clean up for home views 2017-02-13 07:34:31 +13:00
Brenda Wallace
21c989989c add missing new line at end of haml file 2017-02-13 07:34:13 +13:00
Brenda Wallace
123c34b6d1 Haml cleanup for layout 2017-02-13 07:33:48 +13:00
Brenda Wallace
f5e786401d fixed typo 2017-02-13 07:32:43 +13:00
Brenda Wallace
6ecb919f34 haml clean ups for members views 2017-02-13 07:32:43 +13:00
Brenda Wallace
c89d1ae94e Haml clean ups for plantings views 2017-02-13 07:32:43 +13:00
Brenda Wallace
9b7a7d3e8f Haml clean up for product views 2017-02-13 07:32:43 +13:00
Brenda Wallace
9ebe830402 Haml clean up for scientific names views 2017-02-13 07:32:43 +13:00
Brenda Wallace
9a0adadc9a Haml clean up for seeds views 2017-02-13 07:32:43 +13:00
Brenda Wallace
92c3976f0a Haml clean up for shared views 2017-02-13 07:32:43 +13:00
Brenda Wallace
01c25df8cf haml-lint all views 2017-02-13 07:32:43 +13:00
pozorvlak
9ae35ca6eb Merge pull request #1200 from Br3nda/bw/planting_slug
Simplified logic in planting.planting_slug
2017-02-12 15:46:22 +00:00
pozorvlak
43f9707c11 Merge branch 'dev' into bw/planting_slug 2017-02-12 15:21:41 +00:00
Mackenzie
4fa423bcab Merge pull request #1205 from Br3nda/dry-notifications
DRY for the notifications controller
2017-02-12 10:21:31 -05:00
Mackenzie
97d0bb6752 Merge pull request #1207 from Br3nda/DRY-plantparts
DRY the plant parts controller
2017-02-12 10:20:30 -05:00
Mackenzie
b9edd2f89b Merge pull request #1203 from Br3nda/access
Added cancan ability for likes (and DRY-ed)
2017-02-12 10:20:03 -05:00
pozorvlak
4bd50ca433 Merge branch 'dev' into bw/planting_slug 2017-02-12 15:19:55 +00:00
pozorvlak
a2dd675717 Merge pull request #1199 from Br3nda/time-zones
Use timezone when creating dates
2017-02-12 15:19:38 +00:00
Brenda Wallace
1275aa0102 DRY the plant parts controller 2017-02-12 22:58:17 +13:00
Brenda Wallace
f40ff18949 You can only reply to messages that were sent to you. 2017-02-12 22:15:50 +13:00
Brenda Wallace
f25d4dbf8c DRY for the notifications controller 2017-02-12 21:52:22 +13:00
Brenda Wallace
4dd99f54db Removed deprecation notice from controller spec 2017-02-12 20:55:06 +13:00
Brenda Wallace
b8e06a1d1d Specs for deleting someone else's like 2017-02-12 20:50:50 +13:00
Brenda Wallace
f7b8113af1 Fixed spec, now requests json response 2017-02-12 20:36:24 +13:00
Brenda Wallace
b0394d1028 checks json returned by likes controller 2017-02-12 17:42:24 +13:00
Brenda Wallace
fa0c00aa9c Named arg (liked_by_member) fixed
cos i was writing python when this is meant to be ruby
2017-02-12 17:37:32 +13:00
Brenda Wallace
a507eb47bf Removed trailing white space 2017-02-12 17:26:34 +13:00
Brenda Wallace
865f323f97 controller specs for likes controller 2017-02-12 15:35:15 +13:00
Brenda Wallace
c82f47bdda Pass the ID from link to likesdestroy 2017-02-12 15:34:28 +13:00
Brenda Wallace
72d0514e75 Further checks in likes controller 2017-02-12 15:33:54 +13:00
Brenda Wallace
dc62365c7d DRY likes controller further 2017-02-12 15:23:58 +13:00
Brenda Wallace
d8d94d178c Moved some of likes#destroy out to new methods 2017-02-12 15:23:58 +13:00
Brenda Wallace
6afb12c157 Split up big methods in like controller 2017-02-12 15:23:58 +13:00
Brenda Wallace
a0be52fdaa likes doesn't have an index 2017-02-12 15:23:58 +13:00
Brenda Wallace
6b8474e01b Checks for cancan ability before allowing like 2017-02-12 15:23:58 +13:00
Shiny
23ae7fcd8c Merge branch 'dev' into time-zones 2017-02-12 12:14:01 +13:00
Shiny
179cfbf6bc Merge branch 'dev' into bw/planting_slug 2017-02-12 12:13:37 +13:00
Mackenzie
b5f82a8fc8 Merge pull request #1202 from Br3nda/code-climate-knows
Simplified alternate names controller.
2017-02-11 11:06:30 -05:00
Brenda Wallace
54c01cbd82 Removing alternate names from rubocop todo 2017-02-11 19:48:16 +13:00
Brenda Wallace
cf9e5a6652 Adding alternate names to admin menu 2017-02-11 19:45:53 +13:00
Brenda Wallace
01c6a6da9f improvements to alternate names controller 2017-02-11 19:45:33 +13:00
Shiny
cc1daf8f6b Join slug with - 2017-02-10 23:54:16 +13:00
Shiny
a0bf815663 Downcase planting slug 2017-02-10 23:52:10 +13:00
Brenda Wallace
ce573c1e55 Simplified logic in planting.planting_slug 2017-02-10 22:41:28 +13:00
Brenda Wallace
be2426c99f Use timezone when creating dates 2017-02-10 21:53:18 +13:00
Shiny
7ca314c2f2 Merge pull request #1191 from Growstuff/dev
Release 19
2017-02-10 09:24:00 +13:00
Mackenzie
36768cf384 Merge pull request #1194 from Br3nda/bw/grand-haml-cleanup-of-2017
More haml clean up
2017-02-08 22:46:34 -05:00
Mackenzie
e35d0455bd Merge pull request #1196 from Br3nda/spammer-begone
stripping html from markdown
2017-02-08 22:43:51 -05:00
Brenda Wallace
c8405830c7 Added strip_tags before processing markdown 2017-02-09 03:29:18 +00:00
Shiny
6bc9f775c2 Merge branch 'dev' into bw/grand-haml-cleanup-of-2017 2017-02-09 10:23:01 +13:00
Mackenzie
a43526776b Merge pull request #1195 from Br3nda/bw/spammer-injection-begone
Truncate, escape, and DRY og:description fields
2017-02-07 16:00:32 -05:00
Brenda Wallace
6f74566d47 Truncate, escape, and DRY og:description fields 2017-02-08 09:49:19 +13:00
Brenda Wallace
82ce6c8222 Haml clean up for seeds views 2017-02-08 08:52:46 +13:00
Brenda Wallace
f96f459595 Moved title logic into application helper
For harvests, plantings, and seeds
2017-02-08 07:25:59 +13:00
Brenda Wallace
096146cb84 Fix: @owner -> owner in harvests_title 2017-02-08 07:25:59 +13:00
Brenda Wallace
ba1c40702b DRY up gardens and plantings helper 2017-02-08 07:25:59 +13:00
Brenda Wallace
e6254da3f1 Haml clean up for Roles views 2017-02-08 07:25:59 +13:00
Brenda Wallace
acbb610e05 Haml clean up for posts views 2017-02-08 07:25:59 +13:00
Brenda Wallace
338265d9e9 Haml cleanup for plantings views 2017-02-08 07:25:59 +13:00
Brenda Wallace
706922cacf Haml clean up for plantparts views 2017-02-08 07:25:59 +13:00
Brenda Wallace
08f2877f8e Haml clean up for places views 2017-02-08 07:25:59 +13:00
Brenda Wallace
8275f5be96 Add photos to travis haml check 2017-02-08 07:25:59 +13:00
Brenda Wallace
2c3d1848d5 Haml clean up for photos 2017-02-08 07:25:59 +13:00
Brenda Wallace
17e88778c8 Haml clean up for orders 2017-02-08 07:25:59 +13:00
Brenda Wallace
bafb0123da Haml cleanup for notifier 2017-02-08 07:25:59 +13:00
Brenda Wallace
e1e9c32652 Moved havests#index title to a helper 2017-02-08 07:25:59 +13:00
Brenda Wallace
48c3cbb3d1 Change to hash attributes syntax in harvests#show 2017-02-08 07:25:59 +13:00
Brenda Wallace
740b8587f2 Moved complex parts of garden/nav into helper 2017-02-08 07:25:59 +13:00
Brenda Wallace
b113146aaa Add harvest and gardens to travis for haml-lint 2017-02-08 07:25:59 +13:00
Brenda Wallace
900de8a615 Fixed Read more link in harvests 2017-02-08 07:25:59 +13:00
Brenda Wallace
d73aa98309 Cleaned up most of Home's haml 2017-02-08 07:25:59 +13:00
Brenda Wallace
ac7d44cb72 Cleaned up most of harvest's haml 2017-02-08 07:25:59 +13:00
Miles Gould
d301f2f2ae Add static check for files with merge conflicts
Fixes #1146
2017-02-07 15:03:52 +00:00
Miles Gould
2accb727e5 Describe rake static 2017-02-07 14:38:04 +00:00
Miles Gould
16db285898 Only run ES tests under GROWSTUFF_ELASTICSEARCH
And vice-versa: only run non-ElasticSearch tests under
GROWSTUFF_ELASTICSEARCH=false
2017-02-07 14:27:14 +00:00
Miles Gould
b8c0882642 Tag ElasticSearch-related tests 2017-02-07 14:27:14 +00:00
Miles Gould
cc54dc54b4 Only build ElasticSearch index for ES tests 2017-02-07 14:27:14 +00:00
Miles Gould
3f8ebdc477 Run JavaScript unit tests from Travis
`rspec spec` doesn't run the Jasmine tests, annoyingly, so I've added a
call to `rake jasmine:ci`.
2017-02-07 14:27:14 +00:00
Miles Gould
68120c5bbe Make rake spec depend on rake assets:precompile 2017-02-07 14:27:14 +00:00
Miles Gould
71ec9fd2d3 Run JS tests from rake and rake spec:unit 2017-02-07 14:27:14 +00:00
Miles Gould
f11bc42507 Turn on asset compilation in test
This is required for running jasmine tests via `rake spec:javascript`.
The comment above this setting warned that it would slow down testing
considerably; in my quick tests the slowdown is only about 2% (3mins 14
vs 3mins 11). We precompile assets in Travis, so this *shouldn't* cause
any more random CI failures...
2017-02-07 14:27:14 +00:00
Miles Gould
7672b9ffc8 Add spec:unit Rake task 2017-02-07 14:27:14 +00:00
Miles Gould
8d237cc2ee Make rake run specs and static checks by default 2017-02-07 14:27:14 +00:00
Miles Gould
a875a7c883 Cache asset-pipeline cache in Travis
This should shave about 30s off each job.
2017-02-07 14:27:14 +00:00
Miles Gould
19d65587be Split static checks into a separate Travis job 2017-02-07 14:27:14 +00:00
Miles Gould
3fed962dcc Add script/check_static to run all static checks
...and invoke it from .travis.yml
2017-02-07 14:27:14 +00:00
Miles Gould
987f50c87e Factor out global env vars in .travis.yml
This should make it slightly more obvious which job is which when
looking at Travis build results.
2017-02-07 13:52:23 +00:00
Daniel O'Connor
bba057ec76 Merge pull request #1192 from Br3nda/bw/three-pending-specs
Filled in the 3 pending planting specs
2017-02-07 16:36:59 +10:30
Brenda Wallace
1dc44c9edc Filled in the 3 pending planting specs 2017-02-07 18:29:10 +13:00
Daniel O'Connor
92c1515381 Merge pull request #1186 from CloCkWeRX/fix_date_expectation
Fix #1182 and improve test coverage
2017-02-07 14:02:31 +10:30
Shiny
43f905ea25 Merge branch 'dev' into fix_date_expectation 2017-02-07 16:03:39 +13:00
Brenda Wallace
1db30d98ce Haml clean up for members 2017-02-07 15:35:34 +13:00
Shiny
2b92f013fc Merge branch 'dev' into fix_date_expectation 2017-02-07 14:34:41 +13:00
Brenda Wallace
23f8c24ef4 Haml clean up for notifications 2017-02-07 14:33:20 +13:00
Daniel O'Connor
fba2306a4d Merge pull request #1190 from Br3nda/bw/haml-shop
Haml clean for shop
2017-02-07 11:15:26 +10:30
Brenda Wallace
c8fa54591a Haml clean for shop 2017-02-07 07:53:34 +13:00
Daniel O'Connor
67b496fe44 Merge pull request #1185 from Br3nda/bw/grand-haml-cleanup-of-2017
Forums and Gardens haml clean up
2017-02-06 14:13:27 +10:30
Daniel O'Connor
b24514fa82 Look at right attribute 2017-02-06 14:11:44 +10:30
Daniel O'Connor
f0a81d4100 Fix #1182 and improve test coverage 2017-02-06 14:10:40 +10:30
Brenda Wallace
64f11793c9 Fixed typo in link 2017-02-06 16:31:57 +13:00
Brenda Wallace
05a9d498a7 More forums haml clean up 2017-02-06 14:50:49 +13:00
Brenda Wallace
16145599ce Haml clean up for (most) garden views 2017-02-06 14:46:19 +13:00
Brenda Wallace
af8527aa5b Haml clean up of forum views 2017-02-06 14:46:19 +13:00
Daniel O'Connor
f9eb70e2eb Merge pull request #1184 from Br3nda/bw/grand-haml-cleanup-of-2017
Haml clean up -- crops views
2017-02-06 11:47:47 +10:30
Brenda Wallace
8408fdc845 Moved popular plant plarts calculation into sql 2017-02-06 13:22:18 +13:00
Brenda Wallace
f37c9152af Simplified the "grown for" view 2017-02-06 11:21:33 +13:00
Brenda Wallace
4ee789ca06 Popular plant parts are now sorted by popularity 2017-02-06 10:59:40 +13:00
Brenda Wallace
43e4ed43cd Travis starts checking the haml that's cleaned up
To stop regressions to bad haml again
2017-02-06 10:46:49 +13:00
Brenda Wallace
80371c835c Moved long line (ebay url) to helper 2017-02-06 10:40:58 +13:00
Brenda Wallace
6478d9cb1b Haml clean up for crops views 2017-02-06 10:31:45 +13:00
pozorvlak
f8b84f390d Calculate "count_uses_of_property" using DB query (#1183)
* Refactor 'count_uses_of_property' method in crop model
* Add check for nil column value

* Add @alran to CONTRIBUTORS.md

* Reformat Crop#count_uses_of_property

* Remove unnecessary string interpolation
2017-02-05 13:23:47 +13:00
pozorvlak
755b9b339f Merge pull request #1181 from Br3nda/bw/grand-haml-cleanup-of-2017
Te grand haml cleanup of 2017
2017-02-04 23:07:12 +00:00
Shiny
9deed09d36 Merge branch 'dev' into bw/grand-haml-cleanup-of-2017 2017-02-05 11:01:46 +13:00
pozorvlak
43de722faf Merge pull request #1180 from Br3nda/bw/application-controller-complexity
Reduce complexity of ApplicationController.store_location
2017-02-04 21:55:51 +00:00
pozorvlak
e145bb59f7 Merge branch 'dev' into bw/application-controller-complexity 2017-02-04 21:45:06 +00:00
pozorvlak
911c7b7bc1 Merge pull request #1174 from Br3nda/bw/rubocop-reduce-complexity
rubocop - reduce complexity
2017-02-04 21:44:42 +00:00
Brenda Wallace
2b7144c1fd Fixed trailing quote in haml 2017-02-04 15:07:18 +13:00
Brenda Wallace
8ddf36fed9 Haml clean up for (some of) crops views 2017-02-04 15:04:07 +13:00
Brenda Wallace
785ae33a42 Haml clean up for comments views 2017-02-04 14:07:59 +13:00
Brenda Wallace
c43c1686a3 Haml clean up for alternate_names views 2017-02-04 13:50:04 +13:00
Brenda Wallace
65a8bde467 Haml clean up for admin views 2017-02-04 12:00:42 +13:00
Brenda Wallace
3647f67538 Haml clean up for accounts views 2017-02-04 11:52:15 +13:00
Brenda Wallace
6c4f7eff92 Haml clean up for account_types views 2017-02-04 11:50:33 +13:00
Brenda Wallace
9b57a44f6c Adding haml-lint 2017-02-04 11:41:02 +13:00
Brenda Wallace
8a69ed4013 Reduce complexity of ApplicationController.store_location 2017-02-04 11:31:34 +13:00
Brenda Wallace
e5d826e8c3 Further simplified newsletter subscription logic 2017-02-04 11:28:37 +13:00
Brenda Wallace
77c01d4f66 BUGFIX: Added missing if 2017-02-04 11:23:27 +13:00
Brenda Wallace
33b7952ed3 Simplified OmniauthCallbacksController 2017-02-04 11:21:15 +13:00
Brenda Wallace
1217ba5b48 Reduce complexity of ApplicationController.store_location 2017-02-04 11:19:11 +13:00
Brenda Wallace
ffee6ada83 Simplify member.update_newsletter_subscription 2017-02-04 11:18:00 +13:00
Brenda Wallace
63b71a9265 Reduce controller complexity 2017-02-04 11:18:00 +13:00
pozorvlak
3ecc7ba99b Merge pull request #1178 from Br3nda/bw/plantingshelper-simplify
PlantingsHelper simplification
2017-02-03 13:36:42 +00:00
pozorvlak
3e81419e78 Merge branch 'dev' into bw/plantingshelper-simplify 2017-02-03 12:08:54 +00:00
pozorvlak
7cd8dfa0c7 Merge pull request #1176 from Br3nda/bw/seeds-controller-complexity
Reduce complexity of seeds controller
2017-02-03 12:08:45 +00:00
pozorvlak
9182c8ceb1 Merge branch 'dev' into bw/seeds-controller-complexity 2017-02-03 11:12:20 +00:00
pozorvlak
ec8096233c Merge pull request #1179 from CloCkWeRX/repair_gemfile
Repair missing items from Gemfile.lock - jasmine/phantomjs
2017-02-03 11:11:28 +00:00
Brenda Wallace
19aa3a1ca4 PlantingsHelper simplification 2017-02-03 20:42:15 +13:00
Shiny
e574ee166c Merge branch 'dev' into bw/seeds-controller-complexity 2017-02-03 20:32:29 +13:00
Daniel O'Connor
93e9428bb6 Repair missing items from Gemfile.lock 2017-02-03 11:11:47 +10:30
pozorvlak
fcf453b9d9 Merge pull request #1173 from Br3nda/bw/inactive-gardens
hide inactive gardens by default
2017-02-02 22:57:54 +00:00
pozorvlak
909164ea70 Merge branch 'dev' into bw/inactive-gardens 2017-02-02 22:40:21 +00:00
pozorvlak
b5a5aca67b Merge pull request #1175 from Br3nda/bw/plantings-controller-complexity
Reduce complexity of plantings controller
2017-02-02 22:22:41 +00:00
Shiny
2424e7de87 Merge branch 'dev' into bw/inactive-gardens 2017-02-02 14:48:31 +13:00
Shiny
d367b44da1 Merge branch 'dev' into bw/plantings-controller-complexity 2017-02-02 14:48:14 +13:00
Shiny
fe999d7170 Merge branch 'dev' into bw/seeds-controller-complexity 2017-02-02 14:47:10 +13:00
Daniel O'Connor
3267fd7d1f Merge pull request #1177 from Br3nda/bw/simplify-harvest-to-s
Simplified harvest.to_s
2017-02-02 10:58:16 +10:30
Brenda Wallace
355419b6cb Reduce complexity of seeds controller 2017-02-02 00:01:48 +00:00
Brenda Wallace
dfa23a6564 Simplified harvest.to_s 2017-02-01 23:55:45 +00:00
Brenda Wallace
9099ee5779 Reduce complexity of plantings controller 2017-02-01 23:51:14 +00:00
Brenda Wallace
7ba9049908 spec only show active gardens 2017-02-01 18:25:56 +13:00
Brenda Wallace
c82127f1fb Modify specs for new titles on garden nav buttons 2017-02-01 17:37:03 +13:00
Brenda Wallace
666394906b Active gardens only on profiles 2017-02-01 17:37:03 +13:00
Brenda Wallace
150393b1c3 Show only active gardens by default 2017-02-01 17:37:03 +13:00
Daniel O'Connor
e8e1e33a07 Merge pull request #1172 from pozorvlak/install_d3
Install d3-rails gem in production and staging
2017-01-31 11:01:41 +10:30
Miles Gould
18e6e8510c Install d3-rails gem in production and staging
It was only being installed in development and test environments,
causing deployment failures.

Fixes #1170
2017-01-30 20:17:42 +00:00
Daniel O'Connor
64d7c2535b Merge pull request #1168 from Br3nda/likeable
Reviving Likeable
2017-01-27 12:30:36 +10:30
Daniel O'Connor
15106a051c Merge branch 'dev' into likeable 2017-01-27 12:05:13 +10:30
Daniel O'Connor
62fe72c9f4 Merge pull request #1143 from pozorvlak/bw/bar_graphs
[WIP] bar graphs
2017-01-27 12:01:03 +10:30
Daniel O'Connor
43519809f5 Merge branch 'dev' into bw/bar_graphs 2017-01-27 11:54:12 +10:30
Shiny
7731623397 Merge branch 'dev' into likeable 2017-01-27 14:21:53 +13:00
pozorvlak
3b3e14fadb Merge pull request #1161 from Br3nda/bw/pending-crops
Member can see crops they have requested
2017-01-26 11:21:24 +00:00
Daniel O'Connor
271242eca9 Merge branch 'dev' into bw/bar_graphs 2017-01-25 13:00:25 +10:30
Daniel O'Connor
a607fdc6ec Merge branch 'dev' into likeable 2017-01-25 12:58:55 +10:30
Daniel O'Connor
6d1bdf9ae1 Merge branch 'dev' into bw/pending-crops 2017-01-25 12:55:13 +10:30
Daniel O'Connor
25058d02fc Merge pull request #1164 from Br3nda/bw/link-from-harvest-to-planting
Link from harvest to planting, instead of garden
2017-01-25 12:54:42 +10:30
Shiny
b80e7f677c Merge branch 'dev' into likeable 2017-01-24 19:44:42 +13:00
pozorvlak
576426c30d Merge pull request #1166 from Br3nda/bw/fix-notify-sys-exit
Fix crashing on email send - HOTFIX to master
2017-01-23 17:54:19 +00:00
Shiny
c9b464771d Merge branch 'master' into bw/fix-notify-sys-exit 2017-01-23 21:50:22 +13:00
Shiny
76af02f2a5 Merge branch 'dev' into bw/bar_graphs 2017-01-23 20:18:19 +13:00
Shiny
346970b471 Merge branch 'dev' into bw/pending-crops 2017-01-23 20:17:44 +13:00
Shiny
e6d3c257e8 Merge branch 'dev' into bw/link-from-harvest-to-planting 2017-01-23 20:17:34 +13:00
Daniel O'Connor
7224ef8848 Merge pull request #1159 from Br3nda/bw/garden-display-fix
Fix display of gardens on smaller screens
2017-01-23 14:59:43 +10:30
Brenda Wallace
dd9a0071d2 Link from harvest to planting, instead of garden 2017-01-23 09:58:25 +13:00
Brenda Wallace
65b4b2d23e Feature spec for requested crops 2017-01-23 09:49:47 +13:00
Brenda Wallace
4fedc7f23f Member can see crops they have requested 2017-01-23 09:49:47 +13:00
Shiny
26b3e28171 Merge branch 'dev' into bw/garden-display-fix 2017-01-23 09:41:37 +13:00
Daniel O'Connor
29765c7bab Merge pull request #1160 from Br3nda/bw/fix-notify-sys-exit
change deliver_later to deliver_now, so we don't sys.exit() crash
2017-01-23 00:21:47 +10:30
Brenda Wallace
370938c9f9 change deliver_later to deliver_now, so we don't sys.exit() crash 2017-01-22 21:22:30 +13:00
Cesy
e578ca2c77 Merge pull request #1153 from Growstuff/dev
Release 18
2017-01-22 07:47:42 +00:00
Brenda Wallace
08d407f041 Fix display of gardens on smaller screens 2017-01-22 20:33:37 +13:00
Shiny
d6de147661 Merge branch 'dev' into bw/bar_graphs 2017-01-22 18:39:53 +13:00
Brenda Wallace
9cadbdec2b Regenerated schema file 2017-01-22 18:27:32 +13:00
Brenda Wallace
5e61be9853 Merge remote-tracking branch 'upstream/dev' into HEAD 2017-01-22 18:26:38 +13:00
Brenda Wallace
ff50ec65d0 Merge remote-tracking branch 'upstream/dev' into HEAD 2017-01-22 18:26:29 +13:00
Daniel O'Connor
c4c50a4174 Merge pull request #1158 from Br3nda/bw/controller-translations
more controller translations
2017-01-22 15:34:14 +10:30
Brenda Wallace
a1c74bfdfb Translations for members controller 2017-01-22 17:36:48 +13:00
Brenda Wallace
2f9453780e Translations for harvests controller 2017-01-22 17:28:49 +13:00
Brenda Wallace
725ae817d4 Translations for gardens controller 2017-01-22 17:26:30 +13:00
Daniel O'Connor
eab9bcb37d Merge pull request #1157 from Br3nda/bw/rubocop-hash-braces
Removed unnecesary braces on hash args
2017-01-22 13:22:11 +10:30
Brenda Wallace
40a981c94d Removed unnecesary braces on hash args 2017-01-22 15:10:11 +13:00
Cesy
dd2af6a0e3 Merge pull request #1155 from CloCkWeRX/2017-01-21-gem-updates
2017 01 21 gem updates
2017-01-21 19:49:05 +00:00
Daniel O'Connor
9192ccf52b Update coveralls 2017-01-21 17:02:40 +10:30
Daniel O'Connor
4e79fd201c Update omniauth 2017-01-21 17:01:59 +10:30
Daniel O'Connor
d266d7ed1a Update i18n-tasks 2017-01-21 16:52:24 +10:30
Daniel O'Connor
f7f1907b74 Silence config/routes.rb:1:39: W: Lint/UnneededDisable: Unnecessary disabling of Metrics/BlockLength for now 2017-01-21 16:45:04 +10:30
Daniel O'Connor
c42e9ca410 Upgrade factory_girl_rails 2017-01-21 16:42:04 +10:30
Daniel O'Connor
f97c465a92 Update geocoder 2017-01-21 16:41:15 +10:30
Daniel O'Connor
a5b566a207 Update lumberjack 2017-01-21 16:40:27 +10:30
Daniel O'Connor
c6d16c92f5 Update public_suffix 2017-01-21 16:40:04 +10:30
Daniel O'Connor
c5b2e37730 Update diff-lcs 2017-01-21 16:39:31 +10:30
Daniel O'Connor
5c642dfef9 Really disable 2017-01-21 16:37:30 +10:30
Daniel O'Connor
a9b8253dfa Update connection_pool 2017-01-21 16:35:33 +10:30
Daniel O'Connor
58a3cbf569 Disable check for now 2017-01-21 16:28:57 +10:30
Daniel O'Connor
8b4c8fef3b Pin to earlier version of rainbow until https://github.com/sickill/rainbow/issues/44 is sorted 2017-01-21 16:14:37 +10:30
Daniel O'Connor
36c0de4504 Upgrade to selenium-webdriver 3.0.0 2017-01-21 16:04:15 +10:30
Daniel O'Connor
3208bf9fb6 Regenerate rubocop configuration 2017-01-21 15:58:52 +10:30
Daniel O'Connor
4eebf5c867 Error: The Style/MethodCallParentheses cop has been renamed to Style/MethodCallWithoutArgsParentheses. 2017-01-21 15:57:01 +10:30
Daniel O'Connor
61f7bdfdd2 Update rubocop 2017-01-21 15:56:02 +10:30
Daniel O'Connor
06838d7ad1 Update ruby_dep, unicode-display_width 2017-01-21 15:55:22 +10:30
Daniel O'Connor
676f246e85 Merge pull request #1154 from Br3nda/bw/translations
More translations
2017-01-21 15:51:41 +10:30
Shiny
6121a9bc6e Merge branch 'dev' into bw/translations 2017-01-20 21:05:31 +11:00
Brenda Wallace
c2804f1725 Merge branch 'bw/controller-translations' into bw/translations
Conflicts:
	config/locales/en.yml
2017-01-20 23:04:00 +13:00
Brenda Wallace
b198305d36 Translations for account controller 2017-01-20 22:48:04 +13:00
Brenda Wallace
7d7f5bfda3 Translations for account types 2017-01-20 22:46:12 +13:00
Brenda Wallace
d97af8e76e Adding missing translation for harvests 2017-01-20 22:40:14 +13:00
Brenda Wallace
91adc5f59e Normalise english translations file 2017-01-20 22:23:38 +13:00
Shiny
714b2580a3 Merge branch 'dev' into bw/bar_graphs 2017-01-18 11:15:09 +13:00
pozorvlak
a8d5b14d46 Merge pull request #1150 from Br3nda/bw/rubocop
Rubocop fix up for the models
2017-01-17 17:43:24 +00:00
pozorvlak
cc59c4f49b Merge branch 'dev' into bw/rubocop 2017-01-17 16:47:07 +00:00
pozorvlak
8a7b7e75ef Merge pull request #1141 from Br3nda/bw/active-plantings
Show only active plantings by default
2017-01-17 16:41:22 +00:00
Shiny
f8dda12de6 Merge branch 'dev' into bw/active-plantings 2017-01-15 17:36:32 +13:00
Shiny
ab332976da Merge branch 'dev' into bw/rubocop 2017-01-15 17:36:17 +13:00
pozorvlak
331c778350 Merge pull request #1152 from CloCkWeRX/upgrade-comfortable-mexican-sofa
Upgrade to current comfortable_mexican_sofa
2017-01-14 22:20:54 +00:00
Cesy
48b6a2297b Merge branch 'master' into dev 2017-01-14 20:21:46 +00:00
pozorvlak
27ea2e0432 Merge branch 'dev' into upgrade-comfortable-mexican-sofa 2017-01-14 19:53:06 +00:00
pozorvlak
4c0000b964 Merge pull request #1145 from Br3nda/bw/description-photo-links
Descriptive links from photo page
2017-01-14 19:51:20 +00:00
Daniel O'Connor
a3ee17bd4d #1054 Upgrade to current comfortable_mexican_sofa 2017-01-15 02:19:15 +10:30
Brenda Wallace
958e7eb955 Removed rubocop excludes that we have fixed 2017-01-14 21:13:59 +13:00
Brenda Wallace
39888d44e2 Rubocop compliance for the account model 2017-01-14 21:11:02 +13:00
Brenda Wallace
b603bae1a7 Rubocop compliance for the notification model 2017-01-14 21:09:47 +13:00
Brenda Wallace
05db5f3109 Rubocop compliance for the order_item model 2017-01-14 21:08:47 +13:00
Brenda Wallace
ad72ab0ba8 Rubocop compliance for the role model 2017-01-14 21:04:19 +13:00
Brenda Wallace
3beb3974fc Rubocop compliance for the product model 2017-01-14 21:03:01 +13:00
Brenda Wallace
fa15fd2912 Rubocop compliance for the photo model 2017-01-14 21:01:46 +13:00
Brenda Wallace
78ed7869c5 Rubocop compliance for the member model 2017-01-14 20:57:18 +13:00
Brenda Wallace
0fa9f54c9c Rename member.has_role? to role? 2017-01-14 20:54:43 +13:00
Brenda Wallace
f214f608ff Rename member.is_paid? to paid? 2017-01-14 20:51:22 +13:00
Brenda Wallace
eb70f6dc57 Rubocop compliance for the seed model 2017-01-14 20:48:19 +13:00
Brenda Wallace
43c4b154f9 Rubocop compliance for the follow model 2017-01-14 20:45:54 +13:00
Brenda Wallace
21a536bf86 Merge remote-tracking branch 'upstream/dev' into bw/rubocop 2017-01-14 20:43:02 +13:00
Brenda Wallace
832a20eac9 Rubocop compliance for order model 2017-01-14 20:42:32 +13:00
Brenda Wallace
f6cc0f3e13 rubocop compliance in post model 2017-01-14 20:34:08 +13:00
Brenda Wallace
5be5585084 Rubocop disable Rails/HasAndBelongsToMany 2017-01-14 20:31:34 +13:00
Brenda Wallace
989f176fb7 Crop model adhering to rubocop 2017-01-14 20:09:54 +13:00
Brenda Wallace
be07b5fd0e Only check values.zero? if they are present 2017-01-14 20:09:09 +13:00
Shiny
180505a1ca Merge branch 'dev' into bw/active-plantings 2017-01-14 18:27:18 +13:00
Shiny
22343385f6 Merge branch 'dev' into bw/bar_graphs 2017-01-14 18:26:48 +13:00
Shiny
e11603cb3e Merge branch 'dev' into bw/description-photo-links 2017-01-14 18:25:52 +13:00
Daniel O'Connor
97c5eb1c42 Merge pull request #1149 from Br3nda/bw/quotes-in-name
Removed unwanted quotes in member name in menu
2017-01-14 15:09:04 +10:30
Brenda Wallace
d07509f9e4 Rubocop compliance for comment model 2017-01-14 17:23:39 +13:00
Brenda Wallace
0c1220d11f Rubocop compliance for harvest model 2017-01-14 17:22:33 +13:00
Brenda Wallace
f889b112fe Rubocop compliance for garden model 2017-01-14 17:20:21 +13:00
Brenda Wallace
a1cfa826d9 Removed unwanted quotes in member name in menu
Fix for Issue #1144
2017-01-14 17:11:58 +13:00
Brenda Wallace
477f9669bd Added nav for plantings 2017-01-14 16:54:37 +13:00
Brenda Wallace
c1da5e4dc8 Split plantings#index into two methods to simplify 2017-01-14 16:47:29 +13:00
Brenda Wallace
6bdfe5a669 Moved plantings nav bar to own file and simplified 2017-01-14 16:32:03 +13:00
Shiny
8138aa8c09 Merge branch 'dev' into bw/active-plantings 2017-01-14 15:33:28 +13:00
Brenda Wallace
eba397117c Planting needs to calculate slugs before model is valid 2017-01-14 11:41:48 +13:00
Brenda Wallace
f9396248e6 Merge remote-tracking branch 'upstream/dev' into bw/description-photo-links 2017-01-11 12:12:36 +13:00
Miles Gould
d0351bad70 Merge branch 'dev' into bw/bar_graphs 2017-01-09 15:21:38 +00:00
Miles Gould
7ca371ae43 Merge remote-tracking branch 'mine/bw/bar_graphs' into bw/bar_graphs 2017-01-09 15:19:18 +00:00
Miles Gould
7fa0d22583 Graph real crop sunninesses from server
Works for me in superficial manual testing, but needs automated tests.
Also currently does two server round trips (one for planting locations
and one for sunninesses); it would be better to combine these into one,
or alternatively to create a "crop stats" API endpoint and calculate
sunniness stats in SQL.
2017-01-09 15:13:55 +00:00
pozorvlak
f31342c6e0 Merge pull request #1147 from Br3nda/alpha-bundle
Bundle alphabetical order to comply with stricter rubocop.

Patch is semantically a no-op, and the static check failure is expected.
2017-01-09 12:11:45 +00:00
Brenda Wallace
87a091d694 Bundle alpha-order to comply with stricter rubocop 2017-01-08 20:50:52 +00:00
Brenda Wallace
2e04d56225 Merge remote-tracking branch 'origin/bw/description-photo-links' into bw/description-photo-links 2017-01-08 21:48:58 +13:00
Brenda Wallace
405dfe4bc9 Merge remote-tracking branch 'upstream/dev' into bw/description-photo-links 2017-01-08 21:35:59 +13:00
Shiny
15de4ac08c Merge branch 'dev' into bw/active-plantings 2017-01-08 11:16:19 +13:00
Shiny
6e535f2403 Merge branch 'dev' into bw/bar_graphs 2017-01-08 11:10:21 +13:00
Shiny
c55208713b Merge branch 'dev' into bw/description-photo-links 2017-01-08 11:09:19 +13:00
Shiny
48c1b4d0f9 Merge pull request #1142 from Br3nda/bw/harvests-linkto-plantings
Link a harvest to a planting, and display
2017-01-08 11:08:42 +13:00
Brenda Wallace
2f38a8585b Revert "update spec for stringify"
This reverts commit 144823bd13.
2017-01-07 13:50:11 +13:00
Brenda Wallace
062ff16acf Put garden.to_s back to garden.name 2017-01-07 13:17:53 +13:00
Brenda Wallace
7f30ce04e0 Garden name (truncated) on front page link 2017-01-07 13:09:35 +13:00
Brenda Wallace
144823bd13 update spec for stringify 2017-01-07 12:52:47 +13:00
Brenda Wallace
90b19d52bb Don't rely on to_s for slug. Fragile with translations 2017-01-07 12:49:57 +13:00
Brenda Wallace
76be980163 Translate garden.location 2017-01-07 12:48:14 +13:00
Brenda Wallace
88b1f02574 Added require of photo model constants 2017-01-07 12:44:08 +13:00
Brenda Wallace
5b633b484b Fixes link to seeds, and spec for link to seeds 2017-01-07 12:22:28 +13:00
Brenda Wallace
3be379cee9 updated specs to match new links on photo page 2017-01-07 12:05:35 +13:00
Brenda Wallace
5319d23ee3 Using translations on links from photo page 2017-01-07 12:03:31 +13:00
Brenda Wallace
350c1d4c08 Descriptive links from photo page 2017-01-06 22:25:13 +13:00
Miles Gould
885c9433ce Merge branch 'dev' into bw/bar_graphs 2017-01-05 11:39:10 +00:00
Miles Gould
b0c132c28f Replace literal RGB with variable in graph.css 2017-01-05 11:38:55 +00:00
Miles Gould
8765770071 Ignore spurious code duplication error in bar_*.js
The code in question is

```
  return root.append('g')
    .attr("class", "bar")
    .selectAll("rect")
    .data(bars.map(function(bar) { return bar.value; }))
    .enter()
```

in graphs/bar_group.js, and

```
    return d3.append('g')
      .attr("class", "bar-label")
      .selectAll("text")
      .data(bars.map(function(bar){ return bar.name;}))
      .enter()
      .append("text")
      .attr('x', -80)
```

in graphs/bar_label_group.js. I don't think it's worth unifying these.
2017-01-05 11:19:44 +00:00
Miles Gould
8083ae9052 Remove duplicate getBarValues() methods
I've replaced one with a getMaxValue() function, which is what we
actually want, and deleted the other.
2017-01-05 11:18:51 +00:00
Shiny
5ca8829727 Merge branch 'dev' into bw/active-plantings 2017-01-05 16:35:39 +13:00
Shiny
d40eccdb63 Merge branch 'dev' into bw/harvests-linkto-plantings 2017-01-05 16:31:22 +13:00
pozorvlak
478fae53ab Merge pull request #1136 from Br3nda/bw/garden-specs
Controller garden specs for member doing what they shouldn't
2017-01-04 12:06:10 +00:00
Shiny
fc71cba6ba Merge branch 'dev' into bw/harvests-linkto-plantings 2017-01-04 22:52:54 +13:00
Brenda Wallace
283bb76a9e Link a harvest to a planting, and display 2017-01-04 22:45:49 +13:00
Brenda Wallace
18e58809c3 Merge remote-tracking branch 'upstream/dev' into bw/active-plantings 2017-01-04 16:25:44 +13:00
Brenda Wallace
b27b361e2f Show active plantings by default 2017-01-04 16:25:19 +13:00
Shiny
3fafa87afd Merge branch 'dev' into bw/garden-specs 2017-01-04 16:18:54 +13:00
pozorvlak
de60dbb9b0 Merge pull request #1140 from Br3nda/bw/descriptive-spec
descriptive spec
2017-01-03 12:12:18 +00:00
Shiny
a95fca3682 Merge branch 'dev' into bw/bar_graphs 2017-01-03 22:42:58 +13:00
Brenda Wallace
8047aef692 Merge remote-tracking branch 'upstream/dev' into bw/descriptive-spec
Conflicts:
	spec/features/signin_spec.rb
2017-01-03 22:16:24 +13:00
Brenda Wallace
b38728c5df Add login() to signin spec to reduce code duplication 2017-01-03 22:13:27 +13:00
Brenda Wallace
241c3cfdc0 Moves model name into spec description
so we can tell which failed.
2017-01-03 22:12:23 +13:00
Shiny
8b3b28b9d6 Merge branch 'dev' into bw/garden-specs 2017-01-03 20:50:20 +13:00
Daniel O'Connor
5f6fc37efd Merge pull request #1138 from Br3nda/bw/garden-name-in-link
Garden's name in link
2017-01-03 13:33:59 +10:30
Brenda Wallace
881acdccc9 Shortening long garden names on a user's page 2017-01-02 20:54:22 +13:00
Brenda Wallace
3b1753d3d5 Garden's name in link 2017-01-02 20:36:25 +13:00
Brenda Wallace
ab75f830fb Controller garden specs for member doing what they shouldn't 2016-12-25 10:38:07 +13:00
Shiny
0c8345d1e2 Merge branch 'dev' into bw/bar_graphs 2016-12-22 10:22:29 +13:00
Cesy
ca553a4693 Merge pull request #1130 from Growstuff/dev
Release 17
2016-12-21 19:19:47 +00:00
Shiny
58ddeefaa3 Merge pull request #1127 from Br3nda/bw/guard-clauses
Guard clauses
2016-12-21 22:53:06 +13:00
Shiny
ee7fbb9ab9 Merge branch 'dev' into bw/guard-clauses 2016-12-21 20:53:47 +13:00
pozorvlak
cf31e53303 Merge pull request #1131 from pozorvlak/moar_tests
Improve unit test coverage for models
2016-12-20 14:22:36 +00:00
Miles Gould
4b1cdc5650 Test Model.newsletter_(un)subscribe
I'm not very happy with this change as-is. The tests are very shallow
(they wouldn't have caught the bug @tconquest and I found in this code,
for instance), and use the deprecated `receive_message_chain` method.
From the RSpec docs:

"Chains can be arbitrarily long, which makes it quite painless to
violate the Law of Demeter in violent ways, so you should consider any
use of receive_message_chain a code smell.  Even though not all code
smells indicate real problems (think fluent interfaces),
receive_message_chain still results in brittle examples. For example, if
you write allow(foo).to receive_message_chain(:bar, :baz => 37) in a
spec and then the implementation calls foo.baz.bar, the stub will not
work."

Further work needed.
2016-12-19 22:15:53 +00:00
Miles Gould
4f1c94bfb9 Fix warnings in member_spec 2016-12-19 20:44:18 +00:00
Miles Gould
70f589d59b Replace instance vars with locals in member_spec 2016-12-19 20:33:43 +00:00
Miles Gould
f5eede6072 Improve tests for Member.interesting 2016-12-19 20:29:05 +00:00
Miles Gould
3469d6d37f Feature test for signin via email address 2016-12-19 20:23:07 +00:00
Miles Gould
b8385afb2f Remove apparently-unused Geocodable.geocode method
We have unit tests for geocoding, but it's not being covered, so I
assume it's being shadowed by a method installed directly from Geocoder.
2016-12-19 20:14:05 +00:00
Miles Gould
abb9acd04a post_spec: fix warnings
Several "unused variable" warnings (due to replacing unused instance
variables with unused locals) and one warning about ambiguous
lack-of-brackets.
2016-12-19 16:40:05 +00:00
Miles Gould
67faa5554c post_spec: replace instance vars with local vars
The @ in front of a variable makes it an instance variable of the
surrounding object. There's no point doing that for variables that are
only used in a single function, so I've made such variables in the file
post_spec.rb into function-local variables. We should do this more
generally: there are a lot of instances of this (anti?)pattern in our
test suite.
2016-12-19 16:36:46 +00:00
Miles Gould
59b86c9b0c Replace << with string-interpolation in post_spec 2016-12-19 16:33:41 +00:00
Miles Gould
7239cf068b Test [member name](member) mention syntax 2016-12-19 16:31:32 +00:00
Miles Gould
c23e80b56d Test Post.recently_active 2016-12-19 16:26:17 +00:00
Miles Gould
b011fc9bae Test Post.comment_count 2016-12-19 16:17:31 +00:00
Miles Gould
b40974d4c3 Test Crop.create_from_csv with missing parent
I couldn't work out how to test that the error is logged.
2016-12-19 16:15:19 +00:00
Shiny
ed081e7286 Merge branch 'dev' into bw/guard-clauses 2016-12-18 19:29:05 +13:00
Cesy
1b9a5bc115 Merge pull request #1129 from Br3nda/bw/ruby-upgrade-2-3-3
Upgrade to ruby 2.3.3
2016-12-17 09:59:22 +00:00
Brenda Wallace
b0dd53eb63 Upgrade to ruby 2.3.3 2016-12-17 20:32:07 +13:00
Shiny
27520e9aa6 Merge branch 'dev' into bw/bar_graphs 2016-12-16 12:52:16 +13:00
Daniel O'Connor
3cdaa03e5d Merge branch 'dev' into likeable 2016-12-15 14:28:22 +10:30
Brenda Wallace
ebae0dfad3 Merge remote-tracking branch 'upstream/dev' into bw/guard-clauses 2016-12-14 21:37:12 +00:00
Brenda Wallace
ca7868b79a Use guard clauses 2016-12-14 21:28:35 +00:00
Daniel O'Connor
148dfa7f8b Merge pull request #1126 from CloCkWeRX/2016-12-gem-upgrades
2016 12 gem upgrades
2016-12-13 15:08:46 +10:30
Daniel O'Connor
feff2cdfd4 Upgrade rake only 2016-12-12 10:38:31 +10:30
Daniel O'Connor
74657abec0 Revert "Update rake and rubocop"
This reverts commit c9127dbf1e.
2016-12-12 10:37:45 +10:30
Daniel O'Connor
6ff3fa21e1 Revert "Disable Style/EmptyMethod for now"
This reverts commit 5235b11905.
2016-12-12 10:37:26 +10:30
Shiny
fe5a93160f Merge branch 'dev' into bw/bar_graphs 2016-12-10 21:39:11 +13:00
Daniel O'Connor
88ba4f9198 Rubocop 2016-12-09 12:19:38 +10:30
Daniel O'Connor
2594e5d334 Rubocop 2016-12-09 12:06:14 +10:30
Daniel O'Connor
ce9fc85d0b Rubocop 2016-12-09 12:04:13 +10:30
Daniel O'Connor
2499db77f1 Rubocop 2016-12-09 11:59:56 +10:30
Daniel O'Connor
8edbef3965 Rubocop 2016-12-09 11:56:53 +10:30
Daniel O'Connor
2e23675425 app/controllers/likes_controller.rb:2:3: C: Rails/ActionFilter: Prefer before_action over before_filter. 2016-12-09 11:52:46 +10:30
Daniel O'Connor
fef272e30f Merge remote-tracking branch 'upstream/dev' into likeable 2016-12-09 11:42:32 +10:30
Daniel O'Connor
be572b9a53 Upgrade 2016-12-09 11:25:03 +10:30
Daniel O'Connor
5235b11905 Disable Style/EmptyMethod for now 2016-12-09 11:17:54 +10:30
Daniel O'Connor
d3d3731fa3 Update minitest 2016-12-09 10:52:01 +10:30
Daniel O'Connor
1982dc76be Pin to elasticsearch API 2.0 for now 2016-12-09 10:51:13 +10:30
Daniel O'Connor
c9127dbf1e Update rake and rubocop 2016-12-09 10:46:22 +10:30
Daniel O'Connor
f7ca706e0b Update omniauth-facebook (not as scary as it sounds - https://github.com/mkdynamic/omniauth-facebook/blob/master/CHANGELOG.md) 2016-12-09 10:25:08 +10:30
Daniel O'Connor
817c1ec5ce Update will_paginate 2016-12-09 10:24:18 +10:30
Daniel O'Connor
18ab47eed3 Update thor 2016-12-09 10:23:24 +10:30
Daniel O'Connor
d99f24c02c Update coffee-script-source 2016-12-09 10:22:32 +10:30
Daniel O'Connor
aaaca81d49 Update hashie 2016-12-09 10:21:31 +10:30
Daniel O'Connor
59ec36320b Update codeclimate-test-reporter 2016-12-09 10:20:47 +10:30
Daniel O'Connor
303fd8c243 Update autoprefixer-rails 2016-12-09 10:20:09 +10:30
Daniel O'Connor
3e43a19e58 Update CONTRIBUTING.md
Dead link, no archived version of it
2016-12-09 10:09:04 +10:30
Shiny
391d5bed5f Merge branch 'dev' into bw/bar_graphs 2016-12-09 07:29:55 +13:00
Shiny
46a0956f5f Merge pull request #1124 from Br3nda/bw/load-resource
Cancan already loads the resource
2016-12-09 07:29:28 +13:00
Brenda Wallace
4f465d808c We don't need to load the resource again 2016-12-07 23:54:03 +00:00
Shiny
8161e90fbd Merge branch 'dev' into bw/bar_graphs 2016-12-08 12:35:59 +13:00
Shiny
aea935be4b Merge pull request #1122 from Br3nda/bw/duplicate-query
Gardens query was running twice in contoller
2016-12-08 12:32:20 +13:00
Brenda Wallace
e695d5646a FIX Gardens query was running twice in contoller 2016-12-07 22:27:17 +00:00
Daniel O'Connor
a074e72b9b Merge branch 'dev' into bw/bar_graphs 2016-12-07 13:36:21 +10:30
Daniel O'Connor
e799233fb7 Merge pull request #1119 from Br3nda/bw/ParenthesesAsGroupedExpression
Fixed parentheses that are interp-ed as grouped expression
2016-12-07 12:30:38 +10:30
Brenda Wallace
d4a496eb1c Removed duplicate variable assignment 2016-12-07 12:26:12 +13:00
Brenda Wallace
a23e241480 Eslint clean ups 2016-12-07 12:22:33 +13:00
Brenda Wallace
af424103f4 Code style fix up (comments only) 2016-12-07 11:34:17 +13:00
Brenda Wallace
d68cfe0486 Move the invocation into the parens that contain the function 2016-12-07 11:33:30 +13:00
Brenda Wallace
0f15095129 Fix up css style 2016-12-07 11:30:17 +13:00
Brenda Wallace
6e0e7e4de1 Merge remote-tracking branch 'upstream/dev' into bw/bar_graphs
Conflicts:
	CONTRIBUTORS.md
	Gemfile
	Gemfile.lock
	app/assets/javascripts/application.js
	app/assets/javascripts/crops.js.erb
	app/views/crops/show.html.haml
2016-12-07 11:17:30 +13:00
Shiny
00e240c038 Merge branch 'dev' into bw/ParenthesesAsGroupedExpression 2016-12-07 10:06:50 +13:00
Brenda Wallace
05e7a27782 Call to verify options stays as a hash 2016-12-07 10:04:17 +13:00
Mackenzie
53477485ef Merge pull request #1117 from Br3nda/bw/AmbiguousOperator
Fixed AmbiguousOperator
2016-12-06 12:40:21 -05:00
Mackenzie
c760112e1b Merge pull request #1118 from Br3nda/bw/assignment-in-condition
Don't use assignments in conditions
2016-12-06 12:40:00 -05:00
Mackenzie
0e8146b7ee Merge pull request #1120 from Br3nda/bw/more-enwikipedia-chars
Yet another wikipedia url char added to regex
2016-12-06 12:39:33 -05:00
Brenda Wallace
a7bafafa06 Yet another wikipedia url char added to regex 2016-12-06 21:58:17 +13:00
Brenda Wallace
464c570d99 Fixed parentheses that are interp-ed as grouped expression 2016-12-06 21:23:55 +13:00
Brenda Wallace
abc5ac5f29 Don't use assignments in conditions 2016-12-06 21:18:13 +13:00
Brenda Wallace
4c6f0fc929 Fixed AmbiguousOperator 2016-12-06 21:09:39 +13:00
Daniel O'Connor
41e408b04a Merge pull request #1116 from Br3nda/bw/returns
Removed redundant returns
2016-12-06 11:20:45 +10:30
Brenda Wallace
8981a222ea Simplified display_weight 2016-12-06 00:32:20 +00:00
Brenda Wallace
91b0c1898e Simplifying display_harvest_description 2016-12-05 20:40:34 +00:00
Brenda Wallace
26e5a414cf Line no longer needs wrapping 2016-12-04 21:23:33 +00:00
Brenda Wallace
92195d51d2 Removed redundant returns 2016-12-04 21:21:35 +00:00
Shiny
0fcd8c8e8c Merge pull request #1094 from Br3nda/bw/useless-assignments
Useless assignments fixed, and rails 4 stuff.
2016-12-05 10:06:03 +13:00
Daniel O'Connor
c43ec3d256 Merge branch 'dev' into bw/useless-assignments 2016-12-04 10:30:41 +10:30
Daniel O'Connor
1ae9366076 Merge pull request #1109 from maco/seed_photos
add photos to seeds
2016-12-04 10:30:07 +10:30
Daniel O'Connor
8bb6df6ca7 Merge branch 'dev' into seed_photos 2016-12-03 16:47:13 +10:30
Daniel O'Connor
afbdd1194f Merge branch 'dev' into bw/useless-assignments 2016-12-03 16:43:11 +10:30
Mackenzie Morgan
c2de65e515 Merge branch 'seed_photos' of gitmaco:maco/growstuff into seed_photos 2016-12-02 23:18:05 -05:00
Mackenzie Morgan
c201200e9b correct schema and add index for photos_seeds 2016-12-02 23:17:01 -05:00
Mackenzie
04ba871949 Merge pull request #1108 from maco/fix_photo_requires
WIP: add require_relative to photo_capable concern for constants
2016-12-02 23:13:56 -05:00
Shiny
7785a9d797 Merge branch 'dev' into seed_photos 2016-12-03 09:31:20 +13:00
Shiny
1388aa3b06 Merge branch 'dev' into bw/useless-assignments 2016-12-03 08:23:19 +13:00
Mackenzie
519cf80200 Merge pull request #1111 from CloCkWeRX/658_automation
issue #658 i18n automation (updated)
2016-12-02 08:26:15 -05:00
pozorvlak
ce9e20b2f1 Merge branch 'dev' into 658_automation 2016-12-02 13:06:56 +00:00
Shiny
0c2a60ecc3 Reduce max AbcSize to 38 (#1112)
Reduce how complex methods are allowed to be, according to our code checker, so we're forced to write readable code
2016-12-02 08:06:53 -05:00
Mackenzie
fa1e46c2e7 Merge pull request #1110 from maco/codeclimate_ignores
ignore the minified bootstrap accessibility file for code climate checks
2016-12-02 08:02:47 -05:00
pozorvlak
7b0d17af59 Merge branch 'dev' into 658_automation 2016-12-02 12:05:05 +00:00
pozorvlak
4a8494ad06 Merge branch 'dev' into codeclimate_ignores 2016-12-02 12:04:07 +00:00
pozorvlak
3acaea2914 Merge branch 'dev' into fix_photo_requires 2016-12-02 12:03:53 +00:00
pozorvlak
0156795a29 Merge pull request #1114 from Br3nda/bw/phantom-403s
Revert "Changed phantomjs url to project official"
2016-12-02 11:05:12 +00:00
Brenda Wallace
7aaf6ea2ec Revert "Changed phantomjs url to project official"
This reverts commit 7fcd3cba8d.
2016-12-02 20:21:41 +13:00
Daniel O'Connor
fa65be40a4 lib/tasks/i18n.rake:8:37: W: Lint/UnusedBlockArgument: Unused block argument - t. If it's necessary, use _ or _t as an argument name to indicate that it won't be used. 2016-12-02 15:51:29 +10:30
Daniel O'Connor
aa638b8a68 Missed from merge 2016-12-02 15:41:35 +10:30
Daniel O'Connor
49639c6244 Merge branch '658_automation' of github.com:CloCkWeRX/growstuff into 658_automation 2016-12-02 15:37:55 +10:30
Jim Stallings
e939be05f8 Add myself to contributors 2016-12-02 15:35:13 +10:30
Jim Stallings
160c6efd04 Remove example file, add documentation 2016-12-02 15:34:38 +10:30
Jim Stallings
fe6e269c64 GS-658 - i18n automation POC 2016-12-02 15:34:38 +10:30
Jim Stallings
81f2fa5fa4 GS-658: sort locale keys, add rake task for it 2016-12-02 15:31:07 +10:30
Shiny
bb0eb25dd3 Merge branch 'dev' into bw/useless-assignments 2016-12-02 14:04:30 +13:00
Shiny
077c807958 Merge branch 'dev' into seed_photos 2016-12-02 14:04:12 +13:00
Daniel O'Connor
07ba39c117 Merge branch 'dev' into codeclimate_ignores 2016-12-02 11:33:04 +10:30
Daniel O'Connor
266455eda6 Merge pull request #1105 from maco/wikipedia_regex
expand wikipedia regex to include -, (, and )
2016-12-02 11:32:26 +10:30
Brenda Wallace
03cb4a8dee use find_or_initialize_by 2016-12-02 00:23:46 +00:00
Brenda Wallace
d87de13215 Merge remote-tracking branch 'origin/bw/find-by' into bw/useless-assignments 2016-12-01 23:46:50 +00:00
Mackenzie Morgan
ceac906a3f ignore the minified bootstrap accessibility file for code climate checks 2016-12-01 14:00:18 -05:00
Mackenzie Morgan
2fb34bea18 narrow the regex back down
hyphen must be the LAST thing in the character class
2016-12-01 13:39:43 -05:00
Mackenzie Morgan
a3c8bc0586 include the migration 2016-12-01 13:23:52 -05:00
Mackenzie Morgan
637b46ef10 add photos to seeds
Fixes #495
2016-12-01 12:54:55 -05:00
Mackenzie Morgan
b38945d62f add require_relative to photo_capable concern for constants
starts #1107
2016-12-01 12:53:45 -05:00
Mackenzie Morgan
54628e6d8c expand wikipedia regex to include punctuation, because some have - or () in name
(Fixes: #1104)
2016-12-01 12:25:48 -05:00
pozorvlak
5cb1e14d7b Merge pull request #1095 from maco/photo_concern
DRY up photo & model interaction
2016-12-01 15:16:21 +00:00
Daniel O'Connor
7032436f7b Merge branch 'dev' into bw/useless-assignments 2016-12-01 22:15:50 +10:30
Daniel O'Connor
83a3c3e72f Merge pull request #1102 from cesy/railsupdate
Update rails
2016-12-01 22:04:32 +10:30
Cesy Avon
3d845f47b9 Update rails 2016-12-01 09:42:55 +00:00
Brenda Wallace
d2fb96b3d7 change where.first -> find_by 2016-12-01 22:14:50 +13:00
Brenda Wallace
aba06c1faf Case insensitive crop look up 2016-12-01 21:29:28 +13:00
Brenda Wallace
dc504fe363 use Member.case_insensitive_login_name 2016-12-01 21:29:00 +13:00
Brenda Wallace
cba02ae05c Convert where.first to find_by 2016-12-01 20:25:28 +13:00
Brenda Wallace
37adbe5f48 Moved case-insensitve login look up to method 2016-12-01 20:25:19 +13:00
Brenda Wallace
ae26e3f936 Moved login_name_or_email query to own method 2016-12-01 20:25:10 +13:00
Mackenzie Morgan
7b2be73c88 code climate 2016-12-01 00:22:52 -05:00
Mackenzie Morgan
cd0fbc80d8 Merge remote-tracking branch 'origin/photo_concern' into photo_concern 2016-12-01 00:19:42 -05:00
Mackenzie Morgan
31bbf42ad0 define valid models for photos in a constants file
remove all hardcoded model names from photo.rb and photos_controller.rb
2016-12-01 00:19:33 -05:00
Brenda Wallace
e06d110861 Turn on rails:true in rubocop
so we don't need to pass --rails
2016-12-01 13:30:00 +13:00
Shiny
b454132cae Merge branch 'dev' into bw/useless-assignments 2016-12-01 12:51:13 +13:00
Brenda Wallace
cd0e287dba removed member look up that wasn't used in spec 2016-12-01 12:50:16 +13:00
Shiny
771e6b649c Merge branch 'dev' into photo_concern 2016-12-01 12:37:23 +13:00
Daniel O'Connor
547e6400f8 Merge pull request #1049 from maco/scopify
moving where clauses into scopes to keep that contained in models
2016-12-01 09:48:26 +10:30
Brenda Wallace
ce7cd5d96b Merge branch 'dev' into bw/useless-assignments 2016-12-01 11:17:56 +13:00
Mackenzie
ba4d85538c Merge branch 'dev' into scopify 2016-11-30 16:47:22 -05:00
Mackenzie
af3ca215a6 Merge branch 'dev' into photo_concern 2016-11-30 16:37:36 -05:00
Mackenzie Morgan
cef1bb1056 ignore has_and_belongs_to_many 2016-11-30 16:29:02 -05:00
Brenda Wallace
6321d1ac41 current order, use rails' findby 2016-12-01 10:17:22 +13:00
Mackenzie
57461f6e34 Merge pull request #1091 from pozorvlak/fix_display_days_before_maturity
Fix PlantingHelper.display_days_before_maturity
2016-11-30 10:09:36 -05:00
Cesy
cf8fab8ed9 Merge pull request #1080 from Growstuff/dev
Release 16
2016-11-30 15:07:42 +00:00
Mackenzie Morgan
aa7ca71e5d rubocop 2016-11-30 09:47:48 -05:00
Mackenzie Morgan
a5fcfb6277 Merge branch 'dev' of gitmaco:Growstuff/growstuff into photo_concern 2016-11-30 09:44:36 -05:00
Mackenzie
376e6c08d3 Merge pull request #1097 from pozorvlak/precompile_assets_in_test
Precompile assets in test
2016-11-30 09:44:15 -05:00
Mackenzie
0cbaac3c75 Merge pull request #1098 from pozorvlak/allow_unadorned_rake_without_db
Run tests with `rake` when DB does not yet exist
2016-11-30 09:43:40 -05:00
Miles Gould
6be9640625 Run tests with rake when DB does not yet exist
Previously, `rake spec` ran the tests whether or not the `growstuff_test`
database existed or not, but `rake` crashed unless it had already been
created. The problem was that `rake` was trying to load the environment,
which required the presence of a DB; `rake spec` was running this with
the `dev` environment, so succeeded if `growstuff_dev` existed, but
`rake` was running everything with the `test` environment, so would fail
if `growstuff_test` did not exist.

This patch adds `db:create` to the dependencies of the `spec` task,
forcing an unadorned `rake` to create all necessary databases first.
2016-11-30 11:35:35 +00:00
Miles Gould
1841548936 Precompile assets in test
According to
https://github.com/teampoltergeist/poltergeist/issues/677#issuecomment-222919584,
a possible cause of the "Request failed to reach server" problem (#901)
is that assets are being compiled on-demand, causing enough of a
slowdown for PhantomJS to think the connection has failed. This turns
off lazy asset compilation in the test environment and precompiles
assets before testing on Travis. We should also turn off lazy asset
compilation in production - see
http://stackoverflow.com/questions/8821864/config-assets-compile-true-in-rails-production-why-not
Our Heroku deployments already run `rake assets:precompile`.
2016-11-30 11:01:25 +00:00
Miles Gould
9400225f65 Return a string from display_days_before_maturity
Sometimes we were returning a string, and sometimes we were returning an
integer. We're only ever displaying the result, and this seems a little
more consistent.
2016-11-30 10:16:02 +00:00
Miles Gould
b0b864a5d4 Fix off-by-one bug in display_days_before_maturity
We were counting from DateTime.now rather than Date.current, causing us to
under-count by a day.
2016-11-30 10:16:02 +00:00
Miles Gould
77c64d5925 Test PlantingHelper.display_days_before_maturity
This ensures that #1079 is fixed.
2016-11-30 10:15:52 +00:00
pozorvlak
d3b927b44b Merge pull request #1096 from Growstuff/master
Master to dev for 1092
2016-11-30 09:44:12 +00:00
Mackenzie Morgan
77b7969fc9 DRY up photo & model interaction
* move stuff in models into a concern
 * create combined collection for all models that have photos
2016-11-30 00:46:58 -05:00
Shiny
9d68690d86 Merge pull request #1092 from Br3nda/hotfix/1079
Check we have a planted_at ts before using
2016-11-30 17:50:15 +13:00
Brenda Wallace
900e7361c6 Check we have a planted_at ts before doing maths with it 2016-11-30 17:39:26 +13:00
Brenda Wallace
a2e86b3e5e Rails dynamic finds fixed 2016-11-30 12:21:27 +13:00
Brenda Wallace
b6136d6a20 Removed ignores for rails findby 2016-11-30 10:38:00 +13:00
Mackenzie
7b0fdcf007 Merge pull request #1093 from Br3nda/bw/fix-deprecated-methods
Fixes for two calls to deprecated methods
2016-11-29 16:34:32 -05:00
Brenda Wallace
178c181cf5 Merge remote-tracking branch 'upstream/dev' into bw/useless-assignments
Conflicts:
	app/controllers/crops_controller.rb
	app/models/crop.rb
	spec/models/scientific_name_spec.rb
2016-11-30 10:32:02 +13:00
Brenda Wallace
9aa4fa8031 Fixes for two calls to deprecated methods 2016-11-30 10:25:23 +13:00
Mackenzie Morgan
72877aebaf update test for renamed scope 2016-11-29 13:41:05 -05:00
Mackenzie Morgan
4857fd8d2e return from conditional 2016-11-29 12:20:17 -05:00
Mackenzie Morgan
99c8db72d6 syntax 2016-11-29 12:14:16 -05:00
Mackenzie Morgan
53849a26e5 merge 2016-11-29 12:11:52 -05:00
Mackenzie Morgan
9dc02cd3d8 make changes from code review 2016-11-29 12:10:48 -05:00
Mackenzie
391111a5bf Merge pull request #1088 from maco/rename_scientific_name
rename scientific_names.scientific_name to scientific_names.name
2016-11-29 12:04:21 -05:00
Mackenzie Morgan
c93fd78aa8 Merge branch 'dev' of gitmaco:Growstuff/growstuff into scopify 2016-11-29 09:58:02 -05:00
Mackenzie
818c8f0c37 Merge pull request #1090 from pozorvlak/indentation-for-great-glory
Fix comment-style weirdness
2016-11-29 09:53:23 -05:00
Mackenzie Morgan
915030e583 whitespace 2016-11-29 09:40:59 -05:00
Mackenzie Morgan
832719b01a merge from upstream dev 2016-11-29 09:37:25 -05:00
Miles Gould
0d8cbc5bf2 Fix comment-style weirdness
We had an inline comment that had been split over two lines; whitespace
fixes made this look very weird.
2016-11-29 10:44:04 +00:00
pozorvlak
bac8f5e4cc Merge pull request #1072 from Br3nda/bw/indentation-for-great-glory
the giant indentation patch of 2016, for great glory
2016-11-29 10:42:24 +00:00
Mackenzie Morgan
69980d9ec6 tests 2016-11-28 22:50:53 -05:00
Mackenzie Morgan
2129b6480d ...that was a guard clause. oops 2016-11-28 22:42:11 -05:00
Mackenzie Morgan
fe860aa1ab clean up some tests 2016-11-28 22:33:00 -05:00
Mackenzie Morgan
a382caab48 clear up redundant else and unneeded returns 2016-11-28 22:08:41 -05:00
Mackenzie Morgan
e1e9a52186 use a guard clause 2016-11-28 22:08:14 -05:00
Mackenzie Morgan
66c8ce78bc further DRY up crops controller 2016-11-28 22:04:32 -05:00
Mackenzie Morgan
e1a2b168c9 rename scientific_names.scientific_name to scientific_names.name
this mirrors alternate_names.name and allows making code more DRY
2016-11-28 21:57:51 -05:00
Brenda Wallace
8763c22284 Merge remote-tracking branch 'upstream/dev' into bw/indentation-for-great-glory
Conflicts:
	app/models/crop.rb
2016-11-29 02:33:30 +00:00
Mackenzie
9ec2f76909 Merge pull request #1086 from maco/sunniness_planted_from
deduplicate sunniness and planted_from functions (Fixes: #1085)
2016-11-28 20:59:52 -05:00
Mackenzie Morgan
b94cb2abd6 deduplicate sunniness and planted_from functions (Fixes: #1085) 2016-11-28 19:57:34 -05:00
Daniel O'Connor
7abafd7b74 Merge pull request #1084 from maco/improve_crop
Improve crop model
2016-11-29 10:27:13 +10:00
Mackenzie Morgan
502862128f break out if/else into discrete blocks 2016-11-28 19:20:35 -05:00
Mackenzie Morgan
96b1e78962 dedup the add from csv code (Fixes: #1082) 2016-11-28 19:12:42 -05:00
Mackenzie
e077f6c7b1 Merge pull request #1076 from Br3nda/bw/poking-travis
Travis file lint and clean
2016-11-28 09:57:26 -05:00
Mackenzie
b25a938936 Merge pull request #1081 from CloCkWeRX/upgrade-gems-nov-2016
Upgrade various gems for Nov 2016
2016-11-28 09:55:54 -05:00
Mackenzie
0952d7d32f Merge pull request #1078 from Br3nda/bw/garden-names-one-line
Limit garden names to one line
2016-11-28 09:55:16 -05:00
Daniel O'Connor
9963502026 bundle update i18n-tasks 2016-11-28 13:55:01 +10:00
Daniel O'Connor
5c2b14376e bundle update terminal-table 2016-11-28 10:43:46 +10:00
Daniel O'Connor
330bc912c1 bundle update bootstrap_form 2016-11-28 10:43:05 +10:00
Daniel O'Connor
bd46c37f07 bundle update activemerchant 2016-11-28 10:42:03 +10:00
Daniel O'Connor
c08c038df1 bundle update active_utils 2016-11-28 10:40:32 +10:00
Daniel O'Connor
0fb9ea7a11 bundle update newrelic_rpm byebug 2016-11-28 10:37:36 +10:00
Daniel O'Connor
89c29ea73c bundle update pg 2016-11-28 10:32:43 +10:00
Daniel O'Connor
9c116f5887 bundle update rspec-rails coveralls capybara-screenshot 2016-11-28 10:31:24 +10:00
Daniel O'Connor
eb1013f925 bundle update jwt kramdown excon 2016-11-28 10:30:02 +10:00
Daniel O'Connor
9bd1484a95 bundle update ruby_parser rb-fsevent redis 2016-11-28 10:29:09 +10:00
Daniel O'Connor
7a90c020fc bundle update thor tins term-ansicolor 2016-11-28 10:28:07 +10:00
Daniel O'Connor
0a69ee682c Merge pull request #1073 from Br3nda/bw/poltergeist-upgrade
Upgrading poltergeist
2016-11-28 10:22:21 +10:00
Daniel O'Connor
8b5c63e898 Merge pull request #1077 from Br3nda/bw/wikipedia-url-regex
Narrow-ed regex on wikipedia url
2016-11-28 10:08:11 +10:00
Cesy
dfe12fd7f8 Merge pull request #1074 from Br3nda/bw/string-interp
String interp doesn't need .to_s in test
2016-11-27 11:02:31 +00:00
Cesy
73a2ac87da Merge pull request #1075 from Br3nda/bw/garden-link
Bugfix: Link to garden, not member
2016-11-27 11:00:49 +00:00
Brenda Wallace
9cce0e39f6 Limit garden names to one line 2016-11-27 14:52:07 +13:00
Brenda Wallace
10c20c7f91 Narrow-ed regex on wikipedia url
and more tests
2016-11-27 14:35:49 +13:00
Brenda Wallace
f52b828abe Use rake to create database 2016-11-27 13:27:45 +13:00
Brenda Wallace
c76fb15cfd Add yamllint settings 2016-11-27 13:24:21 +13:00
Brenda Wallace
167417a711 Indent travis.yml correctly 2016-11-27 13:24:02 +13:00
Brenda Wallace
7fcd3cba8d Changed phantomjs url to project official 2016-11-27 13:22:10 +13:00
Brenda Wallace
9cb58ab0c9 Wrapped the phantomjs downloading in travis.yml 2016-11-27 13:08:53 +13:00
Brenda Wallace
702bbeb724 "[Member]'s garden" link to garden, not member 2016-11-27 10:21:11 +13:00
Brenda Wallace
38fbc52a6f String interp doesn't need .to_s 2016-11-27 10:17:01 +13:00
Cesy
34e86f5881 Merge pull request #1066 from pozorvlak/autodeploy_prod
Auto-deploy to production on successful merge
2016-11-26 08:30:24 +00:00
Brenda Wallace
8c7fcd9d49 Fixed all useless assignments 2016-11-26 19:36:59 +13:00
Brenda Wallace
1fd7233012 Plualisation fixups 2016-11-26 17:27:13 +13:00
Brenda Wallace
d60dcfbddd Use request.referer instead of request.referrer 2016-11-26 17:26:44 +13:00
Brenda Wallace
b541fe8221 puts allowed in some files 2016-11-26 17:24:41 +13:00
Brenda Wallace
8196d94a73 Don't enforce http pos args until rails 5 2016-11-26 17:23:31 +13:00
Brenda Wallace
07c135eeb5 before_filter is now before_action 2016-11-26 17:20:13 +13:00
Brenda Wallace
bcdd2a9167 Changed called to rails dynamic find_by 2016-11-26 15:55:38 +13:00
Brenda Wallace
20c72e1205 Upgrading poltergeist 2016-11-26 13:43:04 +13:00
Brenda Wallace
c02562518d Fixed double handling in harvest.to_s 2016-11-26 12:20:51 +13:00
Brenda Wallace
723ebff923 Spacing fixes 2016-11-26 12:13:17 +13:00
Brenda Wallace
62e7c716dd Removed extra empty blank lines 2016-11-26 12:06:02 +13:00
Brenda Wallace
b17e4eed7d Block indentation fixups 2016-11-26 12:02:47 +13:00
Brenda Wallace
19727144d8 Else statement alignment 2016-11-26 11:57:02 +13:00
Brenda Wallace
e62adc297a Aligning end on branches 2016-11-26 11:55:54 +13:00
Brenda Wallace
2e46cccd21 Hash alignment 2016-11-26 11:52:10 +13:00
Brenda Wallace
bbc19a5436 Array indentation fixed 2016-11-26 11:49:51 +13:00
Brenda Wallace
4cf0f85ee8 Indent the first parameter one step more than the start of the previous line. 2016-11-26 11:46:31 +13:00
Brenda Wallace
d268d2b09e Fixed indentation on comments 2016-11-26 11:45:25 +13:00
Brenda Wallace
200a1c9a84 Closing parenthesis indentation fixed 2016-11-26 11:44:18 +13:00
Brenda Wallace
ebacd83dde Case statement indentation clean up 2016-11-26 11:42:34 +13:00
Brenda Wallace
c878baa886 Indented parameters cleanup 2016-11-26 11:41:07 +13:00
Brenda Wallace
564731667e Fixed up all remaining hash alignment 2016-11-26 11:17:42 +13:00
Brenda Wallace
bae25cfe8f Fixed hash alignment in a funky big DDL 2016-11-26 11:16:55 +13:00
Brenda Wallace
5f3dd04068 Fixed array indentation 2016-11-26 11:00:49 +13:00
Brenda Wallace
2eddaf90cf Fixed access modifier indentation 2016-11-26 11:00:04 +13:00
Brenda Wallace
91d2998507 Fixed multi-line operation indentation 2016-11-26 10:56:23 +13:00
Brenda Wallace
7eb0ee16b9 Indentation for multiline method calls 2016-11-26 10:54:51 +13:00
Brenda Wallace
83392ddda1 Indentation clean ups 2016-11-26 10:51:54 +13:00
pozorvlak
847f4d88d6 Merge pull request #1069 from CloCkWeRX/add-facebook-assets
Add a login splash for facebook
2016-11-25 18:06:02 +00:00
pozorvlak
fb9a1fdfd3 Merge pull request #1061 from Br3nda/bw/long-lines-fixed
Wrapped all lines > 120 chars.
2016-11-25 18:02:22 +00:00
Daniel O'Connor
783406d730 Add a login splash 2016-11-25 09:44:12 +10:00
Brenda Wallace
be67b858b4 Merge remote-tracking branch 'upstream/dev' into bw/long-lines-fixed
Conflicts:
	lib/tasks/growstuff.rake
2016-11-25 08:18:18 +13:00
Miles Gould
a796ba904a Merge branch 'Br3nda-bw/reduce-complexity' into dev 2016-11-24 19:06:31 +00:00
Miles Gould
012f2f0cfa Merge branch 'bw/reduce-complexity' of https://github.com/Br3nda/growstuff into Br3nda-bw/reduce-complexity 2016-11-24 19:00:06 +00:00
pozorvlak
3e8c61c0c3 Merge pull request #1064 from Br3nda/bw/normalise-translations
Normalise translation file
2016-11-24 18:55:10 +00:00
Miles Gould
844f68ef4c Auto-deploy to production on successful merge
I *think* this is all that's necessary, though it's a bit hard to test
:-)
2016-11-24 18:48:01 +00:00
Brenda Wallace
975deab4b2 Normalise translation file 2016-11-23 20:24:02 +13:00
Brenda Wallace
fb6f1ac0a8 Changed whitelisting of what can have photos 2016-11-21 10:05:52 +13:00
Brenda Wallace
069343803e List of types that can have photos in own method 2016-11-20 21:46:58 +13:00
Brenda Wallace
36d38fe624 Turn off frozen literals requirement 2016-11-20 21:39:51 +13:00
Brenda Wallace
0d6680f574 Disabling rails-pos-args, and documentation
in rubocop
2016-11-20 21:37:10 +13:00
Brenda Wallace
dac2343b68 Further code duplication reduction 2016-11-20 21:18:07 +13:00
Brenda Wallace
f24e02fd11 reduced code duplication again in photos cont spec 2016-11-20 21:13:57 +13:00
Brenda Wallace
dddc7b020d Corrected description in spec 2016-11-20 21:13:33 +13:00
Brenda Wallace
12a9a0b97d one more check no alert was generated 2016-11-20 21:13:08 +13:00
Brenda Wallace
6a8f48693b Reduce code duplication in photos cont spec 2016-11-20 21:12:43 +13:00
Brenda Wallace
50a0668c1d Check no alert message was generated 2016-11-20 21:11:54 +13:00
Brenda Wallace
a7e88a55b3 Spec for trying to attach photo when not allowed. 2016-11-20 21:03:08 +13:00
Brenda Wallace
8012d9f6a8 Whitelist which items can have photos 2016-11-20 21:02:43 +13:00
Brenda Wallace
73a050df13 before_filter becomes before_action
in photos controller
2016-11-20 20:29:45 +13:00
Brenda Wallace
d0a1a113b6 Multi-line block changed from {} to do end 2016-11-20 20:29:01 +13:00
Brenda Wallace
a8bffd3bce White space fix in spec 2016-11-20 20:28:34 +13:00
Brenda Wallace
f6aac07c3d Flatten params passed in photos controller spec 2016-11-20 20:27:59 +13:00
Brenda Wallace
72f1d83af4 Removed a bunch of blank lines 2016-11-20 20:19:14 +13:00
Brenda Wallace
138080c4d4 Tabulation fix 2016-11-20 20:18:20 +13:00
Brenda Wallace
cf70bfebe9 Further simplified photos controller 2016-11-20 20:17:27 +13:00
Brenda Wallace
5fc1ab9c60 Reduced code duplication in growstuff.rake 2016-11-20 19:35:17 +13:00
Brenda Wallace
6078734136 Merge remote-tracking branch 'upstream/dev' into bw/reduce-complexity 2016-11-20 19:25:30 +13:00
Brenda Wallace
917e33bccf Merge remote-tracking branch 'upstream/dev' into bw/long-lines-fixed 2016-11-20 19:24:53 +13:00
Brenda Wallace
810fe14c69 Highest percieved complexity is now 10 2016-11-20 09:17:42 +13:00
Brenda Wallace
f4a26d0580 has_item_id? renamed to item_id? 2016-11-20 09:06:04 +13:00
Brenda Wallace
0a54c2d986 Moved to method: collection to use for photos 2016-11-20 09:05:29 +13:00
Brenda Wallace
9c4f011fbc Reduced percieved complexity in photos_controller.rb 2016-11-19 22:28:38 +13:00
Brenda Wallace
951727e266 Removed offense count comment from rubocop.yml - has fixed 2016-11-19 13:58:45 +13:00
Brenda Wallace
2872a1c29d Wrapped all long lines.
reduced rubocop's line length limit to 120
2016-11-17 22:02:18 +13:00
Brenda Wallace
fd29a94d6e Whitespace fixes in Gemfile 2016-11-17 21:52:52 +13:00
Mackenzie Morgan
cee3d192e0 test the new order.by_member_id scope 2016-10-11 16:34:25 -04:00
Mackenzie Morgan
65bf4dae69 Merge branch 'dev' of gitmaco:Growstuff/growstuff into scopify 2016-10-11 15:42:18 -04:00
Mackenzie Morgan
494790bcd4 moving where clauses into scopes to keep that contained in models 2016-10-11 15:28:08 -04:00
Daniel O'Connor
07f7bd24d5 Clean up 2016-07-09 21:54:26 +09:30
Daniel O'Connor
04074ff372 Reimplement ajax like/unlike behaviour 2016-07-09 21:53:33 +09:30
Daniel O'Connor
d3dac756d6 Merge remote-tracking branch 'upstream/dev' into likeable 2016-07-09 21:08:33 +09:30
Daniel O'Connor
6f9ae13757 Update spec to wait for the link to appear 2016-06-04 23:01:57 +09:30
Daniel O'Connor
0a33ae8d37 Add an ajax like and unlike (though it hides after the user action) 2016-06-04 22:49:08 +09:30
Daniel O'Connor
ac33816675 Update spec 2016-06-04 21:37:35 +09:30
Daniel O'Connor
77e95ad344 Shift to concerns 2016-06-04 21:02:50 +09:30
Daniel O'Connor
bb25cbe5e2 Merge branch 'dev' of github.com:Growstuff/growstuff into likeable 2016-06-04 21:00:52 +09:30
Jim Stallings
2f561aaa47 Add myself to contributors 2015-09-26 11:54:51 -04:00
Jim Stallings
e02a6e569c Remove example file, add documentation 2015-09-26 11:54:02 -04:00
Jim Stallings
98581801c3 GS-658 - i18n automation POC 2015-09-19 17:45:31 -04:00
Jim Stallings
93f9435fb9 GS-658: sort locale keys, add rake task for it 2015-09-19 16:24:01 -04:00
Marlena Compton
71c0bff3e0 add comments explaining each file per pull request 2015-03-06 07:03:06 -08:00
Marlena Compton
c7a71381b7 write test for tooltips 2015-03-03 06:49:16 -08:00
Marlena Compton
5a1fd19abc move bar color into the data 2015-03-03 05:49:13 -08:00
Marlena Compton
a48a6da494 refactored graph scale into width scale and height scale 2015-02-28 15:50:27 -08:00
Marlena Compton
b0a803a7a5 add h2 for sunniness chart and crop map 2015-02-26 06:41:24 -08:00
Marlena Compton
6e4bb58dfd change color when hovering over a bar 2015-02-26 06:26:38 -08:00
Marlena Compton
66b0f139a9 add tooltip to show data values 2015-02-26 06:07:23 -08:00
Marlena Compton
567562f132 fix merge conflicts in gemfile.lock 2015-02-10 06:44:22 -08:00
Marlena Compton
39feeb94d0 merge in changes from dev branch 2015-02-10 06:28:47 -08:00
Yoong Kang Lim
75ac2081b0 Merge branch 'dev' into likeable
Conflicts:
	db/schema.rb
2015-02-10 22:57:28 +11:00
Yoong Kang Lim
36a94156c1 Merge branch 'dev' into likeable
Conflicts:
	db/schema.rb
2015-02-10 22:54:45 +11:00
Yoong Kang Lim
e3db003bbc Added tests for the concern and member model 2015-02-10 20:18:26 +11:00
Yoong Kang Lim
33a66dce1f Starting stages of a like feature for posts. 2015-02-05 00:54:31 +11:00
Marlena Compton
a013385d35 add bits to get the labels in the right place 2015-01-31 08:02:51 -08:00
Marlena Compton
ba7ef3c85d all charts tests passing WOOT 2015-01-28 05:16:23 -08:00
Marlena Compton
73e144278e added chart to the page 2015-01-27 07:26:31 -08:00
Marlena Compton
e3d2a90af8 all tests by the y test is passing 2015-01-25 12:45:36 -08:00
Marlena Compton
1d5466fdfd all but one test passing and seeing that I need a how separate y scale 2015-01-24 16:23:09 -08:00
Marlena Compton
a749a9ca63 all tests working but 2 about to monkey with data again 2015-01-23 06:33:03 -08:00
Marlena Compton
6d8817d1fe fixing tests but some of them are green and render is working 2015-01-19 07:34:15 -08:00
Marlena Compton
1a845fdabc xscale working 2015-01-13 21:40:31 -08:00
Marlena Compton
e52c4f7d4b add group for graph and transform to accommodate labels 2014-12-22 10:24:33 -08:00
Marlena Compton
5f435b1e82 fix conflict in contributors file 2014-12-14 10:15:05 -08:00
Marlena Compton
f608685ac8 add names to contributors 2014-12-12 13:36:11 -08:00
Marlena Compton
dbbd37e59e BarGroup uses data object 2014-12-06 21:30:38 -08:00
Marlena Compton
482650dec6 bar label group and all tests passing 2014-12-06 21:16:22 -08:00
Marlena Compton
cc22b87cf1 barlabelgroup tests passing still horizontalbargraph tests to fix 2014-12-06 08:30:49 -08:00
Marlena Compton
8826b0137a changed growtuff to growstuff which fixed tests 2014-11-26 13:55:27 -08:00
Marlena Compton
d4d76b2e8d committing tests classes I thought I committed earlier :/ 2014-11-26 13:48:22 -08:00
Marlena Compton
994ee18f13 Merge remote-tracking branch 'upstream/master' 2014-11-23 14:36:21 -08:00
Marlena Compton
80532e94f1 Merge remote-tracking branch 'origin/dev' 2014-09-11 06:46:41 -07:00
555 changed files with 6783 additions and 7377 deletions

View File

@@ -19,6 +19,9 @@ engines:
languages:
- ruby
- javascript
exclude_fingerprints:
- 16dbcb58d6caa7ccfe241417831ecfa6
- 7d7dca4f27f50e3084f203280073cc74
fixme:
enabled: true
exclude_fingerprints: # rubocop_todo filename
@@ -38,3 +41,4 @@ exclude_paths:
- db/
- spec/
- public/
- app/assets/stylesheets/bootstrap-accessibility.css

4
.gitignore vendored
View File

@@ -14,4 +14,6 @@ Pathogen:
custom_plan.rb
zeus.json
.bundle
.idea/**
.idea/**
public/**
node_modules

9
.haml-lint.yml Normal file
View File

@@ -0,0 +1,9 @@
linters:
LineLength:
max: 120
InstanceVariables:
enabled: false
IdNames:
enabled: false
ConsecutiveComments:
enabled: false

3
.mention-bot Normal file
View File

@@ -0,0 +1,3 @@
{
"userBlacklist": ["tygriffin","oshiho3"]
}

104
.overcommit.yml Normal file
View File

@@ -0,0 +1,104 @@
---
# Use this file to configure the Overcommit hooks you wish to use. This will
# extend the default configuration defined in:
# https://github.com/brigade/overcommit/blob/master/config/default.yml
#
# At the topmost level of this YAML file is a key representing type of hook
# being run (e.g. pre-commit, commit-msg, etc.). Within each type you can
# customize each hook, such as whether to only run it on certain files (via
# `include`), whether to only display output if it fails (via `quiet`), etc.
#
# For a complete list of hooks, see:
# https://github.com/brigade/overcommit/tree/master/lib/overcommit/hook
#
# For a complete list of options that you can use to customize hooks, see:
# https://github.com/brigade/overcommit#configuration
#
# Uncomment the following lines to make the configuration take effect.
PreCommit:
ALL:
quiet: false
problem_on_unmodified_line: warn
RuboCop:
enabled: true
command: ['bundle', 'exec', 'rubocop', '-D', '--rails']
TrailingWhitespace:
enabled: true
exclude:
- '**/db/structure.sql' # Ignore trailing whitespace in generated files
CoffeeLint:
enabled: true
on_fail: warn
command: ['npm', 'run', 'coffeelint']
HardTabs:
enabled: true
AuthorEmail:
enabled: false
AuthorName:
enabled: false
CssLint:
enabled: true
exclude:
- '**/bootstrap.min.css'
command: ['npm', 'run', 'csslint']
HamlLint:
enabled: true
requires_files: true
on_warn: fail
command: ['bundle', 'exec', 'haml-lint', 'app/views']
JsonSyntax:
enabled: true
BundleOutdated:
enabled: true
on_warn: warn
BundleAudit:
enabled: true
on_warn: warn
JsHint:
enabled: true
exclude:
- 'app/assets/**'
- 'spec/javascripts/support/vendor/**'
- '**/bootstrap*'
command: ['npm', 'run', 'jshint']
ScssLint:
enabled: true
RailsSchemaUpToDate:
enabled: true
MergeConflicts:
enabled: true
YamlLint:
enabled: true
PostCommit:
GitGuilt:
enabled: true
command: ['npm', 'run', 'git-guilt']
PostCheckout:
ALL:
quiet: false
BundleInstall:
enabled: true
RailsSchemaUpToDate:
enabled: true
PostMerge:
BundleInstall:
enabled: true
RailsSchemaUpToDate:
enabled: true
# PrePush:
# ALL:
# on_warn: fail # Treat all warnings as failures
# quiet: false
# # Brakeman:
# # enabled: true
# RSpec:
# enabled: true
# command: ['bundle', 'exec', 'rspec', '--fail-fast']
#
# IndexTags:
# enabled: true # Generate a tags file with `ctags` each time HEAD changes

View File

@@ -8,41 +8,60 @@ AllCops:
- 'db/schema.rb'
- 'vendor/**/*'
Rails:
Enabled: true
Style/FileName:
Exclude:
- 'Gemfile'
- 'Gemfile.lock'
Style/StringLiterals:
Enabled: false
Metrics/MethodLength:
Description: 'Avoid methods longer than 30 lines of code.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods'
# Set to 30 once all methods are fixed.
# Max: 30
Max: 104
Style/MultilineMethodCallIndentation:
EnforcedStyle: indented
# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth.
# SupportedStyles: with_first_parameter, with_fixed_indentation
Style/AlignParameters:
EnforcedStyle: with_fixed_indentation
Metrics/LineLength:
Max: 120
# See https://github.com/bbatsov/rubocop/issues/3629
Rails/HttpPositionalArguments:
Enabled: false
Style/Documentation:
Enabled: false
Style/FrozenStringLiteralComment:
Enabled: false
# Configuration parameters: Include.
# Include: app/**/*.rb, config/**/*.rb, db/**/*.rb, lib/**/*.rb
Rails/Output:
Exclude:
- 'config/unicorn.rb'
- 'db/seeds.rb'
Metrics/BlockLength:
Exclude:
- 'spec/**/*'
- '**/*.rake'
- 'config/**/*.rb'
# Remove the following once the code style matches
# Offense count: 59
Metrics/MethodLength:
Max: 34
Metrics/AbcSize:
Max: 115
# Offense count: 5
# Configuration parameters: CountComments.
Metrics/BlockLength:
Max: 62
# Offense count: 6
# Configuration parameters: CountComments.
Max: 32
Metrics/ClassLength:
Max: 275
# Offense count: 6
Max: 207
Metrics/CyclomaticComplexity:
Max: 11
# Offense count: 1108
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives.
# URISchemes: http, https
Metrics/LineLength:
Max: 223
# Offense count: 8
Metrics/PerceivedComplexity:
Max: 12
Max: 9

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1 +1 @@
2.3.1
2.3.4

View File

@@ -4,28 +4,43 @@ cache:
bundler: true
directories:
- travis_phantomjs
- tmp/cache/assets/test/sprockets
env:
matrix:
- GROWSTUFF_SITE_NAME="Growstuff (travis)" RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' GROWSTUFF_ELASTICSEARCH='true'
- GROWSTUFF_SITE_NAME="Growstuff (travis)" RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' GROWSTUFF_ELASTICSEARCH='false'
- GROWSTUFF_ELASTICSEARCH='true' RSPEC_TAG=elasticsearch STATIC_CHECKS=false
- GROWSTUFF_ELASTICSEARCH='false' RSPEC_TAG=~elasticsearch STATIC_CHECKS=false
- STATIC_CHECKS=true
global:
secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
- GROWSTUFF_SITE_NAME="Growstuff (travis)"
- RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
- secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
rvm:
- 2.3.1
- 2.3.4
before_install:
- ./script/install_phantomjs;
- export PATH=$PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64/bin:$PATH
- if [ $(phantomjs --version) != '2.1.1' ]; then rm -rf $PWD/travis_phantomjs; mkdir -p $PWD/travis_phantomjs; fi
- if [ $(phantomjs --version) != '2.1.1' ]; then wget https://assets.membergetmember.co/software/phantomjs-2.1.1-linux-x86_64.tar.bz2 -O $PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2; fi
- if [ $(phantomjs --version) != '2.1.1' ]; then tar -xvf $PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2 -C $PWD/travis_phantomjs; fi
- phantomjs --version
before_script:
- psql -c 'create database growstuff_test;' -U postgres
- bundle exec rake db:create db:migrate db:test:prepare
- set -e
- >
if [ "${STATIC_CHECKS}" = "true" ]; then
./script/install_linters;
else
bundle exec rake assets:precompile;
fi
- set +e
script:
- bundle exec rubocop --display-cop-names --rails
- script/gemfile_check
- bundle exec script/check_contributors_md
- bundle exec rake db:migrate --trace
- bundle exec rspec spec/
- set -e
- >
if [ "${STATIC_CHECKS}" = "true" ]; then
./script/check_static.rb
else
bundle exec rake db:migrate --trace;
bundle exec rspec --tag $RSPEC_TAG spec/;
bundle exec rake jasmine:ci;
fi;
- set +e
services:
- elasticsearch
before_deploy:
@@ -33,11 +48,12 @@ before_deploy:
deploy:
provider: heroku
api_key:
secure: WrQxf0fEKkCdXrjcejurobOnNNz3he4dDwjBbToXbQTQNDObPp7NetJrLsfM8FiUFEeOuvhIHHiDQtMvY720zGGAGxDptvgFS+0QHCUqoTRZA/yFfUmHlG2jROXTzk5uVK0AE4k6Ion5kX8+mM0EnMT/7u+MTFiukrJctSiEXfg=
secure: "WrQxf0fEKkCdXrjcejurobOnNNz3he4dDwjBbToXbQTQNDObPp7NetJrLsfM8FiUFEeOuvhIHHiDQtMvY720zGGAGxDptvgFS+0QHCUqoTRZA/yFfUmHlG2jROXTzk5uVK0AE4k6Ion5kX8+mM0EnMT/7u+MTFiukrJctSiEXfg="
on:
repo: Growstuff/growstuff
app:
dev: growstuff-staging
master: growstuff-prod
travis_deploy: tranquil-basin-3130
travis_containers: tranquil-basin-3130
run:

7
.yamllint Normal file
View File

@@ -0,0 +1,7 @@
extends: relaxed
rules:
# 80 chars should be enough, but don't fail if a line is longer
line-length:
max: 150
level: warning

View File

@@ -3,11 +3,36 @@ Thanks for contributing to Growstuff!
When you create a pull request, please include the following:
* Mention the issue it solves (eg. #123)
* Your code should follow our [Coding style guide](http://wiki.growstuff.org/index.php/Coding_style_guide)
* Your code should follow our [Coding style guide](https://github.com/Growstuff/growstuff/wiki/Development-process-overview#coding-practices)
* Make sure you have automated tests for your work, where possible.
* Add your name (and that of your pair partner, if any) to [CONTRIBUTORS.md](CONTRIBUTORS.md).
If you would like to discuss your work before submitting a pull request,
please join any of our [Discussion
forums](http://wiki.growstuff.org/index.php/Discussion_forums), where
our dev team will be happy to help you.
All pull requests should pass our automatic continuous integration and style
checks before being merged. You can run tests locally as follows:
- `rake spec` to run all Ruby tests
- `rake spec:models` to run Ruby model tests (or `rake spec:views` for view tests, etc)
- `rake static` to run all static checks (code style, unfixed Git conflicts, etc)
- `rake jasmine:ci` to run JavaScript unit tests in headless mode
- `rake jasmine` to start a server for running JavaScript unit tests in a
browser (eg for debugging). Point your browser at http://localhost:8888 to
run the tests.
- `rspec ./spec/path/to/my_spec.rb` to run all Ruby tests in the file `my_spec.rb`
- `rspec ./spec/path/to/my_spec.rb:45` to run the Ruby test starting on line 45 of
`my_spec.rb`. RSpec will output a list of command-lines in this form for all
failing tests so you can easily re-run particular ones.
- `rspec --only-failures` to re-run all Ruby tests that failed last time.
Growstuff runs several linters and checkers before a change is merged. These
run from overcommit. To automatically run the same linters yourself you can
install overcommit too.
- `./script/install_linters`
You can run `rake -T` to see a list of available Rake tasks. If you can't get
some tests to pass, please submit a pull request anyway - we'll be happy to
help you debug the failures.
If you would like to discuss an idea before submitting a pull request,
please open a [GitHub Issue](https://github.com/growstuff/growstuff/issues),
where our dev team will be happy to help you.

View File

@@ -54,6 +54,8 @@ submit the change with your pull request.
- Rocky Jaiswal / [rocky-jaiswal](https://github.com/rocky-jaiswal)
- Robert Landreaux / [robertlandreaux](https://github.com/robertlandreaux)
- Savant Krishna / [sksavant](https://github.com/sksavant)
- Marlena Compton / [marlena](https://github/marlena)
- Ryan Dy / [rdy](https://github/rdy)
- Jake Yesbeck / [yez](https://github.com/yez)
- Mauricio Gonzalez / [mauricio-gonzalez](https://github.com/mauricio-gonzalez)
- Andrey Bazhutkin / [andrba](https://github.com/andrba)
@@ -72,3 +74,13 @@ submit the change with your pull request.
- Charley Lewittes / [ctlewitt](https://github.com/ctlewitt)
- Kristine Nicole Polvoriza / [polveenomials](https://github.com/polveenomials)
- Brenda Wallace / [br3nda](https://github.com/br3nda)
- Jim Stallings / [jestallin](https://github.com/jestallin)
- Alyssa Ransbury / [alran](https://github.com/alran)
- Thomas Countz / [thomascountz](https://github.com/thomascountz)
- Megan Talbot / [meganft](https://github.com/meganft)
- Arun Kumar / [arun1595](https://github.com/arun1595)
- Harry Brodsky / [hbrodsk1](https://github.com/hbrodsk1)
## Bots
- Security and Dependency Updates / [deppbot](https://github.com/deppbot)

80
Gemfile
View File

@@ -1,15 +1,15 @@
# frozen_string_literal: true
source 'https://rubygems.org'
ruby '2.3.1'
ruby '2.3.4'
gem 'rails', '~> 4.2.1'
gem 'rails', '~> 4.2.7'
gem 'bundler', '>=1.1.5'
gem 'sass-rails', '~> 5.0.4'
gem 'coffee-rails', '~> 4.1.0'
gem 'haml'
gem 'sass-rails', '~> 5.0.4'
# CSS framework
gem 'bootstrap-sass', '~> 3.3.6'
@@ -17,25 +17,25 @@ gem 'font-awesome-sass'
gem 'uglifier', '~> 2.7.2' # JavaScript compressor
gem 'flickraw'
gem 'jquery-rails'
gem 'jquery-ui-rails', '~> 5.0.2'
gem 'js-routes' # provides access to Rails routes in Javascript
gem 'flickraw'
gem 'leaflet-rails'
gem 'leaflet-markercluster-rails'
gem 'unicorn' # http server
gem 'pg'
gem 'figaro' # for handling config via ENV variables
gem 'cancancan', '~> 1.9' # for checking member privileges
gem 'gibbon', '~>1.2.0' # for Mailchimp newsletter subscriptions
gem 'csv_shaper' # CSV export
gem 'figaro' # for handling config via ENV variables
gem 'gibbon', '~>1.2.0' # for Mailchimp newsletter subscriptions
gem 'leaflet-markercluster-rails'
gem 'leaflet-rails', '~> 0.7.7' # Newer versions break tests - see https://travis-ci.org/CloCkWeRX/growstuff/builds/200984350
gem 'pg'
gem 'ruby-units' # for unit conversion
gem 'unicorn' # http server
gem 'comfortable_mexican_sofa', '~> 1.12.0' # content management system
gem 'kaminari' # pagination
gem 'bootstrap-kaminari-views' # bootstrap views for kaminari
gem 'kaminari', '~> 0.17.0' # pagination
gem 'activemerchant'
gem 'active_utils'
@@ -63,25 +63,37 @@ gem 'geocoder'
gem 'bootstrap-datepicker-rails'
# For connecting to other services (eg Twitter)
gem 'omniauth'
gem 'omniauth-twitter'
gem 'omniauth-flickr', '>= 0.0.15'
gem 'omniauth', '~> 1.3'
gem 'omniauth-facebook'
gem 'omniauth-flickr', '>= 0.0.15'
gem 'omniauth-twitter', '~> 1.2'
# For charting data
gem 'd3-rails', '~> 3.5' # 4.* produces Error: <spyOn> : could not find an object to spy upon for linear() - see https://travis-ci.org/Growstuff/growstuff/jobs/204461482
# client for Elasticsearch. Elasticsearch is a flexible
# and powerful, distributed, real-time search and analytics engine.
# An example of the use in the project is fuzzy crop search.
# Project does not use semver, so we want to be in sync with the version of
# elasticsearch we use
# See https://github.com/elastic/elasticsearch-ruby#compatibility
gem "elasticsearch-api", "~> 2.0.0"
gem "elasticsearch-model"
gem "elasticsearch-rails"
gem "hashie", ">= 3.5.3"
gem 'rake', '>= 10.0.0'
# # CMS
# gem 'comfortable_mexican_sofa', '~> 1.12.0'
group :production, :staging do
gem 'newrelic_rpm'
gem 'bonsai-elasticsearch-rails' # Integration with Bonsa-Elasticsearch on heroku
gem 'dalli'
gem 'memcachier'
gem 'newrelic_rpm'
gem 'rails_12factor' # supresses heroku plugin injection
gem 'bonsai-elasticsearch-rails' # Integration with Bonsa-Elasticsearch on heroku
gem 'sparkpost_rails'
end
@@ -89,33 +101,41 @@ group :development do
# A debugger and irb alternative. Pry doesn't play nice
# with unicorn, so start a Webrick server when debugging
# with Pry
gem 'pry'
gem 'better_errors'
gem 'binding_of_caller'
gem 'letter_opener'
gem 'quiet_assets'
gem 'guard'
gem 'guard-rspec'
gem 'letter_opener'
gem 'pry'
gem 'quiet_assets'
end
group :development, :test do
gem 'haml-rails' # HTML templating language
gem 'rspec-rails' # unit testing framework
gem 'rspec-activemodel-mocks'
gem "active_merchant-paypal-bogus-gateway"
gem 'bullet' # performance tuning by finding unnecesary queries
gem 'byebug' # debugging
gem 'database_cleaner', '~> 1.5.0'
gem 'webrat' # provides HTML matchers for view tests
gem 'factory_girl_rails' # for creating test data
gem 'coveralls', require: false # coverage analysis
gem 'capybara' # integration tests
gem 'capybara-email' # integration tests for email
gem 'capybara-screenshot' # for test debugging
gem 'poltergeist', '~> 1.6' # for headless JS testing
gem 'coveralls', require: false # coverage analysis
gem 'database_cleaner', '~> 1.5.0'
gem 'factory_girl_rails' # for creating test data
gem 'haml-i18n-extractor'
gem 'haml-rails' # HTML templating language
gem 'haml_lint' # Checks haml files for goodness
gem 'i18n-tasks' # adds tests for finding missing and unused translations
gem 'jasmine' # javascript unit testing
gem 'poltergeist' # for headless JS testing
gem 'rainbow', '< 2.2.0' # See https://github.com/sickill/rainbow/issues/44
gem 'rspec-activemodel-mocks'
gem 'rspec-rails' # unit testing framework
gem 'rubocop', '<= 0.47.1', require: false # Pin to rubocop (0.47.1) as 0.48.0 is buggy
gem 'selenium-webdriver'
gem "codeclimate-test-reporter", group: :test, require: nil
gem "active_merchant-paypal-bogus-gateway"
gem 'rubocop', require: false
gem 'webrat' # provides HTML matchers for view tests
end
group :test do
gem 'codeclimate-test-reporter', require: false
end
group :travis do

View File

@@ -1,57 +1,58 @@
GEM
remote: https://rubygems.org/
specs:
actionmailer (4.2.7.1)
actionpack (= 4.2.7.1)
actionview (= 4.2.7.1)
activejob (= 4.2.7.1)
actionmailer (4.2.8)
actionpack (= 4.2.8)
actionview (= 4.2.8)
activejob (= 4.2.8)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 1.0, >= 1.0.5)
actionpack (4.2.7.1)
actionview (= 4.2.7.1)
activesupport (= 4.2.7.1)
actionpack (4.2.8)
actionview (= 4.2.8)
activesupport (= 4.2.8)
rack (~> 1.6)
rack-test (~> 0.6.2)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (4.2.7.1)
activesupport (= 4.2.7.1)
actionview (4.2.8)
activesupport (= 4.2.8)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
active_link_to (1.0.3)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
active_link_to (1.0.4)
actionpack
addressable
active_merchant-paypal-bogus-gateway (0.1.0)
activemerchant
active_utils (3.2.2)
activesupport (>= 3.2, < 5.1.0)
active_utils (3.3.3)
activesupport (>= 3.2, < 5.2.0)
i18n
activejob (4.2.7.1)
activesupport (= 4.2.7.1)
activejob (4.2.8)
activesupport (= 4.2.8)
globalid (>= 0.3.0)
activemerchant (1.60.0)
activemerchant (1.64.0)
activesupport (>= 3.2.14, < 5.1)
builder (>= 2.1.2, < 4.0.0)
i18n (>= 0.6.9)
nokogiri (~> 1.4)
activemodel (4.2.7.1)
activesupport (= 4.2.7.1)
activemodel (4.2.8)
activesupport (= 4.2.8)
builder (~> 3.1)
activerecord (4.2.7.1)
activemodel (= 4.2.7.1)
activesupport (= 4.2.7.1)
activerecord (4.2.8)
activemodel (= 4.2.8)
activesupport (= 4.2.8)
arel (~> 6.0)
activesupport (4.2.7.1)
activesupport (4.2.8)
i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.4.0)
arel (6.0.3)
addressable (2.5.1)
public_suffix (~> 2.0, >= 2.0.2)
arel (6.0.4)
ast (2.3.0)
autoprefixer-rails (6.4.0.2)
autoprefixer-rails (6.7.7.2)
execjs
bcrypt (3.1.11)
better_errors (2.1.1)
@@ -61,7 +62,9 @@ GEM
binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1)
bluecloth (2.2.0)
bonsai-elasticsearch-rails (0.0.4)
bonsai-elasticsearch-rails (0.2.0)
elasticsearch-model (~> 0)
elasticsearch-rails (~> 0)
bootstrap-datepicker-rails (1.6.4.1)
railties (>= 3.0)
bootstrap-kaminari-views (0.0.5)
@@ -70,11 +73,14 @@ GEM
bootstrap-sass (3.3.7)
autoprefixer-rails (>= 5.2.1)
sass (>= 3.3.4)
bootstrap_form (2.5.0)
builder (3.2.2)
byebug (9.0.5)
cancancan (1.15.0)
capybara (2.8.0)
bootstrap_form (2.6.0)
builder (3.2.3)
bullet (5.5.1)
activesupport (>= 3.0.0)
uniform_notifier (~> 1.10.0)
byebug (9.0.6)
cancancan (1.16.0)
capybara (2.13.0)
addressable
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
@@ -84,18 +90,17 @@ GEM
capybara-email (2.5.0)
capybara (~> 2.4)
mail
capybara-screenshot (1.0.13)
capybara-screenshot (1.0.14)
capybara (>= 1.0, < 3)
launchy
childprocess (0.5.9)
childprocess (0.6.3)
ffi (~> 1.0, >= 1.0.11)
climate_control (0.0.3)
activesupport (>= 3.0)
climate_control (0.1.0)
cliver (0.3.2)
cocaine (0.5.8)
climate_control (>= 0.0.3, < 1.0)
codeclimate-test-reporter (0.6.0)
simplecov (>= 0.7.1, < 1.0.0)
codeclimate-test-reporter (1.0.8)
simplecov (<= 0.13)
codemirror-rails (5.16.0)
railties (>= 3.0, < 6.0)
coderay (1.1.1)
@@ -105,8 +110,8 @@ GEM
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.10.0)
comfortable_mexican_sofa (1.12.9)
coffee-script-source (1.12.2)
comfortable_mexican_sofa (1.12.10)
active_link_to (>= 1.0.0)
bootstrap-sass (>= 3.2.0)
bootstrap_form (>= 2.2.0)
@@ -118,76 +123,78 @@ GEM
kramdown (>= 1.0.0)
paperclip (>= 4.0.0)
plupload-rails (>= 1.2.1)
rails (>= 4.0.0, < 5)
rails (>= 4.0.0, < 5.1)
rails-i18n (>= 4.0.0)
sass-rails (>= 4.0.3)
concurrent-ruby (1.0.2)
connection_pool (2.2.0)
coveralls (0.8.15)
concurrent-ruby (1.0.5)
connection_pool (2.2.1)
coveralls (0.8.19)
json (>= 1.8, < 3)
simplecov (~> 0.12.0)
term-ansicolor (~> 1.3)
thor (~> 0.19.1)
tins (>= 1.6.0, < 2)
tins (~> 1.6)
csv_shaper (1.3.0)
activesupport (>= 3.0.0)
d3-rails (3.5.17)
railties (>= 3.1)
dalli (2.7.6)
database_cleaner (1.5.3)
debug_inspector (0.0.2)
devise (4.2.0)
devise (4.2.1)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 4.1.0, < 5.1)
responders
warden (~> 1.2.3)
diff-lcs (1.2.5)
diff-lcs (1.3)
docile (1.1.5)
easy_translate (0.5.0)
json
thread
thread_safe
elasticsearch (2.0.0)
elasticsearch-api (= 2.0.0)
elasticsearch-transport (= 2.0.0)
elasticsearch-api (2.0.0)
elasticsearch (2.0.2)
elasticsearch-api (= 2.0.2)
elasticsearch-transport (= 2.0.2)
elasticsearch-api (2.0.2)
multi_json
elasticsearch-model (0.1.9)
activesupport (> 3)
elasticsearch (> 0.4)
hashie
elasticsearch-rails (0.1.9)
elasticsearch-transport (2.0.0)
elasticsearch-transport (2.0.2)
faraday
multi_json
erubis (2.7.0)
excon (0.51.0)
excon (0.55.0)
execjs (2.7.0)
factory_girl (4.7.0)
factory_girl (4.8.0)
activesupport (>= 3.0.0)
factory_girl_rails (4.7.0)
factory_girl (~> 4.7.0)
factory_girl_rails (4.8.0)
factory_girl (~> 4.8.0)
railties (>= 3.0.0)
faraday (0.9.2)
faraday (0.11.0)
multipart-post (>= 1.2, < 3)
ffi (1.9.14)
ffi (1.9.18)
figaro (1.1.1)
thor (~> 0.14)
flickraw (0.9.9)
font-awesome-sass (4.6.2)
font-awesome-sass (4.7.0)
sass (>= 3.2)
formatador (0.2.5)
friendly_id (5.0.5)
activerecord (>= 4.0.0)
geocoder (1.3.7)
geocoder (1.4.3)
gibbon (1.2.1)
httparty
multi_json (>= 1.9.0)
globalid (0.3.7)
activesupport (>= 4.1.0)
globalid (0.4.0)
activesupport (>= 4.2.0)
gravatar-ultimate (2.0.0)
activesupport (>= 2.3.14)
rack
guard (2.14.0)
guard (2.14.1)
formatador (>= 0.2.4)
listen (>= 2.7, < 4.0)
lumberjack (~> 1.0)
@@ -203,26 +210,38 @@ GEM
rspec (>= 2.99.0, < 4.0)
haml (4.0.7)
tilt
haml-i18n-extractor (0.5.9)
activesupport
haml
highline
tilt
trollop (= 1.16.2)
haml-rails (0.9.0)
actionpack (>= 4.0.1)
activesupport (>= 4.0.1)
haml (>= 4.0.6, < 5.0)
html2haml (>= 1.0.1)
railties (>= 4.0.1)
hashie (3.4.4)
haml_lint (0.24.0)
haml (>= 4.0, < 5.1)
rainbow
rake (>= 10, < 13)
rubocop (>= 0.47.0)
sysexits (~> 1.1)
hashie (3.5.5)
heroku-api (0.4.2)
excon (~> 0.45)
multi_json (~> 1.8)
highline (1.7.8)
html2haml (2.0.0)
html2haml (2.1.0)
erubis (~> 2.7.0)
haml (~> 4.0.0)
nokogiri (~> 1.6.0)
haml (~> 4.0)
nokogiri (>= 1.6.0)
ruby_parser (~> 3.5)
httparty (0.14.0)
multi_xml (>= 0.5.2)
i18n (0.7.0)
i18n-tasks (0.9.5)
i18n (0.8.1)
i18n-tasks (0.9.12)
activesupport (>= 4.0.2)
ast (>= 2.1.0)
easy_translate (>= 0.5.0)
@@ -232,22 +251,28 @@ GEM
parser (>= 2.2.3.0)
term-ansicolor (>= 1.3.2)
terminal-table (>= 1.5.1)
jquery-rails (4.2.1)
jasmine (2.5.2)
jasmine-core (>= 2.5.1, < 3.0.0)
phantomjs
rack (>= 1.2.1)
rake
jasmine-core (2.5.2)
jquery-rails (4.3.1)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
jquery-ui-rails (5.0.5)
railties (>= 3.2.16)
js-routes (1.3.0)
js-routes (1.3.3)
railties (>= 3.2)
sprockets-rails
json (1.8.3)
jwt (1.5.4)
json (2.0.4)
jwt (1.5.6)
kaminari (0.17.0)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
kgio (2.10.0)
kramdown (1.12.0)
kgio (2.11.0)
kramdown (1.13.2)
launchy (2.4.3)
addressable (~> 2.3)
leaflet-markercluster-rails (0.7.0)
@@ -261,7 +286,7 @@ GEM
ruby_dep (~> 1.2)
loofah (2.0.3)
nokogiri (>= 1.5.9)
lumberjack (1.0.10)
lumberjack (1.0.11)
mail (2.6.4)
mime-types (>= 1.16, < 4)
memcachier (0.0.2)
@@ -271,29 +296,28 @@ GEM
mime-types-data (3.2016.0521)
mimemagic (0.3.2)
mini_portile2 (2.1.0)
minitest (5.9.0)
minitest (5.10.1)
multi_json (1.11.3)
multi_xml (0.5.5)
multi_xml (0.6.0)
multipart-post (2.0.0)
nenv (0.3.0)
newrelic_rpm (3.16.1.320)
nokogiri (1.6.8)
newrelic_rpm (4.1.0.333)
nokogiri (1.7.1)
mini_portile2 (~> 2.1.0)
pkg-config (~> 1.1.7)
notiffany (0.1.1)
nenv (~> 0.1)
shellany (~> 0.0)
oauth (0.5.1)
oauth2 (1.2.0)
faraday (>= 0.8, < 0.10)
oauth2 (1.3.1)
faraday (>= 0.8, < 0.12)
jwt (~> 1.0)
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (>= 1.2, < 3)
omniauth (1.3.1)
hashie (>= 1.2, < 4)
rack (>= 1.0, < 3)
omniauth-facebook (3.0.0)
omniauth (1.6.1)
hashie (>= 3.4.6, < 3.6.0)
rack (>= 1.6.2, < 3)
omniauth-facebook (4.0.0)
omniauth-oauth2 (~> 1.2)
omniauth-flickr (0.0.19)
multi_json (~> 1.11.0)
@@ -304,9 +328,9 @@ GEM
omniauth-oauth2 (1.4.0)
oauth2 (~> 1.0)
omniauth (~> 1.2)
omniauth-twitter (1.2.1)
json (~> 1.3)
omniauth-twitter (1.4.0)
omniauth-oauth (~> 1.1)
rack
orm_adapter (0.5.0)
paperclip (5.1.0)
activemodel (>= 4.2.0)
@@ -314,13 +338,13 @@ GEM
cocaine (~> 0.5.5)
mime-types
mimemagic (~> 0.3.0)
parser (2.3.1.2)
parser (2.4.0.0)
ast (~> 2.2)
pg (0.18.4)
pkg-config (1.1.7)
pg (0.20.0)
phantomjs (2.1.1.0)
plupload-rails (1.2.1)
rails (>= 3.1)
poltergeist (1.10.0)
poltergeist (1.14.0)
capybara (~> 2.1)
cliver (~> 0.3.1)
websocket-driver (>= 0.2.0)
@@ -329,29 +353,30 @@ GEM
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
public_suffix (2.0.5)
quiet_assets (1.1.0)
railties (>= 3.1, < 5.0)
rack (1.6.4)
rack (1.6.5)
rack-protection (1.5.3)
rack
rack-test (0.6.3)
rack (>= 1.0)
rails (4.2.7.1)
actionmailer (= 4.2.7.1)
actionpack (= 4.2.7.1)
actionview (= 4.2.7.1)
activejob (= 4.2.7.1)
activemodel (= 4.2.7.1)
activerecord (= 4.2.7.1)
activesupport (= 4.2.7.1)
rails (4.2.8)
actionmailer (= 4.2.8)
actionpack (= 4.2.8)
actionview (= 4.2.8)
activejob (= 4.2.8)
activemodel (= 4.2.8)
activerecord (= 4.2.8)
activesupport (= 4.2.8)
bundler (>= 1.3.0, < 2.0)
railties (= 4.2.7.1)
railties (= 4.2.8)
sprockets-rails
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
rails-dom-testing (1.0.7)
rails-dom-testing (1.0.8)
activesupport (>= 4.2.0.beta, < 5.0)
nokogiri (~> 1.6.0)
nokogiri (~> 1.6)
rails-deprecated_sanitizer (>= 1.0.1)
rails-html-sanitizer (1.0.3)
loofah (~> 2.0)
@@ -363,18 +388,18 @@ GEM
rails_stdout_logging
rails_serve_static_assets (0.0.5)
rails_stdout_logging (0.0.5)
railties (4.2.7.1)
actionpack (= 4.2.7.1)
activesupport (= 4.2.7.1)
railties (4.2.8)
actionpack (= 4.2.8)
activesupport (= 4.2.8)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rainbow (2.1.0)
raindrops (0.17.0)
rake (11.2.2)
rb-fsevent (0.9.7)
rb-inotify (0.9.7)
raindrops (0.18.0)
rake (12.0.0)
rb-fsevent (0.9.8)
rb-inotify (0.9.8)
ffi (>= 0.5.0)
redis (3.3.1)
redis (3.3.3)
responders (2.3.0)
railties (>= 4.2.0, < 5.1)
rspec (3.5.0)
@@ -385,7 +410,7 @@ GEM
activemodel (>= 3.0)
activesupport (>= 3.0)
rspec-mocks (>= 2.99, < 4.0)
rspec-core (3.5.2)
rspec-core (3.5.4)
rspec-support (~> 3.5.0)
rspec-expectations (3.5.0)
diff-lcs (>= 1.2.0, < 2.0)
@@ -393,7 +418,7 @@ GEM
rspec-mocks (3.5.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
rspec-rails (3.5.1)
rspec-rails (3.5.2)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
@@ -402,83 +427,83 @@ GEM
rspec-mocks (~> 3.5.0)
rspec-support (~> 3.5.0)
rspec-support (3.5.0)
rubocop (0.45.0)
parser (>= 2.3.1.1, < 3.0)
rubocop (0.47.1)
parser (>= 2.3.3.1, < 3.0)
powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.7)
unicode-display_width (~> 1.0, >= 1.0.1)
ruby-progressbar (1.8.1)
ruby-units (2.0.1)
ruby_dep (1.4.0)
ruby_parser (3.8.2)
ruby-units (2.1.0)
ruby_dep (1.5.0)
ruby_parser (3.9.0)
sexp_processor (~> 4.1)
rubyzip (1.2.0)
sass (3.4.22)
rubyzip (1.2.1)
sass (3.4.23)
sass-rails (5.0.6)
railties (>= 4.0.0, < 6)
sass (~> 3.1)
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (>= 1.1, < 3)
selenium-webdriver (2.53.4)
selenium-webdriver (3.3.0)
childprocess (~> 0.5)
rubyzip (~> 1.0)
websocket (~> 1.0)
sexp_processor (4.7.0)
sexp_processor (4.9.0)
shellany (0.0.1)
sidekiq (4.1.4)
sidekiq (4.2.10)
concurrent-ruby (~> 1.0)
connection_pool (~> 2.2, >= 2.2.0)
rack-protection (>= 1.5.0)
redis (~> 3.2, >= 3.2.1)
sinatra (>= 1.4.7)
simplecov (0.12.0)
docile (~> 1.1.0)
json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.0)
sinatra (1.4.7)
rack (~> 1.5)
rack-protection (~> 1.4)
tilt (>= 1.3, < 3)
slop (3.6.0)
sparkpost_rails (1.4.0)
rails (>= 4.0, < 5.1)
sprockets (3.7.0)
sprockets (3.7.1)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (3.1.1)
sprockets-rails (3.2.0)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
term-ansicolor (1.3.2)
sysexits (1.2.0)
term-ansicolor (1.6.0)
tins (~> 1.0)
terminal-table (1.6.0)
thor (0.19.1)
terminal-table (1.7.3)
unicode-display_width (~> 1.1.1)
thor (0.19.4)
thread (0.2.2)
thread_safe (0.3.5)
tilt (2.0.5)
tins (1.12.0)
tzinfo (1.2.2)
thread_safe (0.3.6)
tilt (2.0.7)
tins (1.13.2)
trollop (1.16.2)
tzinfo (1.2.3)
thread_safe (~> 0.1)
uglifier (2.7.2)
execjs (>= 0.3.0)
json (>= 1.8.0)
unicode-display_width (1.1.1)
unicorn (5.1.0)
unicode-display_width (1.1.3)
unicorn (5.3.0)
kgio (~> 2.6)
raindrops (~> 0.7)
warden (1.2.6)
uniform_notifier (1.10.0)
warden (1.2.7)
rack (>= 1.0)
webrat (0.7.3)
nokogiri (>= 1.2.0)
rack (>= 1.0)
rack-test (>= 0.5.3)
websocket (1.2.3)
websocket-driver (0.6.4)
websocket (1.2.4)
websocket-driver (0.6.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.2)
will_paginate (3.1.0)
will_paginate (3.1.5)
xpath (2.0.0)
nokogiri (~> 1.3)
@@ -496,6 +521,7 @@ DEPENDENCIES
bootstrap-datepicker-rails
bootstrap-kaminari-views
bootstrap-sass (~> 3.3.6)
bullet
bundler (>= 1.1.5)
byebug
cancancan (~> 1.9)
@@ -507,9 +533,11 @@ DEPENDENCIES
comfortable_mexican_sofa (~> 1.12.0)
coveralls
csv_shaper
d3-rails (~> 3.5)
dalli
database_cleaner (~> 1.5.0)
devise (>= 4.0.0)
elasticsearch-api (~> 2.0.0)
elasticsearch-model
elasticsearch-rails
factory_girl_rails
@@ -523,32 +551,37 @@ DEPENDENCIES
guard
guard-rspec
haml
haml-i18n-extractor
haml-rails
haml_lint
hashie (>= 3.5.3)
heroku-api
i18n-tasks
jasmine
jquery-rails
jquery-ui-rails (~> 5.0.2)
js-routes
kaminari
kaminari (~> 0.17.0)
leaflet-markercluster-rails
leaflet-rails
leaflet-rails (~> 0.7.7)
letter_opener
memcachier
newrelic_rpm
omniauth
omniauth (~> 1.3)
omniauth-facebook
omniauth-flickr (>= 0.0.15)
omniauth-twitter
omniauth-twitter (~> 1.2)
pg
poltergeist (~> 1.6)
poltergeist
pry
quiet_assets
rails (~> 4.2.1)
rails (~> 4.2.7)
rails_12factor
rainbow (< 2.2.0)
rake (>= 10.0.0)
rspec-activemodel-mocks
rspec-rails
rubocop
rubocop (<= 0.47.1)
ruby-units
sass-rails (~> 5.0.4)
selenium-webdriver
@@ -560,7 +593,7 @@ DEPENDENCIES
will_paginate (~> 3.0)
RUBY VERSION
ruby 2.3.1p112
ruby 2.3.4p301
BUNDLED WITH
1.13.6
1.14.6

View File

@@ -1,6 +1,6 @@
# Growstuff
[![Build Status](https://travis-ci.org/Growstuff/growstuff.png)](https://travis-ci.org/Growstuff/growstuff)
[![Build Status](https://travis-ci.org/Growstuff/growstuff.svg?branch=dev)](https://travis-ci.org/Growstuff/growstuff)
[![Coverage Status](https://coveralls.io/repos/Growstuff/growstuff/badge.png)](https://coveralls.io/r/Growstuff/growstuff)
[![Code Climate](https://codeclimate.com/github/Growstuff/growstuff/badges/gpa.svg)](https://codeclimate.com/github/Growstuff/growstuff)
@@ -19,7 +19,6 @@ encourage participation from people of all backgrounds and skill levels.
* [Issues](http://github.com/Growstuff/growstuff/issues) (features we're
working on, known bugs, etc)
* [Discussion forums](http://talk.growstuff.org/) (design ideas, planning releases)
* [IRC](https://webchat.freenode.net/) growstuff channel (general chat, brainstorming and troubleshooting) or [Gitter](https://gitter.im/Growstuff/growstuff)
* [Wiki](https://github.com/Growstuff/growstuff/wiki) (general documentation, etc. Help by migrating from the [old wiki](https://web.archive.org/web/*/wiki.growstuff.org))
@@ -30,8 +29,7 @@ frontend features. We welcome contributions -- see
[CONTRIBUTING](CONTRIBUTING.md) for details.
* To set up your development environment, see [Getting started](https://github.com/Growstuff/growstuff/wiki/New-contributor-guide).
* We encourage [pair programming](http://wiki.growstuff.org/index.php/Pairing), especially for newer developers. [Find a pair programming partner.](http://talk.growstuff.org/t/find-a-pair-programming-partner/13)
* Drop in to our [discussion forums](http://talk.growstuff.org/), IRC or Gitter to chat to other developers, get help, etc.
* We encourage [pair programming](http://wiki.growstuff.org/index.php/Pairing), especially for newer developers.
* You may also be interested in our [API](https://github.com/Growstuff/growstuff/wiki/API).
## For designers, writers, researchers, data wranglers, and other contributors
@@ -41,23 +39,23 @@ your skills and interests.
You might like to check out:
* The [Get Involved](http://wiki.growstuff.org/index.php/Get_involved)
* The [New Contributor Guide](https://github.com/Growstuff/growstuff/wiki/New-contributor-guide)
page on our wiki, which has lots of detail for different areas
* [Growstuff Talk](http://talk.growstuff.org/) especially the [Idea category](http://talk.growstuff.org/c/idea)
Here on Github, you might find these useful:
* [Waffle](http://waffle.io/Growstuff/growstuff) has stories in "ready" that can be worked on.
* [needs: design](https://github.com/Growstuff/growstuff/labels/needs:%20design) - tasks requiring high-level design
* [needs: visual design](https://github.com/Growstuff/growstuff/labels/needs:%20visual design) - tasks requiring visual/graphical design
* [needs: documentation](https://github.com/Growstuff/growstuff/labels/needs:%20documentation)
* [needs: data](https://github.com/Growstuff/growstuff/labels/needs:%20data) - tasks requiring data entry, data design, data import, or similar
* [curated:beginner](https://github.com/Growstuff/growstuff/labels/curated:%20beginner) - tasks that are ideal for beginner programmers or people new to the project
Feel free to comment on any of the issues you find there, or open up a broader conversation on [Growstuff Talk](http://talk.growstuff.org).
Feel free to comment on any of the issues on [Github](https://github.com/Growstuff/growstuff/issues).
## Contact
For more information about this project, contact [info@growstuff.org](mailto:info@growstuff.org).
You can also contact us on [Twitter](http://twitter.com/growstufforg/) or
[Facebook](https://www.facebook.com/pages/Growstuff/1531133417099494).
[Facebook](https://www.facebook.com/pages/Growstuff/1531133417099494) or [Github](https://github.com/Growstuff/growstuff/issues)..

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

View File

@@ -1,3 +1,5 @@
//= require graphs/horizontal_bar_graph
if (document.getElementById("cropmap") !== null) {
mapbox_map_id = "<%= Rails.env == 'test' ? 0 : Growstuff::Application.config.mapbox_map_id %>";
mapbox_access_token = "<%= Rails.env == 'test' ? 0 : Growstuff::Application.config.mapbox_access_token %>";
@@ -49,6 +51,41 @@ function showCropMap(cropmap) {
cropmap.addLayer(markers);
}
function plantingStats(crop) {
var sunniness_counts = { 'empty': 0, 'sun': 0, 'semi-shade': 0, 'shade': 0 };
$.each(crop.plantings, function(i, planting) {
if (planting.sunniness) {
sunniness_counts[planting.sunniness]++;
} else {
sunniness_counts['Empty']++;
}
});
return [
{name: 'Empty', value: sunniness_counts['empty']},
{name: 'Sun', value: sunniness_counts['sun']},
{name: 'Semi-shade', value: sunniness_counts['semi-shade']},
{name: 'Shade', value: sunniness_counts['shade']}
];
}
if ($("#sunchart")[0] !== null) {
var HorizontalBarGraph = growstuff.HorizontalBarGraph;
$.getJSON(location.pathname + '.json', function (crop) {
data = {
bars: plantingStats(crop),
bar_color: 'steelblue',
width: {size: 300, scale: 'linear'},
height: {size: 100, scale: 'ordinal'},
//left is used to shift the bars over so that there is
//room for the labels
margin: {top: 0, right: 0, bottom: 0, left: 100}
};
var graph = new HorizontalBarGraph(data);
graph.render(d3.select($('#sunchart')[0]));
});
}
$('.btn.toggle.crop-hierarchy').click(function () {
$('.toggle.crop-hierarchy').toggleClass('hide');
});

View File

@@ -0,0 +1,50 @@
//= require graphs/width_scale
//= require graphs/height_scale
(function(){
'use strict';
/*
This represents bars for a bar graph.
Currently these are used for HorizontalBarGraph.
*/
var growstuff = (window.growstuff = window.growstuff || {});
var WidthScale = growstuff.WidthScale;
var HeightScale = growstuff.HeightScale;
function BarGroup(data) {
this._data = data;
}
BarGroup.prototype.render = function(root){
var data = this._data;
var bars = this._data.bars;
var widthScale = new WidthScale(data).render();
var heightScale = new HeightScale(data).render();
return root.append('g')
.attr("class", "bar")
.selectAll("rect")
.data(bars.map(function(bar) { return bar.value; }))
.enter()
.append("rect")
.attr("y", function(d, i){
return heightScale(i);
})
.attr("height", heightScale.rangeBand())
.attr("fill", data.bar_color)
.attr("width", function(d){
return widthScale(d);
})
.append("title")
.text(function(d){
return 'This value is ' + d + '.';
});
};
growstuff.BarGroup = BarGroup;
}());

View File

@@ -0,0 +1,40 @@
(function() {
'use strict';
/*
This file draws the labels to the left of each bar.
*/
var growstuff = (window.growstuff = window.growstuff || {});
function BarLabelGroup(data) {
this._data = data;
}
BarLabelGroup.prototype.render = function(d3){
var bars = this._data.bars;
//vvcopy pasta from spike vv -- this is a good candidate for refactor
var barHeight = 40;
return d3.append('g')
.attr("class", "bar-label")
.selectAll("text")
.data(bars.map(function(bar){ return bar.name;}))
.enter()
.append("text")
.attr('x', -80)
.attr('y', function(d, i){
//shrink the margin between each label to give them an even spread with
//bars
var barLabelSpread = 2/3;
//move them downward to line up with bars
var barLabelTopEdge = 17;
return i * barHeight * (barLabelSpread) + barLabelTopEdge;
})
.text(function(d){return d;});
};
growstuff.BarLabelGroup = BarLabelGroup;
}());

View File

@@ -0,0 +1,29 @@
//=require d3
/*
Height Scale is used to map the number of bars to the display size of
the svg
*/
(function(){
'use strict';
var growstuff = (window.growstuff = window.growstuff || {});
function HeightScale(data){
this._data = data;
}
HeightScale.prototype.render = function(){
var data = this._data;
var scaleType = data.height.scale;
var axisSize = data.height.size;
return d3.scale[scaleType]()
.domain(d3.range(data.bars.length))
.rangeRoundBands([0, data.height.size], 0.05, 0);
};
growstuff.HeightScale = HeightScale;
}());

View File

@@ -0,0 +1,51 @@
//= require d3
//= require graphs/bar_group
//= require graphs/bar_label_group
/*
Horizontal Bar Graph represents sum total of the graph including all of the parts:
Bars
Bar Labels
The main dimensions of the graph are rendered here.
*/
(function() {
'use strict';
var growstuff = (window.growstuff = window.growstuff || {});
var BarGroup = growstuff.BarGroup;
var BarLabelGroup = growstuff.BarLabelGroup;
function HorizontalBarGraph(data) {
this._data = data;
this._d3 = d3;
}
HorizontalBarGraph.prototype.render = function(root) {
var bars = this._data.bars;
var width = this._data.width;
var height = this._data.height;
var barLabelGroup = new BarLabelGroup(this._data);
var margin = this._data.margin;
var barGroup = new BarGroup(this._data);
var svg = root
.append("svg")
.attr("width", width.size + margin.left + margin.right)
.attr("height", height.size + margin.top + margin.bottom)
.append("g")
.attr("class","bar-graph")
.attr("transform","translate(" + margin.left + "," + margin.top + ")");
barGroup.render(svg);
barLabelGroup.render(svg);
return svg;
};
growstuff.HorizontalBarGraph = HorizontalBarGraph;
}());

View File

@@ -0,0 +1,33 @@
//=require d3
/*
Width scale is used to map the value for the length of each bar
to the display size of the svg
*/
(function(){
'use strict';
var growstuff = (window.growstuff = window.growstuff || {});
function WidthScale (data){
this._data = data;
}
WidthScale.prototype.render = function() {
var data = this._data;
var scaleType = data.width.scale;
var axisSize = data.width.size;
return d3.scale[scaleType]()
.domain([0, this.getMaxValue()])
.range([0, axisSize]);
};
WidthScale.prototype.getMaxValue = function(){
return d3.max(this._data.bars.map(function(bar) { return bar.value; }));
};
growstuff.WidthScale = WidthScale;
}());

View File

@@ -0,0 +1,18 @@
$(document).ready(function () {
$('.post-like').show();
$('.post-like').on('ajax:success', function(event, data) {
var like_control = $('#post-' + data.id + ' .post-like');
$('#post-' + data.id + ' .like-count').text(data.description);
if (data.liked_by_member) {
like_control.data("method", "delete");
like_control.attr("href", data.url);
like_control.text("Unlike");
} else {
like_control.data("method", "post");
like_control.attr("href", '/likes.json?post_id=' + data.id);
like_control.text("Like");
}
});
});

View File

@@ -21,10 +21,10 @@ $ ->
$('#remove-sci_name-row').click ->
if (sci_index > 2)
sci_index = sci_index - 1
tmp = 'sci_template[' + sci_index + ']'
element = document.getElementById(tmp)
element.remove()
sci_index = sci_index - 1
tmp = 'sci_template[' + sci_index + ']'
element = document.getElementById(tmp)
element.remove()
alt_template = "<div id='alt_template[INDEX]' class='template col-md-12'><div class='col-md-2'><label>Alternate name INDEX:</label></div><div class='col-md-8'><input name='alt_name[INDEX]' class='form-control', id='alt_name[INDEX]')'></input><span class='help-block'>Alternate name of crop.</span></div><div class='col-md-2'></div></div>"

View File

@@ -5,3 +5,4 @@
@import 'leaflet.markercluster.default'
@import 'custom_bootstrap/custom_bootstrap'
@import 'overrides'
@import 'graphs'

View File

@@ -11,12 +11,13 @@ $brown: #413f3b
$green: #5f8e43
$blue: #2f4365
$red: #8e4d43
$orange: #b2685c
$orange: #ffa500
$yellow: #b2935c
$body-bg: $beige
$text-color: $brown
$link-color: $green
$graph-hover: $orange
$brand-primary: $green

View File

@@ -0,0 +1,2 @@
.bar rect:hover
fill: $graph-hover

View File

@@ -319,9 +319,6 @@ $state-success-bg: lighten($green, 50%)
text-overflow: ellipsis
overflow: hidden
#gardens_panel_body
height: 20em
.form-group.required .control-label:before
content: "* "
color: red
@@ -336,3 +333,6 @@ $state-success-bg: lighten($green, 50%)
overflow: hidden
text-overflow: ellipsis
white-space: nowrap
ul.plantings
list-style-type: none

View File

@@ -0,0 +1,38 @@
module Growstuff
module Constants
class PhotoModels
PLANTING = { type: 'planting', class: 'Planting', relation: 'plantings' }.freeze
HARVEST = { type: 'harvest', class: 'Harvest', relation: 'harvests' }.freeze
GARDEN = { type: 'garden', class: 'Garden', relation: 'gardens' }.freeze
SEED = { type: 'seed', class: 'Seed', relation: 'seeds' }.freeze
ALL = [PLANTING, HARVEST, GARDEN, SEED].freeze
def self.types
ALL.map do |model|
model[:type]
end
end
def self.relations
ALL.map do |model|
model[:relation]
end
end
def self.get_relation(object, type)
relation = ALL.select do |model|
model[:type] == type
end[0][:relation]
object.send(relation)
end
def self.get_item(type)
class_name = ALL.select do |model|
model[:type] == type
end[0][:class]
class_name.constantize
end
end
end
end

View File

@@ -1,73 +1,48 @@
class AccountTypesController < ApplicationController
before_filter :authenticate_member!
before_action :authenticate_member!
load_and_authorize_resource
respond_to :html
# GET /account_types
def index
@account_types = AccountType.all
respond_to do |format|
format.html # index.html.erb
end
respond_with(@account_types)
end
# GET /account_types/1
def show
@account_type = AccountType.find(params[:id])
respond_to do |format|
format.html # show.html.erb
end
respond_with(@account_types)
end
# GET /account_types/new
def new
@account_type = AccountType.new
respond_to do |format|
format.html # new.html.erb
end
respond_with(@account_type)
end
# GET /account_types/1/edit
def edit
@account_type = AccountType.find(params[:id])
respond_with(@account_type)
end
# POST /account_types
def create
@account_type = AccountType.new(account_type_params)
respond_to do |format|
if @account_type.save
format.html { redirect_to @account_type, notice: 'Account type was successfully created.' }
else
format.html { render action: "new" }
end
end
flash[:notice] = I18n.t('account_types.created') if @account_type.save
respond_with(@account_type)
end
# PUT /account_types/1
def update
@account_type = AccountType.find(params[:id])
respond_to do |format|
if @account_type.update(account_type_params)
format.html { redirect_to @account_type, notice: 'Account type was successfully updated.' }
else
format.html { render action: "edit" }
end
end
flash[:notice] = I18n.t('account_types.updated') if @account_type.update(account_type_params)
respond_with(@account_type)
end
# DELETE /account_types/1
def destroy
@account_type = AccountType.find(params[:id])
@account_type.destroy
respond_to do |format|
format.html { redirect_to account_types_url, notice: 'Account type was successfully deleted.' }
end
flash[:notice] = I18n.t('account_types.deleted')
respond_with(@account_type)
end
private

View File

@@ -1,41 +1,27 @@
class AccountsController < ApplicationController
before_filter :authenticate_member!
before_action :authenticate_member!
load_and_authorize_resource
respond_to :html
# GET /accounts
def index
@accounts = Account.all
respond_to do |format|
format.html # index.html.erb
end
respond_with(@accounts)
end
# GET /accounts/1
def show
@account = Account.find(params[:id])
respond_to do |format|
format.html # show.html.erb
end
respond_with(@account)
end
# GET /accounts/1/edit
def edit
@account = Account.find(params[:id])
end
# PUT /accounts/1
def update
@account = Account.find(params[:id])
respond_to do |format|
if @account.update(params[:account])
format.html { redirect_to @account, notice: 'Account detail was successfully updated.' }
else
format.html { render action: "edit" }
end
end
flash[:notice] = I18n.t('account.update') if @account.update(params[:account])
respond_with(@account)
end
private
@@ -43,5 +29,4 @@ class AccountsController < ApplicationController
def account_params
params.require(:account).permit(:account_type_id, :member_id, :paid_until)
end
end

View File

@@ -8,7 +8,7 @@ class Admin::OrdersController < ApplicationController
def search
authorize! :manage, :all
@orders = Order.search({by: params[:search_by], for: params[:search_text]})
@orders = Order.search(by: params[:search_by], for: params[:search_text])
if @orders.empty?
flash[:alert] = "Couldn't find order with #{params[:search_by]} = #{params[:search_text]}"
@@ -17,6 +17,5 @@ class Admin::OrdersController < ApplicationController
respond_to do |format|
format.html # index.html.haml
end
end
end

View File

@@ -1,34 +1,24 @@
class AlternateNamesController < ApplicationController
before_filter :authenticate_member!, except: [:index, :show]
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
# GET /alternate_names
# GET /alternate_names.json
def index
@alternate_names = AlternateName.all
respond_to do |format|
format.html # index.html.haml
format.json { render json: @alternate_names }
end
respond_with(@alternate_names)
end
# GET /alternate_names/new
# GET /alternate_names/new.json
def new
@alternate_name = AlternateName.new
@crop = Crop.find_by_id(params[:crop_id]) || Crop.new
respond_to do |format|
format.html # new.html.haml
format.json { render json: @alternate_name }
end
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
end
# GET /alternate_names/1/edit
def edit
@alternate_name = AlternateName.find(params[:id])
end
def edit; end
# POST /alternate_names
# POST /alternate_names.json
@@ -36,46 +26,29 @@ class AlternateNamesController < ApplicationController
params[:alternate_name][:creator_id] = current_member.id
@alternate_name = AlternateName.new(alternate_name_params)
respond_to do |format|
if @alternate_name.save
format.html { redirect_to @alternate_name.crop, notice: 'Alternate name was successfully created.' }
format.json { render json: @alternate_name, status: :created, location: @alternate_name }
else
format.html { render action: "new" }
format.json { render json: @alternate_name.errors, status: :unprocessable_entity }
end
if @alternate_name.save
redirect_to @alternate_name.crop, notice: 'Alternate name was successfully created.'
else
render action: "new"
end
end
# PUT /alternate_names/1
# PUT /alternate_names/1.json
def update
@alternate_name = AlternateName.find(params[:id])
respond_to do |format|
if @alternate_name.update(alternate_name_params)
format.html { redirect_to @alternate_name.crop, notice: 'Alternate name was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @alternate_name.errors, status: :unprocessable_entity }
end
if @alternate_name.update(alternate_name_params)
redirect_to @alternate_name.crop, notice: 'Alternate name was successfully updated.'
else
render action: "edit"
end
end
# DELETE /alternate_names/1
# DELETE /alternate_names/1.json
def destroy
@alternate_name = AlternateName.find(params[:id])
@crop = @alternate_name.crop
@alternate_name.destroy
respond_to do |format|
format.html {
redirect_to @crop, notice: 'Alternate name was successfully deleted.'
}
format.json { head :no_content }
end
redirect_to @crop, notice: 'Alternate name was successfully deleted.'
end
private

View File

@@ -3,18 +3,17 @@ class ApplicationController < ActionController::Base
include ApplicationHelper
after_filter :store_location
before_filter :set_locale
after_action :store_location
before_action :set_locale
def store_location
if (request.path != "/members/sign_in" &&
request.path != "/members/sign_up" &&
request.path != "/members/password/new" &&
request.path != "/members/password/edit" &&
request.path != "/members/confirmation" &&
request.path != "/members/sign_out" &&
!request.xhr?)
store_location_for(:member, request.fullpath)
unless request.path.in?(["/members/sign_in",
"/members/sign_up",
"/members/password/new",
"/members/password/edit",
"/members/confirmation",
"/members/sign_out"]) || request.xhr?
store_location_for(:member, request.fullpath)
end
end
@@ -23,7 +22,7 @@ class ApplicationController < ActionController::Base
end
def after_sign_out_path_for(resource_or_scope)
request.referrer
request.referer
end
# tweak CanCan defaults because we don't have a "current_user" method
@@ -60,8 +59,7 @@ class ApplicationController < ActionController::Base
# profile stuff
:bio, :location, :latitude, :longitude,
# email settings
:show_email, :newsletter, :send_notification_email, :send_planting_reminder
)
:show_email, :newsletter, :send_notification_email, :send_planting_reminder)
end
devise_parameter_sanitizer.permit(:account_update) do |member|
@@ -73,10 +71,12 @@ class ApplicationController < ActionController::Base
:bio, :location, :latitude, :longitude,
# email settings
:show_email, :newsletter, :send_notification_email, :send_planting_reminder,
#update password
:current_password
)
# update password
:current_password)
end
end
def expire_homepage
expire_fragment("homepage_stats")
end
end

View File

@@ -1,5 +1,5 @@
class AuthenticationsController < ApplicationController
before_filter :authenticate_member!
before_action :authenticate_member!
load_and_authorize_resource
# POST /authentications
@@ -10,15 +10,16 @@ class AuthenticationsController < ApplicationController
name = Growstuff::OauthSignupAction.new.determine_name(auth)
@authentication = current_member.authentications
.create_with(
name: name,
token: auth['credentials']['token'],
secret: auth['credentials']['secret']
)
.find_or_create_by(
provider: auth['provider'],
uid: auth['uid'],
name: name)
.create_with(
name: name,
token: auth['credentials']['token'],
secret: auth['credentials']['secret']
)
.find_or_create_by(
provider: auth['provider'],
uid: auth['uid'],
name: name
)
flash[:notice] = "Authentication successful."
else
@@ -29,7 +30,6 @@ class AuthenticationsController < ApplicationController
# DELETE /authentications/1
def destroy
@authentication = Authentication.find(params[:id])
@authentication.destroy
respond_to do |format|

View File

@@ -1,97 +1,67 @@
class CommentsController < ApplicationController
before_filter :authenticate_member!, except: [:index, :show]
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
respond_to :rss, only: :index
# GET /comments
# GET /comments.json
# GET /comments.rss
def index
@comments = Comment.paginate(page: params[:page])
respond_to do |format|
format.html # index.html.erb
format.json { render json: @comments }
format.rss { render layout: false }
end
respond_with(@comments)
end
# GET /comments/new
# GET /comments/new.json
def new
@comment = Comment.new
@post = Post.find_by_id(params[:post_id])
@post = Post.find_by(id: params[:post_id])
if @post
@comments = @post.comments
respond_to do |format|
format.html # new.html.erb
format.json { render json: @comment }
end
respond_with(@comment)
else
redirect_to request.referer || root_url,
alert: "Can't post a comment on a non-existent post"
redirect_to(request.referer || root_url,
alert: "Can't post a comment on a non-existent post")
end
end
# GET /comments/1/edit
def edit
@comment = Comment.find(params[:id])
@comments = @comment.post.comments
end
# POST /comments
# POST /comments.json
def create
params[:comment][:author_id] = current_member.id
@comment = Comment.new(comment_params)
respond_to do |format|
if @comment.save
format.html { redirect_to @comment.post, notice: "Comment was successfully created." }
format.json { render json: @comment, status: :created, location: @comment }
else
format.html { render action: "new" }
format.json { render json: @comment.errors, status: :unprocessable_entity }
end
end
@comment.author = current_member
flash[:notice] = "Comment was successfully created." if @comment.save
respond_with(@comment.post)
end
# PUT /comments/1
# PUT /comments/1.json
def update
@comment = Comment.find(params[:id])
# you should never be able to change the author or post when
# updating
params[:comment].delete("post_id")
params[:comment].delete("author_id")
respond_to do |format|
if @comment.update(comment_params)
format.html { redirect_to @comment.post, notice: 'Comment was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @comment.errors, status: :unprocessable_entity }
end
# only body can be updated
if @comment.update(body: comment_params['body'])
flash[:notice] = 'Comment was successfully updated.'
end
respond_with(@comment.post)
end
# DELETE /comments/1
# DELETE /comments/1.json
def destroy
@comment = Comment.find(params[:id])
@post = @comment.post
@comment.destroy
respond_to do |format|
format.html { redirect_to @post }
format.json { head :no_content }
end
respond_with(@post)
end
private
def comment_params
params.require(:comment).permit(:author_id, :body, :post_id)
params.require(:comment).permit(:body, :post_id)
end
end

View File

@@ -1,7 +1,7 @@
require 'will_paginate/array'
class CropsController < ApplicationController
before_filter :authenticate_member!, except: [:index, :hierarchy, :search, :show]
before_action :authenticate_member!, except: [:index, :hierarchy, :search, :show]
load_and_authorize_resource
skip_authorize_resource only: [:hierarchy, :search]
@@ -9,15 +9,14 @@ class CropsController < ApplicationController
# GET /crops.json
def index
@sort = params[:sort]
if @sort == 'alpha'
# alphabetical order
@crops = Crop.includes(:scientific_names, {plantings: :photos})
@paginated_crops = @crops.approved.paginate(page: params[:page])
else
# default to sorting by popularity
@crops = Crop.popular.includes(:scientific_names, {plantings: :photos})
@paginated_crops = @crops.approved.paginate(page: params[:page])
end
@crops = if @sort == 'alpha'
Crop.includes(:scientific_names, plantings: :photos)
else
popular_crops
end
@paginated_crops = @crops.approved.paginate(page: params[:page])
@has_requested_pending = Crop.pending_approval.where(requester: current_member).count if current_member
respond_to do |format|
format.html
@@ -34,17 +33,21 @@ class CropsController < ApplicationController
end
end
def requested
@requested = Crop.pending_approval.where(requester: current_member).paginate(page: params[:page])
end
# GET /crops/wrangle
def wrangle
@approval_status = params[:approval_status]
case @approval_status
when "pending"
@crops = Crop.pending_approval
when "rejected"
@crops = Crop.rejected
else
@crops = Crop.recent
end
@crops = case @approval_status
when "pending"
Crop.pending_approval
when "rejected"
Crop.rejected
else
Crop.recent
end
@crops = @crops.paginate(page: params[:page])
@@ -77,7 +80,7 @@ class CropsController < ApplicationController
# GET /crops/1
# GET /crops/1.json
def show
@crop = Crop.includes(:scientific_names, {plantings: :photos}).find(params[:id])
@crop = Crop.includes(:scientific_names, plantings: :photos).find(params[:id])
@posts = @crop.posts.paginate(page: params[:page])
respond_to do |format|
@@ -90,10 +93,10 @@ class CropsController < ApplicationController
}
}
render json: @crop.to_json(include: {
plantings: {
include: owner_structure
}
})
plantings: {
include: owner_structure
}
})
end
end
end
@@ -113,19 +116,16 @@ class CropsController < ApplicationController
# GET /crops/1/edit
def edit
@crop = Crop.find(params[:id])
@crop.alternate_names.build if @crop.alternate_names.blank?
@crop.scientific_names.build if @crop.scientific_names.blank?
end
# POST /crops
# POST /crops.json
def create
@crop = Crop.new(crop_params)
if current_member.has_role? :crop_wrangler
if current_member.role? :crop_wrangler
@crop.creator = current_member
success_msg = "Crop was successfully created."
else
@@ -137,14 +137,14 @@ class CropsController < ApplicationController
respond_to do |format|
if @crop.save
params[:alt_name].each do |index, value|
@crop.alternate_names.create(name: value, creator_id: current_member.id)
create_name('alternate', value)
end
params[:sci_name].each do |index, value|
@crop.scientific_names.create(scientific_name: value, creator_id: current_member.id)
create_name('scientific', value)
end
unless current_member.has_role? :crop_wrangler
unless current_member.role? :crop_wrangler
Role.crop_wranglers.each do |w|
Notifier.new_crop_request(w, @crop).deliver_later!
Notifier.new_crop_request(w, @crop).deliver_now!
end
end
@@ -160,36 +160,20 @@ class CropsController < ApplicationController
# PUT /crops/1
# PUT /crops/1.json
def update
@crop = Crop.find(params[:id])
previous_status = @crop.approval_status
@crop.creator = current_member if previous_status == "pending"
respond_to do |format|
if @crop.update(crop_params)
if !params[:alt_name].nil?
@crop.alternate_names.each do |alt_name|
alt_name.destroy
end
params[:alt_name].each do |index, value|
alt_name = @crop.alternate_names.create(name: value, creator_id: current_member.id)
end
@crop.scientific_names.each do |sci_name|
sci_name.destroy
end
params[:sci_name].each do |index, value|
sci_name = @crop.scientific_names.create(scientific_name: value, creator_id: current_member.id)
end
end
recreate_names('alt_name', 'alternate')
recreate_names('sci_name', 'scientific')
if previous_status == "pending"
requester = @crop.requester
new_status = @crop.approval_status
Notifier.crop_request_approved(requester, @crop).deliver_later! if new_status == "approved"
Notifier.crop_request_rejected(requester, @crop).deliver_later! if new_status == "rejected"
Notifier.crop_request_approved(requester, @crop).deliver_now! if new_status == "approved"
Notifier.crop_request_rejected(requester, @crop).deliver_now! if new_status == "rejected"
end
format.html { redirect_to @crop, notice: 'Crop was successfully updated.' }
format.json { head :no_content }
@@ -203,7 +187,6 @@ class CropsController < ApplicationController
# DELETE /crops/1
# DELETE /crops/1.json
def destroy
@crop = Crop.find(params[:id])
@crop.destroy
respond_to do |format|
@@ -214,7 +197,38 @@ class CropsController < ApplicationController
private
def popular_crops
Crop.popular.includes(:scientific_names, plantings: :photos)
end
def recreate_names(param_name, name_type)
return unless params[param_name].present?
destroy_names(name_type)
params[param_name].each do |index, value|
create_name(name_type, value)
end
end
def destroy_names(name_type)
@crop.send("#{name_type}_names").each do |alt_name|
alt_name.destroy
end
end
def create_name(name_type, value)
@crop.send("#{name_type}_names").create(name: value, creator_id: current_member.id)
end
def crop_params
params.require(:crop).permit(:en_wikipedia_url, :name, :parent_id, :creator_id, :approval_status, :request_notes, :reason_for_rejection, :rejection_notes, scientific_names_attributes: [:scientific_name, :_destroy, :id])
params.require(:crop).permit(:en_wikipedia_url,
:name,
:parent_id,
:creator_id,
:approval_status,
:request_notes,
:reason_for_rejection,
:rejection_notes, scientific_names_attributes: [:scientific_name,
:_destroy,
:id])
end
end

View File

@@ -1,15 +1,14 @@
class FollowsController < ApplicationController
before_filter :authenticate_member!
before_action :authenticate_member!
load_and_authorize_resource
skip_load_resource only: :create
# POST /follows
def create
@follow = current_member.follows.build(followed_id: follow_params[:followed_id])
if @follow.save
flash[:notice] = "Followed #{ @follow.followed.login_name }"
flash[:notice] = "Followed #{@follow.followed.login_name}"
redirect_to :back
else
flash[:error] = "Already following or error while following."
@@ -23,7 +22,7 @@ class FollowsController < ApplicationController
unfollowed_name = @follow.followed.login_name
@follow.destroy
flash[:notice] = "Unfollowed #{ unfollowed_name }"
flash[:notice] = "Unfollowed #{unfollowed_name}"
redirect_to root_path
end

View File

@@ -1,86 +1,51 @@
class ForumsController < ApplicationController
load_and_authorize_resource
respond_to :html, :json
# GET /forums
# GET /forums.json
def index
@forums = Forum.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @forums }
end
respond_with(@forums)
end
# GET /forums/1
# GET /forums/1.json
def show
@forum = Forum.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @forum }
end
respond_with(@forum)
end
# GET /forums/new
# GET /forums/new.json
def new
@forum = Forum.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @forum }
end
respond_with(@forum)
end
# GET /forums/1/edit
def edit
@forum = Forum.find(params[:id])
end
def edit; end
# POST /forums
# POST /forums.json
def create
@forum = Forum.new(forum_params)
respond_to do |format|
if @forum.save
format.html { redirect_to @forum, notice: 'Forum was successfully created.' }
format.json { render json: @forum, status: :created, location: @forum }
else
format.html { render action: "new" }
format.json { render json: @forum.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Forum was successfully created.' if @forum.save
respond_with(@forum)
end
# PUT /forums/1
# PUT /forums/1.json
def update
@forum = Forum.find(params[:id])
respond_to do |format|
if @forum.update(forum_params)
format.html { redirect_to @forum, notice: 'Forum was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @forum.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Forum was successfully updated.' if @forum.update(forum_params)
respond_with(@forum)
end
# DELETE /forums/1
# DELETE /forums/1.json
def destroy
@forum = Forum.find(params[:id])
@forum.destroy
respond_to do |format|
format.html { redirect_to forums_url, notice: 'Forum was successfully deleted' }
format.json { head :no_content }
end
flash[:notice] = 'Forum was successfully deleted'
redirect_to forums_url
end
private

View File

@@ -1,101 +1,68 @@
class GardensController < ApplicationController
before_filter :authenticate_member!, except: [:index, :show]
before_action :authenticate_member!, except: [:index, :show]
after_action :expire_homepage, only: [:create, :delete]
load_and_authorize_resource
respond_to :html, :json
# GET /gardens
# GET /gardens.json
def index
@gardens = Garden.paginate(page: params[:page])
@owner = Member.find_by_slug(params[:owner])
if @owner
@gardens = @owner.gardens.paginate(page: params[:page])
end
@owner = Member.find_by(slug: params[:owner])
@show_all = params[:all] == '1'
@gardens = gardens
respond_to do |format|
format.html # index.html.erb
format.json { render json: @gardens }
end
respond_with(@gardens)
end
# GET /gardens/1
# GET /gardens/1.json
def show
@garden = Garden.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @garden }
end
respond_with(@garden)
end
# GET /gardens/new
# GET /gardens/new.json
def new
@garden = Garden.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @garden }
end
respond_with(@garden)
end
# GET /gardens/1/edit
def edit
@garden = Garden.find(params[:id])
end
def edit; end
# POST /gardens
# POST /gardens.json
def create
params[:garden][:owner_id] = current_member.id
@garden = Garden.new(garden_params)
respond_to do |format|
if @garden.save
format.html { redirect_to @garden, notice: 'Garden was successfully created.' }
format.json { render json: @garden, status: :created, location: @garden }
expire_fragment("homepage_stats")
else
format.html { render action: "new" }
format.json { render json: @garden.errors, status: :unprocessable_entity }
end
end
@garden.owner_id = current_member.id
flash[:notice] = I18n.t('gardens.created') if @garden.save
respond_with(@garden)
end
# PUT /gardens/1
# PUT /gardens/1.json
def update
@garden = Garden.find(params[:id])
respond_to do |format|
if @garden.update(garden_params)
format.html { redirect_to @garden, notice: 'Garden was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @garden.errors, status: :unprocessable_entity }
end
end
flash[:notice] = I18n.t('gardens.updated') if @garden.update(garden_params)
respond_with(@garden)
end
# DELETE /gardens/1
# DELETE /gardens/1.json
def destroy
@garden = Garden.find(params[:id])
@garden.destroy
expire_fragment("homepage_stats")
respond_to do |format|
format.html { redirect_to gardens_by_owner_path(owner: @garden.owner), notice: 'Garden was successfully deleted.' }
format.json { head :no_content }
end
flash[:notice] = I18n.t('gardens.deleted')
redirect_to(gardens_by_owner_path(owner: @garden.owner))
end
private
def garden_params
params.require(:garden).permit(:name, :slug, :owner_id, :description, :active,
:location, :latitude, :longitude, :area, :area_unit)
params.require(:garden).permit(:name, :slug, :description, :active,
:location, :latitude, :longitude, :area, :area_unit)
end
def gardens
g = @owner ? @owner.gardens : Garden.all
g = g.active unless @show_all
g.includes(:owner).order(:updated_at).paginate(page: params[:page])
end
end

View File

@@ -1,100 +1,99 @@
class HarvestsController < ApplicationController
before_filter :authenticate_member!, except: [:index, :show]
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
respond_to :csv, only: :index
# GET /harvests
# GET /harvests.json
def index
@owner = Member.find_by_slug(params[:owner])
@crop = Crop.find_by_slug(params[:crop])
if @owner
@harvests = @owner.harvests.includes(:owner, :crop)
elsif @crop
@harvests = @crop.harvests.includes(:owner, :crop)
else
@harvests = Harvest.includes(:owner, :crop)
end
@owner = Member.find_by(slug: params[:owner])
@crop = Crop.find_by(slug: params[:crop])
@planting = Planting.find_by(slug: params['planting_id'])
respond_to do |format|
format.html { @harvests = @harvests.paginate(page: params[:page]) }
format.json { render json: @harvests }
format.csv do
specifics = (@owner ? "#{@owner.login_name}-" : @crop ? "#{@crop.name}-" : nil)
@filename = "Growstuff-#{specifics}Harvests-#{Time.zone.now.to_s(:number)}.csv"
render csv: @harvests
end
end
@harvests = harvests
@filename = csv_filename
respond_with(@harvests)
end
# GET /harvests/1
# GET /harvests/1.json
def show
@matching_plantings = matching_plantings if @harvest.owner == current_member
respond_with(@harvest)
end
# GET /harvests/new
# GET /harvests/new.json
def new
@harvest = Harvest.new('harvested_at' => Date.today)
@harvest = Harvest.new(harvested_at: Time.zone.today)
@planting = Planting.find_by(slug: params[:planting_id]) if params[:planting_id]
# using find_by_id here because it returns nil, unlike find
@crop = Crop.find_by_id(params[:crop_id]) || Crop.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @harvest }
end
@crop = Crop.find_by(id: params[:crop_id])
respond_with(@harvest)
end
# GET /harvests/1/edit
def edit
@harvest = Harvest.find(params[:id])
@planting = @harvest.planting if @harvest.planting_id
end
# POST /harvests
# POST /harvests.json
def create
params[:harvest][:owner_id] = current_member.id
params[:harvested_at] = parse_date(params[:harvested_at])
@harvest = Harvest.new(harvest_params)
respond_to do |format|
if @harvest.save
format.html { redirect_to @harvest, notice: 'Harvest was successfully created.' }
format.json { render json: @harvest, status: :created, location: @harvest }
else
format.html { render action: "new" }
format.json { render json: @harvest.errors, status: :unprocessable_entity }
end
end
@harvest.crop_id = @harvest.planting.crop_id if @harvest.planting_id
flash[:notice] = I18n.t('harvests.created') if @harvest.save
respond_with(@harvest)
end
# PUT /harvests/1
# PUT /harvests/1.json
def update
@harvest = Harvest.find(params[:id])
respond_to do |format|
if @harvest.update(harvest_params)
format.html { redirect_to @harvest, notice: 'Harvest was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @harvest.errors, status: :unprocessable_entity }
end
end
flash[:notice] = I18n.t('harvests.updated') if @harvest.update(harvest_params)
respond_with(@harvest)
end
# DELETE /harvests/1
# DELETE /harvests/1.json
def destroy
@harvest = Harvest.find(params[:id])
@harvest.destroy
respond_to do |format|
format.html { redirect_to harvests_url }
format.json { head :no_content }
end
respond_with(@harvest)
end
private
def harvest_params
params.require(:harvest).permit(:crop_id, :harvested_at, :description, :owner_id,
:quantity, :unit, :weight_quantity, :weight_unit, :plant_part_id, :slug, :si_weight)
params.require(:harvest)
.permit(:planting_id, :crop_id, :harvested_at, :description,
:quantity, :unit, :weight_quantity, :weight_unit,
:plant_part_id, :slug, :si_weight)
.merge(owner_id: current_member.id)
end
def matching_plantings
Planting.where(crop: @harvest.crop, owner: @harvest.owner)
.where('(planted_at IS NULL OR planted_at <= ?)', @harvest.harvested_at)
.where('(finished_at IS NULL OR finished_at >= ?)', @harvest.harvested_at)
end
def harvests
if @owner
@owner.harvests
elsif @crop
@crop.harvests
elsif @planting_id
@planting.harvests
else
Harvest
end.includes(:owner, :crop).paginate(page: params[:page])
end
def csv_filename
specifics = if @owner
"#{@owner.login_name}-"
elsif @crop
"#{@crop.name}-"
end
"Growstuff-#{specifics}Harvests-#{Time.zone.now.to_s(:number)}.csv"
end
end

View File

@@ -2,7 +2,6 @@ class HomeController < ApplicationController
skip_authorize_resource
def index
# we were previously generating a lot of instance variables like
# @members_count and @interesting_crops in here, but now we call
# the relevant class methods directly in the view, so that fragment
@@ -12,5 +11,4 @@ class HomeController < ApplicationController
format.html # index.html.haml
end
end
end

View File

@@ -0,0 +1,57 @@
class LikesController < ApplicationController
before_action :authenticate_member!
respond_to :html, :json
def create
@like = Like.new(member: current_member, likeable: find_likeable)
return failed(@like, message: 'Unable to like') unless @like.likeable && @like.save
success(@like, liked_by_member: true, status_code: :created)
end
def destroy
@like = Like.find_by(id: params[:id], member: current_member)
return failed(@like, message: 'Unable to unlike') unless @like && @like.destroy
success(@like, liked_by_member: false, status_code: :ok)
end
private
def find_likeable
Post.find(params[:post_id]) if params[:post_id]
end
def render_json(like, liked_by_member: true)
{
id: like.likeable.id,
liked_by_member: liked_by_member,
description: ActionController::Base.helpers.pluralize(like.likeable.likes.count, "like"),
url: like_path(like, format: :json)
}
end
def success(like, liked_by_member: nil, status_code: nil)
respond_to do |format|
format.html { redirect_to like.likeable }
format.json do
render(json: render_json(like, liked_by_member: liked_by_member),
status: status_code)
end
end
end
def failed(like, message)
respond_to do |format|
format.json { render(json: { 'error': message }, status: :forbidden) }
format.html do
flash[:error] = message
if like && like.likeable
redirect_to like.likeable
else
redirect_to root_path
end
end
end
end
end

View File

@@ -1,21 +1,26 @@
class MembersController < ApplicationController
load_and_authorize_resource
load_and_authorize_resource except: [:finish_signup, :unsubscribe, :view_follows, :view_followers, :show]
skip_authorize_resource only: [:nearby, :unsubscribe, :finish_signup]
after_action :expire_cache_fragments, only: :create
def index
@sort = params[:sort]
if @sort == 'recently_joined'
@members = Member.confirmed.recently_joined.paginate(page: params[:page])
else
@members = Member.confirmed.paginate(page: params[:page])
end
@members = if @sort == 'recently_joined'
Member.confirmed.recently_joined.paginate(page: params[:page])
else
Member.confirmed.paginate(page: params[:page])
end
respond_to do |format|
format.html # index.html.haml
format.json { render json: @members.to_json(only: [:id, :login_name, :slug, :bio, :created_at, :location, :latitude, :longitude]) }
format.json {
render json: @members.to_json(only: [
:id, :login_name,
:slug, :bio, :created_at,
:location, :latitude, :longitude
])
}
end
end
@@ -25,6 +30,7 @@ class MembersController < ApplicationController
@flickr_auth = @member.auth('flickr')
@facebook_auth = @member.auth('facebook')
@posts = @member.posts
@gardens = @member.gardens.active.order(:name)
# The garden form partial is called from the "New Garden" tab;
# it requires a garden to be passed in @garden.
# The new garden is not persisted unless Garden#save is called.
@@ -32,11 +38,18 @@ class MembersController < ApplicationController
respond_to do |format|
format.html # show.html.haml
format.json { render json: @member.to_json(only: [:id, :login_name, :bio, :created_at, :slug, :location, :latitude, :longitude]) }
format.rss { render(
layout: false,
locals: { member: @member }
)}
format.json {
render json: @member.to_json(only: [
:id, :login_name, :bio,
:created_at, :slug, :location,
:latitude, :longitude
])
}
format.rss {
render(
layout: false,
locals: { member: @member }
)}
end
end
@@ -56,32 +69,30 @@ class MembersController < ApplicationController
}
def unsubscribe
begin
verifier = ActiveSupport::MessageVerifier.new(ENV['RAILS_SECRET_TOKEN'])
decrypted_message = verifier.verify(params[:message])
verifier = ActiveSupport::MessageVerifier.new(ENV['RAILS_SECRET_TOKEN'])
decrypted_message = verifier.verify(params[:message])
@member = Member.find(decrypted_message[:member_id])
@type = decrypted_message[:type]
@member.update(@type => false)
@member = Member.find(decrypted_message[:member_id])
@type = decrypted_message[:type]
@member.update(@type => false)
flash.now[:notice] = "You have been unsubscribed from #{EMAIL_TYPE_STRING[@type]} emails."
flash.now[:notice] = I18n.t('members.unsubscribed', email_type: EMAIL_TYPE_STRING[@type])
rescue ActiveSupport::MessageVerifier::InvalidSignature
flash.now[:alert] = "We're sorry, there was an error updating your settings."
end
rescue ActiveSupport::MessageVerifier::InvalidSignature
flash.now[:alert] = I18n.t('members.unsubscribe.error')
end
def finish_signup
@member = current_member
if request.patch? && params[:member]
if @member.update(member_params)
@member.skip_reconfirmation!
bypass_sign_in(@member)
redirect_to root_path, notice: 'Welcome.'
else
flash[:alert] = 'Failed to complete signup'
@show_errors = true
end
return unless request.patch? && params[:member]
if @member.update(member_params)
@member.skip_reconfirmation!
bypass_sign_in(@member)
redirect_to root_path, notice: I18n.t('members.welcome')
else
flash[:alert] = I18n.t('members.signup.error')
@show_errors = true
end
end

View File

@@ -1,79 +1,57 @@
class NotificationsController < ApplicationController
include NotificationsHelper
before_filter :authenticate_member!
before_action :authenticate_member!
load_and_authorize_resource
respond_to :html
# GET /notifications
def index
@notifications = Notification.where(recipient_id: current_member).page(params[:page])
respond_to do |format|
format.html # index.html.erb
end
@notifications = Notification.by_recipient(current_member).page(params[:page])
end
# GET /notifications/1
def show
@notification = Notification.find(params[:id])
@notification.read = true
@notification.save
@reply_link = reply_link(@notification)
respond_to do |format|
format.html # show.html.erb
end
end
# GET /notifications/new
def new
@notification = Notification.new
@recipient = Member.find_by_id(params[:recipient_id])
@recipient = Member.find_by(id: params[:recipient_id])
@subject = params[:subject] || ""
respond_to do |format|
format.html # new.html.erb
end
end
# GET /notifications/1/reply
def reply
@notification = Notification.new
@sender_notification = Notification.find(params[:id])
@sender_notification = Notification.find_by(id: params[:id], recipient: current_member)
@sender_notification.read = true
@sender_notification.save
@recipient = @sender_notification.sender
@subject = @sender_notification.subject =~ /^Re: / ?
@sender_notification.subject :
"Re: " + @sender_notification.subject
respond_to do |format|
format.html # reply.html.haml
end
end
# DELETE /notifications/1
def destroy
@notification = Notification.find(params[:id])
@notification.destroy
respond_to do |format|
format.html { redirect_to notifications_url }
end
redirect_to notifications_url
end
# POST /notifications
def create
params[:notification][:sender_id] = current_member.id
@notification = Notification.new(notification_params)
@recipient = Member.find_by_id(params[:notification][:recipient_id])
@recipient = Member.find_by(id: params[:notification][:recipient_id])
respond_to do |format|
if @notification.save
format.html { redirect_to notifications_path, notice: 'Message was successfully sent.' }
else
format.html { render action: "new" }
end
if @notification.save
redirect_to notifications_path, notice: 'Message was successfully sent.'
else
render action: "new"
end
end

View File

@@ -10,6 +10,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
create
end
def failure
flash[:alert] = "Authentication failed."
redirect_to request.env['omniauth.origin'] || "/"
@@ -22,22 +23,21 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
action = Growstuff::OauthSignupAction.new
@authentication = nil
if auth
member = action.find_or_create_from_authorization(auth)
@authentication = action.establish_authentication(auth, member)
unless action.member_created?
sign_in_and_redirect member, event: :authentication #this will throw if @user is not activated
set_flash_message(:notice, :success, kind: auth['provider']) if is_navigational_format?
else
raise "Invalid provider" unless ['facebook', 'twitter', 'flickr'].index(auth['provider'].to_s)
return redirect_to request.env['omniauth.origin'] || edit_member_registration_path unless auth
session["devise.#{auth['provider']}_data"] = request.env["omniauth.auth"]
sign_in member
redirect_to finish_signup_url(member)
end
member = action.find_or_create_from_authorization(auth)
@authentication = action.establish_authentication(auth, member)
unless action.member_created?
sign_in_and_redirect member, event: :authentication # this will throw if @user is not activated
set_flash_message(:notice, :success, kind: auth['provider']) if is_navigational_format?
else
redirect_to request.env['omniauth.origin'] || edit_member_registration_path
raise "Invalid provider" unless ['facebook', 'twitter', 'flickr'].index(auth['provider'].to_s)
session["devise.#{auth['provider']}_data"] = request.env["omniauth.auth"]
sign_in member
redirect_to finish_signup_url(member)
end
end

View File

@@ -1,5 +1,5 @@
class OrderItemsController < ApplicationController
before_filter :authenticate_member!
before_action :authenticate_member!
load_and_authorize_resource
# POST /order_items

View File

@@ -1,10 +1,10 @@
class OrdersController < ApplicationController
before_filter :authenticate_member!
before_action :authenticate_member!
load_and_authorize_resource
# GET /orders
def index
@orders = Order.where(member_id: current_member.id)
@orders = Order.by_member(current_member)
respond_to do |format|
format.html # index.html.erb
@@ -13,8 +13,6 @@ class OrdersController < ApplicationController
# GET /orders/1
def show
@order = Order.find(params[:id])
respond_to do |format|
format.html # show.html.erb
end
@@ -31,8 +29,6 @@ class OrdersController < ApplicationController
# checkout with PayPal
def checkout
@order = Order.find(params[:id])
respond_to do |format|
if @order.update_attributes(referral_code: params[:referral_code])
response = EXPRESS_GATEWAY.setup_purchase(
@@ -49,13 +45,10 @@ class OrdersController < ApplicationController
format.html { render action: "show" }
end
end
end
def complete
@order = Order.find(params[:id])
if (params[:token] && params['PayerID'])
if params[:token] && params['PayerID']
purchase = EXPRESS_GATEWAY.purchase(
@order.total,
currency: Growstuff::Application.config.currency,
@@ -78,11 +71,9 @@ class OrdersController < ApplicationController
respond_to do |format|
format.html # new.html.erb
end
end
def cancel
@order = Order.find(params[:id])
respond_to do |format|
format.html { redirect_to shop_url, notice: 'Order was cancelled.' }
end
@@ -90,7 +81,6 @@ class OrdersController < ApplicationController
# DELETE /orders/1
def destroy
@order = Order.find(params[:id])
@order.destroy
respond_to do |format|

View File

@@ -1,6 +1,6 @@
class PasswordsController < Devise::PasswordsController
protected
protected
def after_resetting_password_path_for(resource)
root_path
end

View File

@@ -1,132 +1,104 @@
class PhotosController < ApplicationController
before_filter :authenticate_member!, except: [:index, :show]
before_action :authenticate_member!, except: [:index, :show]
after_action :expire_homepage, only: [:create, :delete]
load_and_authorize_resource
respond_to :html, :json
# GET /photos
# GET /photos.json
def index
@photos = Photo.paginate(page: params[:page])
respond_to do |format|
format.html # index.html.erb
format.json { render json: @photos }
end
respond_with(@photos)
end
# GET /photos/new
# GET /photos/new.json
def new
@photo = Photo.new
@type = params[:type]
@id = params[:id]
page = params[:page] || 1
@flickr_auth = current_member.auth('flickr')
@current_set = params[:set]
if @flickr_auth
@sets = current_member.flickr_sets
photos, total = current_member.flickr_photos(page, @current_set)
@photos = WillPaginate::Collection.create(page, 30, total) do |pager|
pager.replace photos
end
end
respond_to do |format|
format.html # new.html.erb
format.json { render json: @photo }
end
@photo = Photo.new
retrieve_from_flickr
respond_with(@photo)
end
# GET /photos/1/edit
def edit
@photo = Photo.find(params[:id])
end
# POST /photos
# POST /photos.json
def create
@photo = Photo.find_by_flickr_photo_id(params[:photo][:flickr_photo_id]) ||
Photo.new(photo_params)
@photo.owner_id = current_member.id
@photo.set_flickr_metadata
collection = case params[:type]
when 'garden'
@photo.gardens
when 'planting'
@photo.plantings
when 'harvest'
@photo.harvests
else
nil
end
if collection && has_item_id
item = params[:type].camelcase.constantize.find_by_id(params[:id])
if item && member_owns_item(item)
collection << item unless collection.include?(item)
else
flash[:alert] = "Could not find this item owned by you"
end
else
flash[:alert] = "Missing or invalid type or id parameter"
end
respond_to do |format|
if @photo.save
format.html { redirect_to @photo, notice: 'Photo was successfully added.' }
format.json { render json: @photo, status: :created, location: @photo }
else
format.html { render action: "new" }
format.json { render json: @photo.errors, status: :unprocessable_entity }
end
end
find_or_create_photo_from_flickr_photo
add_photo_to_collection
flash[:notice] = 'Photo was successfully added.' if @photo.present? && @photo.save
respond_with(@photo)
end
# PUT /photos/1
# PUT /photos/1.json
def update
@photo = Photo.find(params[:id])
respond_to do |format|
if @photo.update(photo_params)
format.html { redirect_to @photo, notice: 'Photo was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @photo.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Photo was successfully updated.' if @photo.update(photo_params)
respond_with(@photo)
end
# DELETE /photos/1
# DELETE /photos/1.json
def destroy
@photo = Photo.find(params[:id])
@photo.destroy
flash[:alert] = "Photo successfully deleted."
respond_to do |format|
format.html { redirect_to photos_url }
format.json { head :no_content }
end
respond_with(@photo)
end
private
def has_item_id
def item_id?
params.key? :id
end
def member_owns_item(item)
item.owner.id == current_member.id
def flickr_photo_id_param
params[:photo][:flickr_photo_id]
end
def photo_params
params.require(:photo).permit(:flickr_photo_id, :owner_id, :title, :license_name,
:license_url, :thumbnail_url, :fullsize_url, :link_url)
params.require(:photo).permit(:flickr_photo_id, :title, :license_name,
:license_url, :thumbnail_url, :fullsize_url, :link_url)
end
def find_or_create_photo_from_flickr_photo
@photo = Photo.find_by(flickr_photo_id: flickr_photo_id_param)
@photo = Photo.new(photo_params) unless @photo
@photo.owner_id = current_member.id
@photo.set_flickr_metadata
@photo
end
def add_photo_to_collection
raise "Missing or invalid type provided" unless Growstuff::Constants::PhotoModels.types.include?(params[:type])
raise "No item id provided" unless item_id?
collection = Growstuff::Constants::PhotoModels.get_relation(@photo, params[:type])
item_class = Growstuff::Constants::PhotoModels.get_item(params[:type])
item = item_class.find_by!(id: params[:id], owner_id: current_member.id)
raise "Could not find this item owned by you" unless item
collection << item unless collection.include?(item)
rescue => e
flash[:alert] = e.message
end
def retrieve_from_flickr
@flickr_auth = current_member.auth('flickr')
@current_set = params[:set]
return unless @flickr_auth
page = params[:page] || 1
@sets = current_member.flickr_sets
photos, total = current_member.flickr_photos(page, @current_set)
@photos = WillPaginate::Collection.create(page, 30, total) do |pager|
pager.replace photos
end
end
end

View File

@@ -5,7 +5,11 @@ class PlacesController < ApplicationController
respond_to do |format|
format.html
# json response is whatever we want to map here
format.json { render json: Member.located.to_json(only: [:id, :login_name, :slug, :location, :latitude, :longitude]) }
format.json do
render json: Member.located.to_json(only: [
:id, :login_name, :slug, :location, :latitude, :longitude
])
end
end
end
@@ -16,7 +20,11 @@ class PlacesController < ApplicationController
@nearby_members = Member.nearest_to(params[:place])
respond_to do |format|
format.html # show.html.haml
format.json { render json: @nearby_members.to_json(only: [:id, :login_name, :slug, :location, :latitude, :longitude]) }
format.json do
render json: @nearby_members.to_json(only: [
:id, :login_name, :slug, :location, :latitude, :longitude
])
end
end
end
@@ -35,5 +43,4 @@ class PlacesController < ApplicationController
end
end
end
end

View File

@@ -1,42 +1,29 @@
class PlantPartsController < ApplicationController
load_and_authorize_resource
respond_to :html, :json
# GET /plant_parts
# GET /plant_parts.json
def index
@plant_parts = PlantPart.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @plant_parts }
end
respond_with(@plant_parts)
end
# GET /plant_parts/1
# GET /plant_parts/1.json
def show
@plant_part = PlantPart.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @plant_part }
end
respond_with(@plant_part)
end
# GET /plant_parts/new
# GET /plant_parts/new.json
def new
@plant_part = PlantPart.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @plant_part }
end
respond_with(@plant_part)
end
# GET /plant_parts/1/edit
def edit
@plant_part = PlantPart.find(params[:id])
end
# POST /plant_parts
@@ -58,8 +45,6 @@ class PlantPartsController < ApplicationController
# PUT /plant_parts/1
# PUT /plant_parts/1.json
def update
@plant_part = PlantPart.find(params[:id])
respond_to do |format|
if @plant_part.update(plant_part_params)
format.html { redirect_to @plant_part, notice: 'Plant part was successfully updated.' }
@@ -74,7 +59,6 @@ class PlantPartsController < ApplicationController
# DELETE /plant_parts/1
# DELETE /plant_parts/1.json
def destroy
@plant_part = PlantPart.find(params[:id])
@plant_part.destroy
respond_to do |format|

View File

@@ -1,24 +1,19 @@
class PlantingsController < ApplicationController
before_filter :authenticate_member!, except: [:index, :show]
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
# GET /plantings
# GET /plantings.json
def index
@owner = Member.find_by_slug(params[:owner])
@crop = Crop.find_by_slug(params[:crop])
if @owner
@plantings = @owner.plantings.includes(:owner, :crop, :garden).paginate(page: params[:page])
elsif @crop
@plantings = @crop.plantings.includes(:owner, :crop, :garden).paginate(page: params[:page])
else
@plantings = Planting.includes(:owner, :crop, :garden).paginate(page: params[:page])
end
@owner = Member.find_by(slug: params[:owner]) if params[:owner]
@crop = Crop.find_by(slug: params[:crop]) if params[:crop]
@show_all = params[:all] == '1'
@plantings = plantings
respond_to do |format|
format.html { @plantings = @plantings.paginate(page: params[:page]) }
format.json { render json: @plantings }
format.rss { render layout: false } #index.rss.builder
format.rss { render layout: false } # index.rss.builder
format.csv do
specifics = (@owner ? "#{@owner.login_name}-" : @crop ? "#{@crop.name}-" : nil)
@filename = "Growstuff-#{specifics}Plantings-#{Time.zone.now.to_s(:number)}.csv"
@@ -41,11 +36,11 @@ class PlantingsController < ApplicationController
# GET /plantings/new
# GET /plantings/new.json
def new
@planting = Planting.new('planted_at' => Date.today)
@planting = Planting.new('planted_at' => Time.zone.today)
# using find_by_id here because it returns nil, unlike find
@crop = Crop.find_by_id(params[:crop_id]) || Crop.new
@garden = Garden.find_by_id(params[:garden_id]) || Garden.new
@crop = Crop.approved.find_by(id: params[:crop_id]) || Crop.new
@garden = Garden.find_by(owner: current_member, id: params[:garden_id]) || Garden.new
respond_to do |format|
format.html # new.html.erb
@@ -55,8 +50,6 @@ class PlantingsController < ApplicationController
# GET /plantings/1/edit
def edit
@planting = Planting.find(params[:id])
# the following are needed to display the form but aren't used
@crop = Crop.new
@garden = Garden.new
@@ -71,7 +64,8 @@ class PlantingsController < ApplicationController
respond_to do |format|
if @planting.save
@planting.update_attribute(:days_before_maturity, update_days_before_maturity(@planting, planting_params[:crop_id]))
@planting.update_attribute(:days_before_maturity,
update_days_before_maturity(@planting, planting_params[:crop_id]))
format.html { redirect_to @planting, notice: 'Planting was successfully created.' }
format.json { render json: @planting, status: :created, location: @planting }
expire_fragment("homepage_stats")
@@ -85,12 +79,12 @@ class PlantingsController < ApplicationController
# PUT /plantings/1
# PUT /plantings/1.json
def update
@planting = Planting.find(params[:id])
params[:planted_at] = parse_date(params[:planted_at])
respond_to do |format|
if @planting.update(planting_params)
@planting.update_attribute(:days_before_maturity, update_days_before_maturity(@planting, planting_params[:crop_id]))
@planting.update_attribute(:days_before_maturity,
update_days_before_maturity(@planting, planting_params[:crop_id]))
format.html { redirect_to @planting, notice: 'Planting was successfully updated.' }
format.json { head :no_content }
else
@@ -103,7 +97,6 @@ class PlantingsController < ApplicationController
# DELETE /plantings/1
# DELETE /plantings/1.json
def destroy
@planting = Planting.find(params[:id])
@garden = @planting.garden
@planting.destroy
expire_fragment("homepage_stats")
@@ -118,8 +111,8 @@ class PlantingsController < ApplicationController
def planting_params
params.require(:planting).permit(:crop_id, :description, :garden_id, :planted_at,
:quantity, :sunniness, :planted_from, :owner_id, :finished,
:finished_at)
:quantity, :sunniness, :planted_from, :owner_id, :finished,
:finished_at)
end
def update_days_before_maturity(planting, crop_id)
@@ -129,4 +122,16 @@ class PlantingsController < ApplicationController
(planting.finished_at - planting.planted_at).to_i
end
end
def plantings
p = if @owner
@owner.plantings
elsif @crop
@crop.plantings
else
Planting
end
p = p.current unless @show_all
p.includes(:owner, :crop, :garden).order(:created_at).paginate(page: params[:page])
end
end

View File

@@ -1,55 +1,36 @@
class PostsController < ApplicationController
before_filter :authenticate_member!, except: [:index, :show]
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
respond_to :rss, only: [:index, :show]
# GET /posts
# GET /posts.json
# GET /posts.rss
def index
@author = Member.find_by_slug(params[:author])
if @author
@posts = @author.posts.includes(:author, { comments: :author }).paginate(page: params[:page])
else
@posts = Post.includes(:author, { comments: :author }).paginate(page: params[:page])
end
respond_to do |format|
format.html # index.html.haml
format.json { render json: @posts }
format.rss { render layout: false } #index.rss.builder
end
@author = Member.find_by(slug: params[:author])
@posts = posts
respond_with(@posts)
end
# GET /posts/1
# GET /posts/1.json
# GET /posts/1.rss
def show
@post = Post.includes(:author, { comments: :author }).find(params[:id])
respond_to do |format|
format.html # show.html.haml
format.json { render json: @post }
format.rss { render(
layout: false,
locals: { post: @post }
)}
end
@post = Post.includes(:author, comments: :author).find(params[:id])
respond_with(@post)
end
# GET /posts/new
# GET /posts/new.json
def new
@post = Post.new
@forum = Forum.find_by_id(params[:forum_id])
respond_to do |format|
format.html # new.html.haml
format.json { render json: @post }
end
@forum = Forum.find_by(id: params[:forum_id])
respond_with(@post)
end
# GET /posts/1/edit
def edit
@post = Post.find(params[:id])
end
# POST /posts
@@ -57,44 +38,22 @@ class PostsController < ApplicationController
def create
params[:post][:author_id] = current_member.id
@post = Post.new(post_params)
respond_to do |format|
if @post.save
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.json { render json: @post, status: :created, location: @post }
else
format.html { render action: "new" }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Post was successfully created.' if @post.save
respond_with(@post)
end
# PUT /posts/1
# PUT /posts/1.json
def update
@post = Post.find(params[:id])
respond_to do |format|
if @post.update(post_params)
format.html { redirect_to @post, notice: 'Post was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Post was successfully updated.' if @post.update(post_params)
respond_with(@post)
end
# DELETE /posts/1
# DELETE /posts/1.json
def destroy
@post = Post.find(params[:id])
@post.destroy
respond_to do |format|
format.html { redirect_to posts_url, notice: 'Post was deleted.' }
format.json { head :no_content }
end
flash[:notice] = 'Post was deleted.' if @post.destroy
respond_with(@post)
end
private
@@ -102,4 +61,12 @@ class PostsController < ApplicationController
def post_params
params.require(:post).permit(:body, :subject, :author_id, :forum_id)
end
def posts
if @author
@author.posts
else
Post
end.includes(:author, comments: :author).paginate(page: params[:page])
end
end

View File

@@ -1,5 +1,5 @@
class ProductsController < ApplicationController
before_filter :authenticate_member!
before_action :authenticate_member!
load_and_authorize_resource
# GET /products
@@ -13,8 +13,6 @@ class ProductsController < ApplicationController
# GET /products/1
def show
@product = Product.find(params[:id])
respond_to do |format|
format.html # show.html.erb
end
@@ -31,7 +29,6 @@ class ProductsController < ApplicationController
# GET /products/1/edit
def edit
@product = Product.find(params[:id])
end
# POST /products
@@ -49,8 +46,6 @@ class ProductsController < ApplicationController
# PUT /products/1
def update
@product = Product.find(params[:id])
respond_to do |format|
if @product.update(product_params)
format.html { redirect_to @product, notice: 'Product was successfully updated.' }
@@ -62,7 +57,6 @@ class ProductsController < ApplicationController
# DELETE /products/1
def destroy
@product = Product.find(params[:id])
@product.destroy
respond_to do |format|
@@ -74,6 +68,6 @@ class ProductsController < ApplicationController
def product_params
params.require(:product).permit(:description, :min_price, :recommended_price, :name,
:account_type_id, :paid_months)
:account_type_id, :paid_months)
end
end

View File

@@ -8,23 +8,22 @@ class RegistrationsController < Devise::RegistrationsController
render "edit"
end
# we need this subclassed method so that Devise doesn't force people to
# change their password every time they want to edit their settings.
# we also check that they give their current password to change their password.
# Code copied from
# https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password
# we need this subclassed method so that Devise doesn't force people to
# change their password every time they want to edit their settings.
# we also check that they give their current password to change their password.
# Code copied from
# https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password
def update
@member = Member.find(current_member.id)
successfully_updated = if needs_password?(@member, params)
@member.update_with_password(devise_parameter_sanitizer.sanitize(:account_update))
if needs_password?(@member, params)
successfully_updated = @member.update_with_password(devise_parameter_sanitizer.sanitize(:account_update))
else
# remove the virtual current_password attribute
# update_without_password doesn't know how to ignore it
params[:member].delete(:current_password)
@member.update_without_password(devise_parameter_sanitizer.sanitize(:account_update))
successfully_updated = @member.update_without_password(devise_parameter_sanitizer.sanitize(:account_update))
end
if successfully_updated
@@ -35,12 +34,11 @@ class RegistrationsController < Devise::RegistrationsController
else
render "edit"
end
end
end
# check if we need the current password to update fields
def needs_password?(member, params)
params[:member][:password].present? ||
params[:member][:password_confirmation].present?
params[:member][:password_confirmation].present?
end

View File

@@ -1,14 +1,9 @@
class RobotsController < ApplicationController
DEFAULT_FILENAME = 'config/robots.txt'.freeze
def robots
filename = if subdomain && subdomain != 'www'
"config/robots.#{ subdomain }.txt"
end
file_to_render = File.exists?(filename.to_s) ? filename : DEFAULT_FILENAME
filename = "config/robots.#{subdomain}.txt" if subdomain && subdomain != 'www'
file_to_render = File.exist?(filename.to_s) ? filename : DEFAULT_FILENAME
render file: file_to_render, layout: false, content_type: 'text/plain'
end

View File

@@ -1,5 +1,5 @@
class RolesController < ApplicationController
before_filter :authenticate_member!
before_action :authenticate_member!
load_and_authorize_resource
# GET /roles
@@ -13,8 +13,6 @@ class RolesController < ApplicationController
# GET /roles/1
def show
@role = Role.find(params[:id])
respond_to do |format|
format.html # show.html.erb
end
@@ -31,7 +29,6 @@ class RolesController < ApplicationController
# GET /roles/1/edit
def edit
@role = Role.find(params[:id])
end
# POST /roles
@@ -49,8 +46,6 @@ class RolesController < ApplicationController
# PUT /roles/1
def update
@role = Role.find(params[:id])
respond_to do |format|
if @role.update(role_params)
format.html { redirect_to @role, notice: 'Role was successfully updated.' }
@@ -62,7 +57,6 @@ class RolesController < ApplicationController
# DELETE /roles/1
def destroy
@role = Role.find(params[:id])
@role.destroy
respond_to do |format|

View File

@@ -1,97 +1,62 @@
class ScientificNamesController < ApplicationController
before_filter :authenticate_member!, except: [:index, :show]
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
# GET /scientific_names
# GET /scientific_names.json
def index
@scientific_names = ScientificName.all
respond_to do |format|
format.html # index.html.haml
format.json { render json: @scientific_names }
end
respond_with(@scientific_names)
end
# GET /scientific_names/1
# GET /scientific_names/1.json
def show
@scientific_name = ScientificName.find(params[:id])
respond_to do |format|
format.html # show.html.haml
format.json { render json: @scientific_name }
end
respond_with(@scientific_name)
end
# GET /scientific_names/new
# GET /scientific_names/new.json
def new
@scientific_name = ScientificName.new
@crop = Crop.find_by_id(params[:crop_id]) || Crop.new
respond_to do |format|
format.html # new.html.haml
format.json { render json: @scientific_name }
end
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
respond_with(@scientific_name)
end
# GET /scientific_names/1/edit
def edit
@scientific_name = ScientificName.find(params[:id])
end
# POST /scientific_names
# POST /scientific_names.json
def create
params[:scientific_name][:creator_id] = current_member.id
@scientific_name = ScientificName.new(scientific_name_params)
@scientific_name.creator = current_member
respond_to do |format|
if @scientific_name.save
format.html { redirect_to @scientific_name.crop, notice: 'Scientific name was successfully created.' }
format.json { render json: @scientific_name, status: :created, location: @scientific_name }
else
format.html { render action: "new" }
format.json { render json: @scientific_name.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Scientific name was successfully created.' if @scientific_name.save
respond_with(@scientific_name.crop)
end
# PUT /scientific_names/1
# PUT /scientific_names/1.json
def update
@scientific_name = ScientificName.find(params[:id])
respond_to do |format|
if @scientific_name.update(scientific_name_params)
format.html { redirect_to @scientific_name.crop, notice: 'Scientific name was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @scientific_name.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Scientific name was successfully updated.' if @scientific_name.update(scientific_name_params)
respond_with(@scientific_name.crop)
end
# DELETE /scientific_names/1
# DELETE /scientific_names/1.json
def destroy
@scientific_name = ScientificName.find(params[:id])
@crop = @scientific_name.crop
@scientific_name.destroy
respond_to do |format|
format.html {
redirect_to @crop, notice: 'Scientific name was successfully deleted.'
}
format.json { head :no_content }
end
flash[:notice] = 'Scientific name was successfully deleted.'
respond_with(@crop)
end
private
def scientific_name_params
params.require(:scientific_name).permit(:crop_id, :scientific_name, :creator_id)
params.require(:scientific_name).permit(:crop_id, :name)
end
end

View File

@@ -1,46 +1,25 @@
class SeedsController < ApplicationController
before_filter :authenticate_member!, except: [:index, :show]
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
respond_to :csv, only: :index
respond_to :rss, only: :index
# GET /seeds
# GET /seeds.json
def index
@owner = Member.find_by_slug(params[:owner])
@crop = Crop.find_by_slug(params[:crop])
if @owner
@seeds = @owner.seeds.includes(:owner, :crop).paginate(page: params[:page])
elsif @crop
@seeds = @crop.seeds.includes(:owner, :crop).paginate(page: params[:page])
else
@seeds = Seed.includes(:owner, :crop).paginate(page: params[:page])
end
@owner = Member.find_by(slug: params[:owner])
@crop = Crop.find_by(slug: params[:crop])
@seeds = seeds(owner: @owner, crop: @crop)
@filename = csv_filename
respond_to do |format|
format.html # index.html.erb
format.json { render json: @seeds }
format.rss { render layout: false } #index.rss.builder
format.csv do
if @owner
@filename = "Growstuff-#{@owner}-Seeds-#{Time.zone.now.to_s(:number)}.csv"
@seeds = @owner.seeds.includes(:owner, :crop)
else
@filename = "Growstuff-Seeds-#{Time.zone.now.to_s(:number)}.csv"
@seeds = Seed.includes(:owner, :crop)
end
render csv: @seeds
end
end
respond_with(@seeds)
end
# GET /seeds/1
# GET /seeds/1.json
def show
@seed = Seed.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @seed }
end
respond_with(@seed)
end
# GET /seeds/new
@@ -49,70 +28,62 @@ class SeedsController < ApplicationController
@seed = Seed.new
# using find_by_id here because it returns nil, unlike find
@crop = Crop.find_by_id(params[:crop_id]) || Crop.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @seed }
end
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
respond_with(@seed)
end
# GET /seeds/1/edit
def edit
@seed = Seed.find(params[:id])
end
# POST /seeds
# POST /seeds.json
def create
params[:seed][:owner_id] = current_member.id
@seed = Seed.new(seed_params)
respond_to do |format|
if @seed.save
format.html { redirect_to @seed, notice: "Successfully added #{@seed.crop} seed to your stash." }
format.json { render json: @seed, status: :created, location: @seed }
else
format.html { render action: "new" }
format.json { render json: @seed.errors, status: :unprocessable_entity }
end
end
@seed.owner = current_member
flash[:notice] = "Successfully added #{@seed.crop} seed to your stash." if @seed.save
respond_with(@seed)
end
# PUT /seeds/1
# PUT /seeds/1.json
def update
@seed = Seed.find(params[:id])
respond_to do |format|
if @seed.update(seed_params)
format.html { redirect_to @seed, notice: 'Seed was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @seed.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Seed was successfully updated.' if @seed.update(seed_params)
respond_with(@seed)
end
# DELETE /seeds/1
# DELETE /seeds/1.json
def destroy
@seed = Seed.find(params[:id])
@seed.destroy
respond_to do |format|
format.html { redirect_to seeds_url }
format.json { head :no_content }
end
respond_with(@seed)
end
private
def seed_params
params.require(:seed).permit(
:owner_id, :crop_id, :description, :quantity, :plant_before,
:crop_id, :description, :quantity, :plant_before,
:days_until_maturity_min, :days_until_maturity_max, :organic, :gmo,
:heirloom, :tradable_to, :slug)
:heirloom, :tradable_to, :slug
)
end
def seeds(owner: nil, crop: nil)
if owner
owner.seeds
elsif crop
crop.seeds
else
Seed
end.includes(:owner, :crop).paginate(page: params[:page])
end
def csv_filename
if @owner
"Growstuff-#{@owner}-Seeds-#{Time.zone.now.to_s(:number)}.csv"
else
"Growstuff-Seeds-#{Time.zone.now.to_s(:number)}.csv"
end
end
end

View File

@@ -3,7 +3,7 @@ class SessionsController < Devise::SessionsController
def create
super do |resource|
if Crop.pending_approval.present? && current_member.has_role?(:crop_wrangler)
if Crop.pending_approval.present? && current_member.role?(:crop_wrangler)
flash[:alert] = "There are crops waiting to be wrangled."
end
end

View File

@@ -1,18 +1,16 @@
module ApplicationHelper
def price_in_dollars(price)
return sprintf('%.2f', price / 100.0)
sprintf('%.2f', price / 100.0)
end
# 999 cents becomes 9.99 AUD -- for products/orders/etc
def price_with_currency(price)
return sprintf('%.2f %s', price / 100.0,
Growstuff::Application.config.currency)
sprintf('%.2f %s', price / 100.0, Growstuff::Application.config.currency)
end
def parse_date(str)
str ||= '' # Date.parse barfs on nil
return str == '' ? nil : Date.parse(str)
str == '' ? nil : Date.parse(str)
end
def forex_link(price)
@@ -26,20 +24,20 @@ module ApplicationHelper
def build_alert_classes(alert_type = :info)
classes = 'alert alert-dismissable '
case alert_type.to_sym
when :alert, :danger, :error, :validation_errors
classes += 'alert-danger'
when :warning, :todo
classes += 'alert-warning'
when :notice, :success
classes += 'alert-success'
when :info
classes += 'alert-info'
when :alert, :danger, :error, :validation_errors
classes += 'alert-danger'
when :warning, :todo
classes += 'alert-warning'
when :notice, :success
classes += 'alert-success'
when :info
classes += 'alert-info'
end
classes
end
# Produces a cache key for uniquely identifying cached fragments.
def cache_key_for(klass, identifier="all")
def cache_key_for(klass, identifier = "all")
count = klass.count
max_updated_at = klass.maximum(:updated_at).try(:utc).try(:to_s, :number)
"#{klass.name.downcase.pluralize}/#{identifier}-#{count}-#{max_updated_at}"
@@ -72,10 +70,8 @@ module ApplicationHelper
return uri.to_s
end
Gravatar.new(member.email).image_url({
size: size,
default: :identicon
})
Gravatar.new(member.email).image_url(size: size,
default: :identicon)
end
# Returns a string with the quantity and the right pluralization for a
@@ -85,4 +81,31 @@ module ApplicationHelper
model_name = model.model_name.human(count: size)
"#{size} #{model_name}"
end
def show_inactive_tickbox_path(type, owner, show_all)
all = show_all ? '' : 1
if owner
plantings_by_owner_path(owner: owner.slug, all: all) if type == 'plantings'
gardens_by_owner_path(owner: owner.slug, all: all) if type == 'gardens'
else
plantings_path(all: all) if type == 'plantings'
gardens_path(all: all) if type == 'gardens'
end
end
def title(type, owner, crop, planting)
if owner
t(".title.owner_#{type}", owner: owner.login_name)
elsif crop
t(".title.crop_#{type}", crop: crop.name)
elsif planting
t(".title.planting_#{type}", planting: planting.to_s)
else
t(".title.default")
end
end
def og_description(description)
strip_tags(description).split(' ')[0..20].join(' ')
end
end

View File

@@ -1,6 +1,5 @@
module AutoSuggestHelper
def auto_suggest(resource, source, options={})
def auto_suggest(resource, source, options = {})
if options[:default] && !options[:default].new_record?
default = options[:default]
default_id = options[:default].try(:id)
@@ -13,10 +12,14 @@ module AutoSuggestHelper
source_path = Rails.application.routes.url_helpers.send("#{source}s_search_path")
%Q{
<input id="#{source}" class="auto-suggest #{options[:class]}" type="text" value="#{default}" data-source-url="#{source_path}", placeholder="e.g. lettuce">
<noscript class="text-warning">Warning: Javascript must be available to search and match crops</noscript>
<input id="#{resource}_#{source}_id" class="auto-suggest-id" type="hidden" name="#{resource}[#{source}_id]" value="#{default_id}">
<input id="#{source}" class="auto-suggest #{options[:class]}"
type="text" value="#{default}" data-source-url="#{source_path}",
placeholder="e.g. lettuce">
<noscript class="text-warning">
Warning: Javascript must be available to search and match crops
</noscript>
<input id="#{resource}_#{source}_id" class="auto-suggest-id"
type="hidden" name="#{resource}[#{source}_id]" value="#{default_id}">
}.html_safe
end
end

View File

@@ -2,20 +2,24 @@ module CropsHelper
def display_seed_availability(member, crop)
total_quantity = 0
seeds = member.seeds.select {|seed| seed.crop.name == crop.name }
seeds = member.seeds.select { |seed| seed.crop.name == crop.name }
seeds.each do |seed|
total_quantity = total_quantity + seed.quantity if seed.quantity
total_quantity += seed.quantity if seed.quantity
end
if !seeds.any?
return "You don't have any seeds of this crop."
end
if (total_quantity != 0)
if total_quantity != 0
"You have #{total_quantity} #{Seed.model_name.human(count: total_quantity)} of this crop."
else
"You have an unknown quantity of seeds of this crop."
end
end
def crop_ebay_seeds_url(crop)
"http://rover.ebay.com/rover/1/705-53470-19255-0/1?icep_ff3=9&pub=5575213277&toolid=10001&campid=5337940151&customid=&icep_uq=#{URI.escape crop.name}&icep_sellerId=&icep_ex_kw=&icep_sortBy=12&icep_catId=181003&icep_minPrice=&icep_maxPrice=&ipn=psmain&icep_vectorid=229515&kwid=902099&mtid=824&kw=lg" # rubocop:disable Metrics/LineLength
end
end

View File

@@ -1,24 +1,34 @@
module GardensHelper
def display_garden_description(garden)
if garden.description.nil?
"no description provided."
else
truncate(garden.description, length: 130, separator: ' ', omission: '... ') { link_to "Read more", garden_path(garden) }
truncate(garden.description, length: 130, separator: ' ', omission: '... ') do
link_to "Read more", garden_path(garden)
end
end
end
def gardens_active_tickbox_path(owner, show_all)
show_inactive_tickbox_path('gardens', owner, show_all)
end
def display_garden_name(garden)
truncate(garden.name, length: 50, separator: ' ', omission: '... ')
end
def display_garden_plantings(plantings)
if plantings.blank?
"None"
else
output = ""
plantings.first(2).each do |planting|
output = '<ul class="plantings">'
plantings.each do |planting|
output += "<li>"
output += planting.quantity.nil? ? "0 " : "#{planting.quantity} "
output += link_to planting.crop.name, planting.crop
output += ", planted on #{planting.planted_at}</li>"
end
output += '</ul>'
output.html_safe
end
end

View File

@@ -1,48 +1,34 @@
module HarvestsHelper
def display_quantity(harvest)
human_quantity = display_human_quantity(harvest)
weight = display_weight(harvest)
if human_quantity && weight
return "#{human_quantity}, weighing #{weight}"
elsif human_quantity
return human_quantity
elsif weight
return weight
else
return 'not specified'
end
return "#{human_quantity}, weighing #{weight}" if human_quantity && weight
return human_quantity if human_quantity
return weight if weight
'not specified'
end
def display_human_quantity(harvest)
if ! harvest.quantity.blank? && harvest.quantity > 0
if harvest.unit == 'individual' # just the number
number_to_human(harvest.quantity, strip_insignificant_zeros: true)
elsif ! harvest.unit.blank? # pluralize anything else
return pluralize(number_to_human(harvest.quantity, strip_insignificant_zeros: true), harvest.unit)
else
return "#{number_to_human(harvest.quantity, strip_insignificant_zeros: true)} #{harvest.unit}"
end
return unless harvest.quantity.present? && harvest.quantity > 0
if harvest.unit == 'individual' # just the number
number_to_human(harvest.quantity, strip_insignificant_zeros: true)
elsif !harvest.unit.blank? # pluralize anything else
pluralize(number_to_human(harvest.quantity, strip_insignificant_zeros: true), harvest.unit)
else
return nil
"#{number_to_human(harvest.quantity, strip_insignificant_zeros: true)} #{harvest.unit}"
end
end
def display_weight(harvest)
if ! harvest.weight_quantity.blank? && harvest.weight_quantity > 0
return "#{number_to_human(harvest.weight_quantity, strip_insignificant_zeros: true)} #{harvest.weight_unit}"
else
return nil
end
return if harvest.weight_quantity.blank? || harvest.weight_quantity <= 0
"#{number_to_human(harvest.weight_quantity, strip_insignificant_zeros: true)} #{harvest.weight_unit}"
end
def display_harvest_description(harvest)
if harvest.description.empty?
"No description provided."
else
harvest.description
end
return "No description provided." if harvest.description.nil?
harvest.description
end
end

View File

@@ -1,14 +1,13 @@
module PlantingsHelper
def display_days_before_maturity(planting)
if planting.finished?
0
elsif !planting.finished_at.nil?
((p = planting.finished_at - DateTime.now).to_i) <= 0 ? 0 : p.to_i
elsif planting.days_before_maturity.nil?
"unknown"
# First try to calc from finished/finished_at
if planting.finished? || planting.finished_at.present?
planting.days_until_finished.to_s
# then try to calc from planted at + maturity
elsif planting.planted_at.present? && planting.days_before_maturity.present?
planting.days_until_mature.to_s
else
((p = (planting.planted_at + planting.days_before_maturity) - DateTime.now).to_i <= 0) ? 0 : p.to_i
"unknown"
end
end
@@ -32,14 +31,17 @@ module PlantingsHelper
def display_planting(planting)
if planting.quantity.to_i > 0 && planting.planted_from.present?
return "#{planting.owner} planted #{pluralize(planting.quantity, planting.planted_from)}."
"#{planting.owner} planted #{pluralize(planting.quantity, planting.planted_from)}."
elsif planting.quantity.to_i > 0
return "#{planting.owner} planted #{pluralize(planting.quantity, 'unit')}."
"#{planting.owner} planted #{pluralize(planting.quantity, 'unit')}."
elsif planting.planted_from.present?
return "#{planting.owner} planted #{planting.planted_from.pluralize}."
"#{planting.owner} planted #{planting.planted_from.pluralize}."
else
return "#{planting.owner}."
"#{planting.owner}."
end
end
def plantings_active_tickbox_path(owner, show_all)
show_inactive_tickbox_path('plantings', owner, show_all)
end
end

View File

@@ -3,9 +3,12 @@ class Notifier < ActionMailer::Base
default from: "Growstuff <noreply@growstuff.org>"
def verifier
raise "RAILS_SECRET_TOKEN environment variable not set - have you created config/application.yml?" unless ENV['RAILS_SECRET_TOKEN']
unless ENV['RAILS_SECRET_TOKEN']
raise "RAILS_SECRET_TOKEN environment variable"\
"not set - have you created config/application.yml?"
end
return ActiveSupport::MessageVerifier.new(ENV['RAILS_SECRET_TOKEN'])
ActiveSupport::MessageVerifier.new(ENV['RAILS_SECRET_TOKEN'])
end
def notify(notification)
@@ -13,7 +16,8 @@ class Notifier < ActionMailer::Base
@reply_link = reply_link(@notification)
# Encrypting
@signed_message = verifier.generate ({ member_id: @notification.recipient.id, type: :send_notification_email })
message = { member_id: @notification.recipient.id, type: :send_notification_email }
@signed_message = verifier.generate(message)
mail(to: @notification.recipient.email,
subject: @notification.subject)
@@ -26,12 +30,10 @@ class Notifier < ActionMailer::Base
@harvests = @member.harvests.first(5)
# Encrypting
@signed_message = verifier.generate ({ member_id: @member.id, type: :send_planting_reminder })
message = { member_id: @member.id, type: :send_planting_reminder }
@signed_message = verifier.generate(message)
if @member.send_planting_reminder
mail(to: @member.email,
subject: "What have you planted lately?")
end
mail(to: @member.email, subject: "What have you planted lately?") if @member.send_planting_reminder
end
def new_crop_request(member, request)
@@ -48,5 +50,4 @@ class Notifier < ActionMailer::Base
@member, @crop = member, crop
mail(to: @member.email, subject: "#{crop.name.capitalize} has been rejected")
end
end

View File

@@ -1,7 +1,7 @@
class Ability
include CanCan::Ability
def initialize(member)
def initialize(member) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
# See the wiki for details: https://github.com/ryanb/cancan/wiki/Defining-Abilities
# everyone can do these things, even non-logged in
@@ -36,110 +36,112 @@ class Ability
an.crop.approved?
end
if member
# members can see even rejected or pending crops if they requested it
can :read, Crop, requester_id: member.id
return unless member
# managing your own user settings
can :update, Member, id: member.id
# members can see even rejected or pending crops if they requested it
can :read, Crop, requester_id: member.id
can :requested, Crop # see list of crops they've requested
# can read/delete notifications that were sent to them
can :read, Notification, recipient_id: member.id
can :destroy, Notification, recipient_id: member.id
can :reply, Notification, recipient_id: member.id
# can send a private message to anyone but themselves
# note: sadly, we can't test for this from the view, but it works
# for the model/controller
can :create, Notification do |n|
n.recipient_id != member.id
end
# note we don't support update for notifications
# managing your own user settings
can :update, Member, id: member.id
# only crop wranglers can create/edit/destroy crops
if member.has_role? :crop_wrangler
can :wrangle, Crop
can :manage, Crop
can :manage, ScientificName
can :manage, AlternateName
end
# can read/delete notifications that were sent to them
can :read, Notification, recipient_id: member.id
can :destroy, Notification, recipient_id: member.id
can :reply, Notification, recipient_id: member.id
# can send a private message to anyone but themselves
# note: sadly, we can't test for this from the view, but it works
# for the model/controller
can :create, Notification do |n|
n.recipient_id != member.id
end
# note we don't support update for notifications
# any member can create a crop provisionally
can :create, Crop
# only crop wranglers can create/edit/destroy crops
if member.role? :crop_wrangler
can :wrangle, Crop
can :manage, Crop
can :manage, ScientificName
can :manage, AlternateName
end
# can create & destroy their own authentications against other sites.
can :create, Authentication
can :destroy, Authentication, member_id: member.id
# any member can create a crop provisionally
can :create, Crop
# anyone can create a post, or comment on a post,
# but only the author can edit/destroy it.
can :create, Post
can :update, Post, author_id: member.id
can :destroy, Post, author_id: member.id
can :create, Comment
can :update, Comment, author_id: member.id
can :destroy, Comment, author_id: member.id
# can create & destroy their own authentications against other sites.
can :create, Authentication
can :destroy, Authentication, member_id: member.id
# same deal for gardens and plantings
can :create, Garden
can :update, Garden, owner_id: member.id
can :destroy, Garden, owner_id: member.id
# anyone can create a post, like, or comment on a post,
# but only the author can edit/destroy it.
can :create, Post
can :update, Post, author_id: member.id
can :destroy, Post, author_id: member.id
can :create, Like
can :destroy, Like, member_id: member.id
can :create, Comment
can :update, Comment, author_id: member.id
can :destroy, Comment, author_id: member.id
can :create, Planting
can :update, Planting, garden: { owner_id: member.id }
can :destroy, Planting, garden: { owner_id: member.id }
# same deal for gardens and plantings
can :create, Garden
can :update, Garden, owner_id: member.id
can :destroy, Garden, owner_id: member.id
can :create, Harvest
can :update, Harvest, owner_id: member.id
can :destroy, Harvest, owner_id: member.id
can :create, Planting
can :update, Planting, garden: { owner_id: member.id }, crop: { approval_status: 'approved' }
can :destroy, Planting, garden: { owner_id: member.id }, crop: { approval_status: 'approved' }
can :create, Photo
can :update, Photo, owner_id: member.id
can :destroy, Photo, owner_id: member.id
can :create, Harvest
can :update, Harvest, owner_id: member.id
can :destroy, Harvest, owner_id: member.id
can :update, Harvest, owner_id: member.id, planting: { owner_id: member.id }
can :destroy, Harvest, owner_id: member.id, planting: { owner_id: member.id }
can :create, Seed
can :update, Seed, owner_id: member.id
can :destroy, Seed, owner_id: member.id
can :create, Photo
can :update, Photo, owner_id: member.id
can :destroy, Photo, owner_id: member.id
# orders/shop/etc
can :create, Order
can :read, Order, member_id: member.id
can :complete, Order, member_id: member.id, completed_at: nil
can :checkout, Order, member_id: member.id, completed_at: nil
can :cancel, Order, member_id: member.id, completed_at: nil
can :destroy, Order, member_id: member.id, completed_at: nil
can :create, Seed
can :update, Seed, owner_id: member.id
can :destroy, Seed, owner_id: member.id
can :create, OrderItem
# for now, let's not let people mess with individual order items
cannot :read, OrderItem, order: { member_id: member.id }
cannot :update, OrderItem, order: { member_id: member.id, completed_at: nil }
cannot :destroy, OrderItem, order: { member_id: member.id, completed_at: nil }
# orders/shop/etc
can :create, Order
can :read, Order, member_id: member.id
can :complete, Order, member_id: member.id, completed_at: nil
can :checkout, Order, member_id: member.id, completed_at: nil
can :cancel, Order, member_id: member.id, completed_at: nil
can :destroy, Order, member_id: member.id, completed_at: nil
# following/unfollowing permissions
can :create, Follow
cannot :create, Follow, followed_id: member.id # can't follow yourself
can :create, OrderItem
# for now, let's not let people mess with individual order items
cannot :read, OrderItem, order: { member_id: member.id }
cannot :update, OrderItem, order: { member_id: member.id, completed_at: nil }
cannot :destroy, OrderItem, order: { member_id: member.id, completed_at: nil }
can :destroy, Follow
cannot :destroy, Follow, followed_id: member.id # can't unfollow yourself
# following/unfollowing permissions
can :create, Follow
cannot :create, Follow, followed_id: member.id # can't follow yourself
if member.has_role? :admin
can :destroy, Follow
cannot :destroy, Follow, followed_id: member.id # can't unfollow yourself
can :read, :all
can :manage, :all
return unless member.role? :admin
# can't change order history, because it's *history*
cannot :create, Order
cannot :complete, Order
cannot :destroy, Order
cannot :manage, OrderItem
can :read, :all
can :manage, :all
# can't delete plant parts if they have harvests associated with them
cannot :destroy, PlantPart
can :destroy, PlantPart do |pp|
pp.harvests.empty?
end
end
# can't change order history, because it's *history*
cannot :create, Order
cannot :complete, Order
cannot :destroy, Order
cannot :manage, OrderItem
# can't delete plant parts if they have harvests associated with them
cannot :destroy, PlantPart
can :destroy, PlantPart do |pp|
pp.harvests.empty?
end
end
end

View File

@@ -9,17 +9,15 @@ class Account < ActiveRecord::Base
before_create do |account|
unless account.account_type
account.account_type = AccountType.find_or_create_by(name:
Growstuff::Application.config.default_account_type
)
Growstuff::Application.config.default_account_type)
end
end
def paid_until_string
if account_type.is_permanent_paid
return "forever"
"forever"
elsif account_type.is_paid
return paid_until.to_s
paid_until.to_s
end
end
end

View File

@@ -2,4 +2,6 @@ class AlternateName < ActiveRecord::Base
after_commit { |an| an.crop.__elasticsearch__.index_document if an.crop && ENV['GROWSTUFF_ELASTICSEARCH'] == "true" }
belongs_to :crop
belongs_to :creator, class_name: 'Member'
validates :name, presence: true
validates :crop, presence: true
end

View File

@@ -6,18 +6,17 @@ class Comment < ActiveRecord::Base
scope :post_order, -> { reorder("created_at ASC") } # for display on post page
after_create do
recipient = self.post.author.id
sender = self.author.id
recipient = post.author.id
sender = author.id
# don't send notifications to yourself
if recipient != sender
Notification.create(
recipient_id: recipient,
sender_id: sender,
subject: "#{self.author} commented on #{self.post.subject}",
body: self.body,
post_id: self.post.id
subject: "#{author} commented on #{post.subject}",
body: body,
post_id: post.id
)
end
end
end

View File

@@ -0,0 +1,8 @@
module Likeable
extend ActiveSupport::Concern
included do
has_many :likes, as: :likeable, dependent: :destroy
has_many :members, through: :likes
end
end

View File

@@ -0,0 +1,17 @@
require_relative '../../constants/photo_models.rb'
module PhotoCapable
extend ActiveSupport::Concern
included do
has_and_belongs_to_many :photos # rubocop:disable Rails/HasAndBelongsToMany
before_destroy :remove_from_list
end
def remove_from_list
photolist = photos.to_a # save a temp copy of the photo list
photos.clear # clear relationship b/w object and photo
photolist.each(&:destroy_if_unused)
end
end

View File

@@ -18,22 +18,34 @@ class Crop < ActiveRecord::Base
belongs_to :parent, class_name: 'Crop'
has_many :varieties, class_name: 'Crop', foreign_key: 'parent_id'
has_and_belongs_to_many :posts
before_destroy {|crop| crop.posts.clear}
has_and_belongs_to_many :posts # rubocop:disable Rails/HasAndBelongsToMany
before_destroy { |crop| crop.posts.clear }
default_scope { order("lower(name) asc") }
scope :recent, -> { where(approval_status: "approved").reorder("created_at desc") }
scope :toplevel, -> { where(approval_status: "approved", parent_id: nil) }
scope :popular, -> { where(approval_status: "approved").reorder("plantings_count desc, lower(name) asc") }
scope :randomized, -> { where(approval_status: "approved").reorder('random()') } # ok on sqlite and psql, but not on mysql
default_scope { order("lower(crops.name) asc") }
scope :recent, lambda {
approved.reorder("created_at desc")
}
scope :toplevel, lambda {
approved.where(parent_id: nil)
}
scope :popular, lambda {
approved.reorder("plantings_count desc, lower(name) asc")
}
scope :randomized, lambda {
# ok on sqlite and psql, but not on mysql
approved.reorder('random()')
}
scope :pending_approval, -> { where(approval_status: "pending") }
scope :approved, -> { where(approval_status: "approved") }
scope :rejected, -> { where(approval_status: "rejected") }
scope :interesting, -> { approved.has_photos }
scope :has_photos, -> { includes(:photos).where.not(photos: { id: nil }) }
## Wikipedia urls are only necessary when approving a crop
validates :en_wikipedia_url,
format: {
with: /\Ahttps?:\/\/en\.wikipedia\.org\/wiki/,
with: %r{\Ahttps?:\/\/en\.wikipedia\.org\/wiki\/[[:alnum:]%_\.()-]+\z},
message: 'is not a valid English Wikipedia URL'
},
if: :approved?
@@ -57,30 +69,30 @@ class Crop < ActiveRecord::Base
# use Rails.env as a part of index name (eg. development_growstuff)
index_name [Rails.env, "growstuff"].join('_')
settings index: { number_of_shards: 1 },
analysis: {
tokenizer: {
gs_edgeNGram_tokenizer: {
type: "edgeNGram", # edgeNGram: NGram match from the start of a token
min_gram: 3,
max_gram: 10,
# token_chars: Elasticsearch will split on characters
# that dont belong to any of these classes
token_chars: [ "letter", "digit" ]
}
},
analyzer: {
gs_edgeNGram_analyzer: {
tokenizer: "gs_edgeNGram_tokenizer",
filter: ["lowercase"]
}
},
} do
analysis: {
tokenizer: {
gs_edgeNGram_tokenizer: {
type: "edgeNGram", # edgeNGram: NGram match from the start of a token
min_gram: 3,
max_gram: 10,
# token_chars: Elasticsearch will split on characters
# that don't belong to any of these classes
token_chars: %w(letter digit)
}
},
analyzer: {
gs_edgeNGram_analyzer: {
tokenizer: "gs_edgeNGram_tokenizer",
filter: ["lowercase"]
}
}
} do
mappings dynamic: 'false' do
indexes :id, type: 'long'
indexes :name, type: 'string', analyzer: 'gs_edgeNGram_analyzer'
indexes :approval_status, type: 'string'
indexes :scientific_names do
indexes :scientific_name,
indexes :name,
type: 'string',
analyzer: 'gs_edgeNGram_analyzer',
# Disabling field-length norm (norm). If the norm option is turned on(by default),
@@ -94,35 +106,30 @@ class Crop < ActiveRecord::Base
end
end
def as_indexed_json(options={})
self.as_json(
def as_indexed_json(_options = {})
as_json(
only: [:id, :name, :approval_status],
include: {
scientific_names: { only: :scientific_name },
scientific_names: { only: :name },
alternate_names: { only: :name }
})
}
)
end
# update the Elasticsearch index (only if we're using it in this
# environment)
def update_index(name_obj)
if ENV["GROWSTUFF_ELASTICSEARCH"] == "true"
__elasticsearch__.index_document
end
def update_index(_name_obj)
__elasticsearch__.index_document if ENV["GROWSTUFF_ELASTICSEARCH"] == "true"
end
# End Elasticsearch section
def to_s
return name
name
end
def default_scientific_name
if scientific_names.size > 0
return scientific_names.first.scientific_name
else
return nil
end
scientific_names.first.name unless scientific_names.empty?
end
# crop.default_photo
@@ -134,7 +141,7 @@ class Crop < ActiveRecord::Base
# Crop has no photos? Look for the most recent harvest with a photo.
harvest_with_photo = Harvest.where(crop_id: id).joins(:photos).order('harvests.id DESC').limit(1).first
return harvest_with_photo.photos.first if harvest_with_photo
harvest_with_photo.photos.first if harvest_with_photo
end
# crop.sunniness
@@ -143,13 +150,7 @@ class Crop < ActiveRecord::Base
# key: sunniness (eg. 'sun')
# value: count of how many times it's been used by plantings
def sunniness
sunniness = Hash.new(0)
plantings.each do |p|
if !p.sunniness.blank?
sunniness[p.sunniness] += 1
end
end
return sunniness
count_uses_of_property 'sunniness'
end
# crop.planted_from
@@ -157,13 +158,7 @@ class Crop < ActiveRecord::Base
# key: propagation method (eg. 'seed')
# value: count of how many times it's been used by plantings
def planted_from
planted_from = Hash.new(0)
plantings.each do |p|
if !p.planted_from.blank?
planted_from[p.planted_from] += 1
end
end
return planted_from
count_uses_of_property 'planted_from'
end
# crop.popular_plant_parts
@@ -171,13 +166,11 @@ class Crop < ActiveRecord::Base
# key: plant part (eg. 'fruit')
# value: count of how many times it's been used by harvests
def popular_plant_parts
popular_plant_parts = Hash.new(0)
harvests.each do |h|
if h.plant_part
popular_plant_parts[h.plant_part] += 1
end
end
return popular_plant_parts
PlantPart.joins(:harvests)
.where("crop_id = ?", id)
.order("count_harvests_id DESC")
.group("plant_parts.id", "plant_parts.name")
.count("harvests.id")
end
def interesting?
@@ -185,7 +178,7 @@ class Crop < ActiveRecord::Base
min_photos = 3 # needs this many photos to be interesting
return false unless photos.size >= min_photos
return false unless plantings_count >= min_plantings
return true
true
end
def pending?
@@ -201,139 +194,39 @@ class Crop < ActiveRecord::Base
end
def approval_statuses
[ 'rejected', 'pending', 'approved' ]
%w(rejected pending approved)
end
def reasons_for_rejection
[ "already in database", "not edible", "not enough information", "other" ]
end
# Crop.interesting
# returns a list of interesting crops, for use on the homepage etc
def Crop.interesting
howmany = 12 # max number to find
interesting_crops = []
Crop.includes(:photos).randomized.each do |c|
break if interesting_crops.size == howmany
next unless c.interesting?
interesting_crops.push(c)
end
return interesting_crops
end
# Crop.create_from_csv(row)
# used by db/seeds.rb and rake growstuff:import_crops
# CSV fields:
# - name (required)
# - en_wikipedia_url (required)
# - parent (name, optional)
# - scientific name (optional, can be picked up from parent if it has one)
def Crop.create_from_csv(row)
name,en_wikipedia_url,parent,scientific_names,alternate_names = row
cropbot = Member.find_by_login_name('cropbot')
raise "cropbot account not found: run rake db:seed" unless cropbot
crop = Crop.find_or_create_by(name: name)
crop.update_attributes(
en_wikipedia_url: en_wikipedia_url,
creator_id: cropbot.id
)
if parent
parent = Crop.find_by_name(parent)
if parent
crop.update_attributes(parent_id: parent.id)
else
logger.warn("Warning: parent crop #{parent} not found")
end
end
crop.add_scientific_names_from_csv(scientific_names)
crop.add_alternate_names_from_csv(alternate_names)
end
def add_scientific_names_from_csv(scientific_names)
names_to_add = []
if ! scientific_names.blank? # i.e. we actually passed something in, which isn't a given
names_to_add = scientific_names.split(%r{,\s*})
elsif parent && parent.scientific_names.size > 0 # pick up from parent
names_to_add = parent.scientific_names.map{|s| s.scientific_name}
else
logger.warn("Warning: no scientific name (not even on parent crop) for #{self}")
end
if names_to_add.size > 0
cropbot = Member.find_by_login_name('cropbot')
raise "cropbot account not found: run rake db:seed" unless cropbot
names_to_add.each do |n|
if self.scientific_names.exists?(scientific_name: n)
logger.warn("Warning: skipping duplicate scientific name #{n} for #{self}")
else
self.scientific_names.create(
scientific_name: n,
creator_id: cropbot.id
)
end
end
end
end
def add_alternate_names_from_csv(alternate_names)
names_to_add = []
if ! alternate_names.blank? # i.e. we actually passed something in, which isn't a given
cropbot = Member.find_by_login_name('cropbot')
raise "cropbot account not found: run rake db:seed" unless cropbot
names_to_add = alternate_names.split(%r{,\s*})
names_to_add.each do |n|
if self.alternate_names.exists?(name: n)
logger.warn("Warning: skipping duplicate alternate name #{n} for #{self}")
else
self.alternate_names.create(
name: n,
creator_id: cropbot.id
)
end
end
end
["already in database", "not edible", "not enough information", "other"]
end
def rejection_explanation
if reason_for_rejection == "other"
return rejection_notes
else
return reason_for_rejection
end
return rejection_notes if reason_for_rejection == "other"
reason_for_rejection
end
# Crop.search(string)
def self.search(query)
if ENV['GROWSTUFF_ELASTICSEARCH'] == "true"
search_str = query.nil? ? "" : query.downcase
response = __elasticsearch__.search( {
# Finds documents which match any field, but uses the _score from
# the best field insead of adding up _score from each field.
query: {
multi_match: {
query: "#{search_str}",
analyzer: "standard",
fields: ["name", "scientific_names.scientific_name", "alternate_names.name"]
}
},
filter: {
term: {approval_status: "approved"}
},
size: 50
}
response = __elasticsearch__.search( # Finds documents which match any field, but uses the _score from
# the best field insead of adding up _score from each field.
query: {
multi_match: {
query: search_str.to_s,
analyzer: "standard",
fields: ["name",
"scientific_names.scientific_name",
"alternate_names.name"]
}
},
filter: {
term: { approval_status: "approved" }
},
size: 50
)
return response.records.to_a
response.records.to_a
else
# if we don't have elasticsearch, just do a basic SQL query.
# also, make sure it's an actual array not an activerecord
@@ -344,37 +237,45 @@ class Crop < ActiveRecord::Base
# we want to make sure that exact matches come first, even if not
# using elasticsearch (eg. in development)
exact_match = Crop.approved.find_by_name(query)
exact_match = Crop.approved.find_by(name: query)
if exact_match
matches.delete(exact_match)
matches.unshift(exact_match)
end
return matches
matches
end
end
def self.case_insensitive_name(name)
where(["lower(crops.name) = :value", { value: name.downcase }])
end
private
def count_uses_of_property(col_name)
plantings.unscoped
.where(crop_id: id)
.where.not(col_name => nil)
.group(col_name)
.count
end
# Custom validations
def approval_status_cannot_be_changed_again
previous = previous_changes.include?(:approval_status) ? previous_changes.approval_status : {}
if previous.include?(:rejected) || previous.include?(:approved)
errors.add(:approval_status, "has already been set to #{approval_status}")
end
return unless previous.include?(:rejected) || previous.include?(:approved)
errors.add(:approval_status, "has already been set to #{approval_status}")
end
def must_be_rejected_if_rejected_reasons_present
unless rejected?
if reason_for_rejection.present? || rejection_notes.present?
errors.add(:approval_status, "must be rejected if a reason for rejection is present")
end
end
return if rejected?
return unless reason_for_rejection.present? || rejection_notes.present?
errors.add(:approval_status, "must be rejected if a reason for rejection is present")
end
def must_have_meaningful_reason_for_rejection
if reason_for_rejection == "other" && rejection_notes.blank?
errors.add(:rejection_notes, "must be added if the reason for rejection is \"other\"")
end
return unless reason_for_rejection == "other" && rejection_notes.blank?
errors.add(:rejection_notes, "must be added if the reason for rejection is \"other\"")
end
end

View File

@@ -0,0 +1,70 @@
class CsvImporter
# used by db/seeds.rb and rake growstuff:import_crops
# CSV fields:
# - name (required)
# - en_wikipedia_url (required)
# - parent (name, optional)
# - scientific name (optional, can be picked up from parent if it has one)
def import_crop(row)
name, en_wikipedia_url, parent_name, scientific_names, alternate_names = row
@crop = Crop.find_or_create_by(name: name)
@crop.update_attributes(
en_wikipedia_url: en_wikipedia_url,
creator_id: cropbot.id
)
add_parent(parent_name) if parent_name
add_scientific_names(scientific_names)
add_alternate_names(alternate_names)
@crop.save!
@crop
end
private
def add_parent(parent_name)
parent = Crop.find_by(name: parent_name)
if parent
@crop.update_attributes(parent_id: parent.id)
else
@crop.logger.warn("Warning: parent crop #{parent_name} not found")
end
end
def add_scientific_names(scientific_names)
names_to_add = []
if !scientific_names.blank? # i.e. we actually passed something in, which isn't a given
names_to_add = scientific_names.split(/,\s*/)
elsif @crop.parent && !@crop.parent.scientific_names.empty? # pick up from parent
names_to_add = @crop.parent.scientific_names.map(&:name)
else
@crop.logger.warn("Warning: no scientific name (not even on parent crop) for #{self}")
end
return if names_to_add.empty?
names_to_add.each do |name|
sciname = ScientificName.find_by(name: name, crop: @crop)
sciname = ScientificName.create!(name: name, crop: @crop, creator: cropbot) unless sciname
@crop.scientific_names << sciname
end
end
def add_alternate_names(alternate_names)
# i.e. we actually passed something in, which isn't a given
return if alternate_names.blank?
alternate_names.split(/,\s*/).each do |name|
altname = AlternateName.find_by(name: name, crop: @crop)
altname = AlternateName.create! name: name, crop: @crop, creator: cropbot unless altname
@crop.alternate_names << altname
end
end
def cropbot
@cropbot = Member.find_by!(login_name: 'cropbot') unless @cropbot
@cropbot
rescue
raise "cropbot account not found: run rake db:seed"
end
end

View File

@@ -5,12 +5,10 @@ class Follow < ActiveRecord::Base
after_create do
Notification.create(
recipient_id: self.followed_id,
sender_id: self.follower_id,
subject: "#{self.follower.login_name} is now following you",
body: "#{self.follower.login_name} just followed you on #{ENV["GROWSTUFF_SITE_NAME"]}. "
recipient_id: followed_id,
sender_id: follower_id,
subject: "#{follower.login_name} is now following you",
body: "#{follower.login_name} just followed you on #{ENV['GROWSTUFF_SITE_NAME']}. "
)
end
end

View File

@@ -1,12 +1,12 @@
class Forum < ActiveRecord::Base
extend FriendlyId
validates :name, presence: true
friendly_id :name, use: [:slugged, :finders]
has_many :posts
belongs_to :owner, class_name: "Member"
def to_s
return name
name
end
end

View File

@@ -1,23 +1,13 @@
class Garden < ActiveRecord::Base
include Geocodable
extend FriendlyId
include Geocodable
include PhotoCapable
friendly_id :garden_slug, use: [:slugged, :finders]
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id'
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id', counter_cache: true
has_many :plantings, -> { order(created_at: :desc) }, dependent: :destroy
has_many :crops, through: :plantings
has_and_belongs_to_many :photos
before_destroy do |garden|
photolist = garden.photos.to_a # save a temp copy of the photo list
garden.photos.clear # clear relationship b/w garden and photo
photolist.each do |photo|
photo.destroy_if_unused
end
end
# set up geocoding
geocoded_by :location
after_validation :geocode
@@ -33,14 +23,15 @@ class Garden < ActiveRecord::Base
validates :name,
format: {
with: /\S/
with: /\A\w+[\w ]+\z/
},
length: { maximum: 255 }
validates :area,
numericality: {
only_integer: false,
greater_than_or_equal_to: 0 },
greater_than_or_equal_to: 0
},
allow_nil: true
AREA_UNITS_VALUES = {
@@ -48,25 +39,21 @@ class Garden < ActiveRecord::Base
"square feet" => "square foot",
"hectares" => "hectare",
"acres" => "acre"
}
}.freeze
validates :area_unit, inclusion: { in: AREA_UNITS_VALUES.values,
message: "%{value} is not a valid area unit" },
allow_nil: true,
allow_blank: true
message: "%{value} is not a valid area unit" },
allow_nil: true,
allow_blank: true
after_validation :cleanup_area
def cleanup_area
if area == 0
self.area = nil
end
if area.blank?
self.area_unit = nil
end
self.area = nil if area && area.zero?
self.area_unit = nil if area.blank?
end
def garden_slug
"#{owner.login_name}-#{name}".downcase.gsub(' ', '-')
"#{owner.login_name}-#{name}".downcase.tr(' ', '-')
end
# featured plantings returns the most recent 4 plantings for a garden,
@@ -76,13 +63,13 @@ class Garden < ActiveRecord::Base
seen_crops = []
plantings.each do |p|
if (! seen_crops.include?(p.crop))
unless seen_crops.include?(p.crop)
unique_plantings.push(p)
seen_crops.push(p.crop)
end
end
return unique_plantings[0..3]
unique_plantings[0..3]
end
def to_s
@@ -92,16 +79,15 @@ class Garden < ActiveRecord::Base
# When you mark a garden as inactive, all the plantings in it should be
# marked as finished. This automates that.
def mark_inactive_garden_plantings_as_finished
if (active == false)
plantings.current.each do |p|
p.finished = true
p.save
end
return unless active == false
plantings.current.each do |p|
p.finished = true
p.save
end
end
def default_photo
return photos.first
photos.first
end
end

View File

@@ -1,35 +1,27 @@
class Harvest < ActiveRecord::Base
include ActionView::Helpers::NumberHelper
extend FriendlyId
include ActionView::Helpers::NumberHelper
include PhotoCapable
friendly_id :harvest_slug, use: [:slugged, :finders]
belongs_to :crop
belongs_to :owner, class_name: 'Member'
belongs_to :owner, class_name: 'Member', counter_cache: true
belongs_to :plant_part
has_and_belongs_to_many :photos
before_destroy do |harvest|
photolist = harvest.photos.to_a # save a temp copy of the photo list
harvest.photos.clear # clear relationship b/w harvest and photo
photolist.each do |photo|
photo.destroy_if_unused
end
end
belongs_to :planting
default_scope { order('created_at DESC') }
validates :crop, approved: true
validates :crop, presence: {message: "must be present and exist in our database"}
validates :crop, presence: { message: "must be present and exist in our database" }
validates :plant_part, presence: {message: "must be present and exist in our database"}
validates :plant_part, presence: { message: "must be present and exist in our database" }
validates :quantity,
numericality: {
only_integer: false,
greater_than_or_equal_to: 0 },
greater_than_or_equal_to: 0
},
allow_nil: true
UNITS_VALUES = {
@@ -43,11 +35,11 @@ class Harvest < ActiveRecord::Base
"buckets" => "bucket",
"baskets" => "basket",
"bushels" => "bushel"
}
}.freeze
validates :unit, inclusion: { in: UNITS_VALUES.values,
message: "%{value} is not a valid unit" },
allow_nil: true,
allow_blank: true
message: "%{value} is not a valid unit" },
allow_nil: true,
allow_blank: true
validates :weight_quantity,
numericality: { only_integer: false },
@@ -57,11 +49,11 @@ class Harvest < ActiveRecord::Base
"kg" => "kg",
"lb" => "lb",
"oz" => "oz"
}
}.freeze
validates :weight_unit, inclusion: { in: WEIGHT_UNITS_VALUES.values,
message: "%{value} is not a valid unit" },
allow_nil: true,
allow_blank: true
message: "%{value} is not a valid unit" },
allow_nil: true,
allow_blank: true
after_validation :cleanup_quantities
@@ -70,69 +62,61 @@ class Harvest < ActiveRecord::Base
# we're storing the harvest weight in kilograms in the db too
# to make data manipulation easier
def set_si_weight
if self.weight_unit != nil
weight_string = "#{self.weight_quantity} #{self.weight_unit}"
self.si_weight = Unit.new(weight_string).convert_to("kg").to_s("%0.3f").delete(" kg").to_f
end
return if weight_unit.nil?
weight_string = "#{weight_quantity} #{weight_unit}"
self.si_weight = Unit.new(weight_string).convert_to("kg").to_s("%0.3f").delete(" kg").to_f
end
def cleanup_quantities
if quantity == 0
self.quantity = nil
end
if quantity.blank?
self.unit = nil
end
if weight_quantity == 0
self.weight_quantity = nil
end
if weight_quantity.blank?
self.weight_unit = nil
end
self.quantity = nil if quantity && quantity.zero?
self.unit = nil if quantity.blank?
self.weight_quantity = nil if weight_quantity && weight_quantity.zero?
self.weight_unit = nil if weight_quantity.blank?
end
def harvest_slug
"#{owner.login_name}-#{crop}".downcase.gsub(' ', '-')
"#{owner.login_name}-#{crop}".downcase.tr(' ', '-')
end
# stringify as "beet in Skud's backyard" or similar
def to_s
# 50 individual apples, weighing 3lb
# 2 buckets of apricots, weighing 10kg
string = ''
if self.quantity
string += "#{number_to_human(self.quantity.to_s, strip_insignificant_zeros: true)} "
if self.unit == 'individual'
string += 'individual '
else
if self.quantity == 1
string += "#{self.unit} of "
else
string += "#{self.unit.pluralize} of "
end
end
end
"#{quantity_to_human} #{unit_to_human} #{crop_name_to_human} #{weight_to_human}".strip
end
if self.unit != 'individual' # buckets of apricot*s*
string += "#{self.crop.name.pluralize}"
elsif self.quantity == 1
string += "#{self.crop.name}"
def quantity_to_human
return number_to_human(quantity.to_s, strip_insignificant_zeros: true) if quantity
""
end
def unit_to_human
return "" unless quantity
if unit == 'individual'
'individual'
elsif quantity == 1
"#{unit} of"
else
string += "#{self.crop.name.pluralize}"
"#{unit.pluralize} of"
end
end
if self.weight_quantity
string += " weighing #{number_to_human(self.weight_quantity, strip_insignificant_zeros: true)} #{self.weight_unit}"
end
def weight_to_human
return "" unless weight_quantity
"weighing #{number_to_human(weight_quantity, strip_insignificant_zeros: true)} #{weight_unit}"
end
return string
def crop_name_to_human
if unit != 'individual' # buckets of apricot*s*
crop.name.pluralize
elsif quantity == 1
crop.name
else
crop.name.pluralize
end.to_s
end
def default_photo
return photos.first || crop.default_photo
photos.first || crop.default_photo
end
end

6
app/models/like.rb Normal file
View File

@@ -0,0 +1,6 @@
class Like < ActiveRecord::Base
belongs_to :member
belongs_to :likeable, polymorphic: true
validates :member, :likeable, presence: true
validates :member, uniqueness: { scope: :likeable }
end

View File

@@ -4,7 +4,7 @@ class Member < ActiveRecord::Base
friendly_id :login_name, use: [:slugged, :finders]
has_many :posts, foreign_key: 'author_id'
has_many :posts, foreign_key: 'author_id'
has_many :comments, foreign_key: 'author_id'
has_many :forums, foreign_key: 'owner_id'
@@ -14,7 +14,7 @@ class Member < ActiveRecord::Base
has_many :seeds, foreign_key: 'owner_id'
has_many :harvests, foreign_key: 'owner_id'
has_and_belongs_to_many :roles
has_and_belongs_to_many :roles # rubocop:disable Rails/HasAndBelongsToMany
has_many :notifications, foreign_key: 'recipient_id'
has_many :sent_notifications, foreign_key: 'sender_id'
@@ -27,6 +27,7 @@ class Member < ActiveRecord::Base
has_many :photos
has_many :likes, dependent: :destroy
default_scope { order("lower(login_name) asc") }
scope :confirmed, -> { where('confirmed_at IS NOT NULL') }
@@ -35,6 +36,15 @@ class Member < ActiveRecord::Base
scope :recently_joined, -> { reorder("confirmed_at desc") }
scope :wants_newsletter, -> { where(newsletter: true) }
scope :interesting, lambda {
confirmed
.located
.recently_signed_in
.has_plantings
}
scope :has_plantings, -> { joins(:plantings).group("members.id") }
has_many :follows, class_name: "Follow", foreign_key: "follower_id"
has_many :followed, through: :follows
@@ -45,8 +55,8 @@ class Member < ActiveRecord::Base
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :lockable, :timeoutable, :omniauthable
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :lockable, :timeoutable, :omniauthable
# set up geocoding
geocoded_by :location
@@ -58,8 +68,8 @@ class Member < ActiveRecord::Base
attr_accessor :login
# Requires acceptance of the Terms of Service
validates_acceptance_of :tos_agreement, allow_nil: true,
accept: true
validates :tos_agreement, acceptance: { allow_nil: true,
accept: true }
validates :login_name,
length: {
@@ -80,35 +90,33 @@ class Member < ActiveRecord::Base
}
# Give each new member a default garden
after_create {|member| Garden.create(name: "Garden", owner_id: member.id) }
after_create { |member| Garden.create(name: "Garden", owner_id: member.id) }
# and an account record (for paid accounts etc)
# we use find_or_create to avoid accidentally creating a second one,
# which can happen sometimes especially with FactoryGirl associations
after_create {|member| Account.find_or_create_by(member_id: member.id) }
after_create { |member| Account.find_or_create_by(member_id: member.id) }
after_save :update_newsletter_subscription
# allow login via either login_name or email address
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions).where(["lower(login_name) = :value OR lower(email) = :value", { value: login.downcase }]).first
else
where(conditions).first
end
login = conditions.delete(:login)
return where(conditions).login_name_or_email(login).first if login
find_by(conditions)
end
def to_s
return login_name
login_name
end
def has_role?(role_sym)
def role?(role_sym)
roles.any? { |r| r.name.gsub(/\s+/, "_").underscore.to_sym == role_sym }
end
def current_order
orders.where(completed_at: nil).first
orders.find_by(completed_at: nil)
end
# when purchasing a product that gives you a paid account, this method
@@ -117,9 +125,7 @@ class Member < ActiveRecord::Base
# called by order.update_account, which loops through all order items
# and does this for each one.
def update_account_after_purchase(product)
if product.account_type
account.account_type = product.account_type
end
account.account_type = product.account_type if product.account_type
if product.paid_months
start_date = account.paid_until || Time.zone.now
account.paid_until = start_date + product.paid_months.months
@@ -127,18 +133,18 @@ class Member < ActiveRecord::Base
account.save
end
def is_paid?
def paid?
if account.account_type.is_permanent_paid
return true
true
elsif account.account_type.is_paid && account.paid_until >= Time.zone.now
return true
true
else
return false
false
end
end
def auth(provider)
return authentications.find_by_provider(provider)
authentications.find_by(provider: provider)
end
# Authenticates against Flickr and returns an object we can use for subsequent api calls
@@ -153,113 +159,89 @@ class Member < ActiveRecord::Base
@flickr.access_secret = flickr_auth.secret
end
end
return @flickr
@flickr
end
# Fetches a collection of photos from Flickr
# Returns a [[page of photos], total] pair.
# Total is needed for pagination.
def flickr_photos(page_num=1, set=nil)
result = false
if set
result = flickr.photosets.getPhotos(
photoset_id: set,
page: page_num,
per_page: 30
)
else
result = flickr.people.getPhotos(
user_id: 'me',
page: page_num,
per_page: 30
)
end
if result
return [result.photo, result.total]
else
return [[], 0]
end
def flickr_photos(page_num = 1, set = nil)
result = if set
flickr.photosets.getPhotos(
photoset_id: set,
page: page_num,
per_page: 30
)
else
flickr.people.getPhotos(
user_id: 'me',
page: page_num,
per_page: 30
)
end
return [result.photo, result.total] if result
[[], 0]
end
# Returns a hash of Flickr photosets' ids and titles
def flickr_sets
sets = Hash.new
sets = {}
flickr.photosets.getList.each do |p|
sets[p.title] = p.id
end
return sets
sets
end
def interesting?
# we assume we're being passed something from
# Member.confirmed.located as those are required for
# interestingness, as well.
return true if plantings.present?
return false
def self.login_name_or_email(login)
where(["lower(login_name) = :value OR lower(email) = :value", { value: login.downcase }])
end
def Member.interesting
howmany = 12 # max number to find
interesting_members = []
Member.confirmed.located.recently_signed_in.each do |m|
break if interesting_members.size == howmany
if m.interesting?
interesting_members.push(m)
end
end
return interesting_members
def self.case_insensitive_login_name(login)
where(["lower(login_name) = :value", { value: login.downcase }])
end
def Member.nearest_to(place)
def self.nearest_to(place)
nearby_members = []
if place
latitude, longitude = Geocoder.coordinates(place, params: {limit: 1})
latitude, longitude = Geocoder.coordinates(place, params: { limit: 1 })
if latitude && longitude
nearby_members = Member.located.sort_by { |x| x.distance_from([latitude, longitude]) }
end
end
return nearby_members
nearby_members
end
def update_newsletter_subscription
if confirmed_at_changed? && newsletter # just signed up
newsletter_subscribe
elsif confirmed_at # i.e. after member's confirmed their account
if newsletter_changed? # edited member settings
if newsletter
newsletter_subscribe
else
newsletter_unsubscribe
end
end
return unless confirmed_at_changed? || newsletter_changed?
if newsletter
newsletter_subscribe if confirmed_at_changed? || confirmed_at && newsletter_changed?
elsif confirmed_at
newsletter_unsubscribe
end
end
def newsletter_subscribe(testing=false)
return true if (Rails.env.test? && !testing)
gb = Gibbon::API.new
res = gb.lists.subscribe({
def newsletter_subscribe(gb = Gibbon::API.new, testing = false)
return true if Rails.env.test? && !testing
gb.lists.subscribe(
id: Growstuff::Application.config.newsletter_list_id,
email: { email: email },
merge_vars: { login_name: login_name },
double_optin: false # they already confirmed their email with us
})
)
end
def newsletter_unsubscribe(testing=false)
return true if (Rails.env.test? && !testing)
gb = Gibbon::API.new
res = gb.lists.unsubscribe({
id: Growstuff::Application.config.newsletter_list_id,
email: { email: email }
})
def newsletter_unsubscribe(gb = Gibbon::API.new, testing = false)
return true if Rails.env.test? && !testing
gb.lists.unsubscribe(id: Growstuff::Application.config.newsletter_list_id,
email: { email: email })
end
def already_following?(member)
self.follows.exists?(followed_id: member.id)
follows.exists?(followed_id: member.id)
end
def get_follow(member)
self.follows.where(followed_id: member.id).first if already_following?(member)
follows.find_by(followed_id: member.id) if already_following?(member)
end
end

View File

@@ -7,24 +7,20 @@ class Notification < ActiveRecord::Base
default_scope { order('created_at DESC') }
scope :unread, -> { where(read: false) }
scope :by_recipient, ->(recipient) { where(recipient_id: recipient) }
before_create :replace_blank_subject
after_create :send_email
def self.unread_count
self.unread.size
unread.size
end
def replace_blank_subject
if self.subject.nil? or self.subject =~ /^\s*$/
self.subject = "(no subject)"
end
self.subject = "(no subject)" if subject.nil? || subject =~ /^\s*$/
end
def send_email
if self.recipient.send_notification_email
Notifier.notify(self).deliver_later
end
Notifier.notify(self).deliver_now! if recipient.send_notification_email
end
end

View File

@@ -12,27 +12,27 @@ class Order < ActiveRecord::Base
before_save :standardize_referral_code
scope :by_member, ->(member) { where(member: member) }
# total price of an order
def total
sum = 0
for i in order_items do
order_items.each do |i|
subtotal = i.price * i.quantity
sum += subtotal
end
return sum
sum
end
# return items in the format ActiveMerchant/PayPal want them
def activemerchant_items
items = []
order_items.each do |i|
items.push({
name: i.product.name,
quantity: i.quantity,
amount: i.price
})
items.push(name: i.product.name,
quantity: i.quantity,
amount: i.price)
end
return items
items
end
# record the paypal details for reference
@@ -40,7 +40,7 @@ class Order < ActiveRecord::Base
self.paypal_express_token = token
details = EXPRESS_GATEWAY.details_for(token)
self.paypal_express_payer_id = details.payer_id
self.save
save
end
# when an order is completed, we update the member's account to mark
@@ -54,43 +54,32 @@ class Order < ActiveRecord::Base
# removes whitespace and forces to uppercase (we're somewhat liberal
# in what we accept, but we clean it up anyway.)
def standardize_referral_code
if referral_code
self.referral_code = referral_code.upcase.gsub /\s/, ''
end
self.referral_code = referral_code.upcase.gsub(/\s/, '') if referral_code
end
# search orders (used by admin/orders)
# usage: Order.search({ :by => 'member', :for => 'Skud' })
# can search by: member, order_id, paypal_token, paypal_payer_id,
def Order.search(args={})
def self.search(args = {})
if args[:for]
case args[:by]
when "member"
member = Member.find_by_login_name(args[:for])
if member
return member.orders
end
when "order_id"
order = Order.find_by_id(args[:for])
if order
return [order]
end
when "paypal_token"
order = Order.find_by_paypal_express_token(args[:for])
if order
return [order]
end
when "paypal_payer_id"
order = Order.find_by_paypal_express_payer_id(args[:for])
if order
return [order]
end
when "referral_code"
# coerce to uppercase
return Order.where(referral_code: args[:for].upcase)
when "member"
member = Member.find_by(login_name: args[:for])
return member.orders if member
when "order_id"
order = Order.find_by(id: args[:for])
return [order] if order
when "paypal_token"
order = Order.find_by(paypal_express_token: args[:for])
return [order] if order
when "paypal_payer_id"
order = Order.find_by(paypal_express_payer_id: args[:for])
return [order] if order
when "referral_code"
# coerce to uppercase
return Order.where(referral_code: args[:for].upcase)
end
end
return []
[]
end
end

View File

@@ -3,13 +3,10 @@ class OrderItem < ActiveRecord::Base
belongs_to :product
validate :price_must_be_greater_than_minimum
validates_uniqueness_of :order_id, message: "may only have one item."
validates :order_id, uniqueness: { message: "may only have one item." }
def price_must_be_greater_than_minimum
@product = Product.find(product_id)
if price < @product.min_price
errors.add(:price, "must be greater than the product's minimum value")
end
errors.add(:price, "must be greater than the product's minimum value") if price < @product.min_price
end
end

View File

@@ -1,22 +1,25 @@
require_relative '../constants/photo_models.rb'
class Photo < ActiveRecord::Base
belongs_to :owner, class_name: 'Member'
has_and_belongs_to_many :plantings
has_and_belongs_to_many :harvests
has_and_belongs_to_many :gardens
before_destroy do |photo|
photo.plantings.clear
photo.harvests.clear
photo.gardens.clear
Growstuff::Constants::PhotoModels.relations.each do |relation|
has_and_belongs_to_many relation.to_sym # rubocop:disable Rails/HasAndBelongsToMany
end
before_destroy { all_associations.clear }
default_scope { order("created_at desc") }
# remove photos that aren't used by anything
def destroy_if_unused
unless plantings.size > 0 or harvests.size > 0 or gardens.size > 0
self.destroy
def all_associations
associations = []
Growstuff::Constants::PhotoModels.relations.each do |association_name|
associations << send(association_name.to_s).to_a
end
associations.flatten!
end
def destroy_if_unused
destroy if all_associations.empty?
end
# This is split into a side-effect free method and a side-effecting method
@@ -24,9 +27,9 @@ class Photo < ActiveRecord::Base
def flickr_metadata
flickr = owner.flickr
info = flickr.photos.getInfo(photo_id: flickr_photo_id)
licenses = flickr.photos.licenses.getInfo()
licenses = flickr.photos.licenses.getInfo
license = licenses.find { |l| l.id == info.license }
return {
{
title: info.title || "Untitled",
license_name: license.name,
license_url: license.url,
@@ -34,11 +37,9 @@ class Photo < ActiveRecord::Base
fullsize_url: FlickRaw.url_z(info),
link_url: FlickRaw.url_photopage(info)
}
end
def set_flickr_metadata
self.update_attributes(flickr_metadata)
update_attributes(flickr_metadata)
end
end

View File

@@ -6,7 +6,7 @@ class PlantPart < ActiveRecord::Base
has_many :crops, -> { uniq }, through: :harvests
def to_s
return name
name
end
# Postgres complains if the ORDER BY clause of a SELECT DISTINCT query is
@@ -18,7 +18,6 @@ class PlantPart < ActiveRecord::Base
# associated to plant parts will not be sorted in the same order as crops
# on the rest of the site.
def crops
return super.reorder('name')
super.reorder('name')
end
end

View File

@@ -1,26 +1,25 @@
class Planting < ActiveRecord::Base
extend FriendlyId
include PhotoCapable
friendly_id :planting_slug, use: [:slugged, :finders]
belongs_to :garden
belongs_to :owner, class_name: 'Member', counter_cache: true
belongs_to :crop, counter_cache: true
has_many :harvests, -> { order(harvested_at: :desc) }, dependent: :destroy
has_and_belongs_to_many :photos
before_destroy do |planting|
photolist = planting.photos.to_a # save a temp copy of the photo list
planting.photos.clear # clear relationship b/w planting and photo
photolist.each do |photo|
photo.destroy_if_unused
end
end
default_scope { order("created_at desc") }
default_scope { order("plantings.created_at desc") }
scope :finished, -> { where(finished: true) }
scope :current, -> { where(finished: false) }
scope :interesting, -> { has_photos.one_per_owner }
scope :one_per_owner, lambda {
joins("JOIN members m ON (m.id=plantings.owner_id)
LEFT OUTER JOIN plantings p2
ON (m.id=p2.owner_id AND plantings.id < p2.id)").where("p2 IS NULL")
}
scope :has_photos, -> { includes(:photos).where.not(photos: { id: nil }) }
delegate :name,
:en_wikipedia_url,
:default_scientific_name,
@@ -28,23 +27,22 @@ class Planting < ActiveRecord::Base
to: :crop,
prefix: true
default_scope { order("created_at desc") }
validates :crop, approved: true
validates :crop, presence: {message: "must be present and exist in our database"}
validates :crop, presence: { message: "must be present and exist in our database" }
validates :quantity,
numericality: {
only_integer: true,
greater_than_or_equal_to: 0 },
greater_than_or_equal_to: 0
},
allow_nil: true
SUNNINESS_VALUES = %w(sun semi-shade shade)
validates :sunniness, inclusion: { in: SUNNINESS_VALUES,
message: "%{value} is not a valid sunniness value" },
allow_nil: true,
allow_blank: true
message: "%{value} is not a valid sunniness value" },
allow_nil: true,
allow_blank: true
PLANTED_FROM_VALUES = [
'seed',
@@ -60,9 +58,9 @@ class Planting < ActiveRecord::Base
'layering'
]
validates :planted_from, inclusion: { in: PLANTED_FROM_VALUES,
message: "%{value} is not a valid planting method" },
allow_nil: true,
allow_blank: true
message: "%{value} is not a valid planting method" },
allow_nil: true,
allow_blank: true
validate :finished_must_be_after_planted
@@ -73,25 +71,25 @@ class Planting < ActiveRecord::Base
end
def planting_slug
"#{owner.login_name}-#{garden}-#{crop}".downcase.gsub(' ', '-')
[
owner.login_name,
garden.present? ? garden.name : 'null',
crop.present? ? crop.name : 'null'
].join('-').tr(' ', '-').downcase
end
# location = garden owner + garden name, i.e. "Skud's backyard"
def location
return "#{garden.owner.login_name}'s #{garden}"
I18n.t("gardens.location", garden: garden.name, owner: garden.owner.login_name)
end
# stringify as "beet in Skud's backyard" or similar
def to_s
self.crop_name + " in " + self.location
I18n.t('plantings.string', crop: crop.name, garden: garden.name, owner: owner)
end
def default_photo
return photos.first
end
def interesting?
return photos.present?
photos.first
end
def calculate_days_before_maturity(planting, crop)
@@ -105,7 +103,7 @@ class Planting < ActiveRecord::Base
if differences.compact.empty?
nil
else
differences.compact.sum/differences.compact.size
differences.compact.sum / differences.compact.size
end
end
@@ -113,6 +111,17 @@ class Planting < ActiveRecord::Base
planted_at.present? && current_date.to_date >= planted_at
end
def days_until_finished
return 0 if finished?
days = (finished_at - Date.current).to_i
days.positive? ? days : 0
end
def days_until_mature
days = ((planted_at + days_before_maturity) - Date.current).to_i
days.positive? ? days : 0
end
def percentage_grown(current_date = Date.current)
return nil unless days_before_maturity && planted?(current_date)
@@ -120,7 +129,7 @@ class Planting < ActiveRecord::Base
return 0 if current_date < planted_at
return 100 if days > days_before_maturity
percent = (days/days_before_maturity*100).to_i
percent = (days / days_before_maturity * 100).to_i
if percent >= 100
percent = 100
@@ -128,24 +137,4 @@ class Planting < ActiveRecord::Base
percent
end
# return a list of interesting plantings, for the homepage etc.
# we can't do this via a scope (as far as we know) so sadly we have to
# do it this way.
def Planting.interesting(howmany=12, require_photo=true)
interesting_plantings = []
seen_owners = Hash.new(false) # keep track of which owners we've seen already
Planting.includes(:photos).each do |p|
break if interesting_plantings.size == howmany # got enough yet?
if require_photo
next unless p.photos.present? # skip those without photos, if required
end
next if seen_owners[p.owner] # skip if we already have one from this owner
seen_owners[p.owner] = true # we've seen this owner
interesting_plantings.push(p)
end
return interesting_plantings
end
end

View File

@@ -1,83 +1,81 @@
class Post < ActiveRecord::Base
extend FriendlyId
include Likeable
friendly_id :author_date_subject, use: [:slugged, :finders]
belongs_to :author, class_name: 'Member'
belongs_to :forum
has_many :comments, dependent: :destroy
has_and_belongs_to_many :crops
before_destroy {|post| post.crops.clear}
has_and_belongs_to_many :crops # rubocop:disable Rails/HasAndBelongsToMany
before_destroy { |post| post.crops.clear }
after_save :update_crops_posts_association
# also has_many notifications, but kinda meaningless to get at them
# from this direction, so we won't set up an association for now.
after_create do
recipients = []
sender = self.author.id
self.body.scan(Haml::Filters::GrowstuffMarkdown::MEMBER_REGEX) do |m|
sender = author.id
body.scan(Haml::Filters::GrowstuffMarkdown::MEMBER_REGEX) do |_m|
# find member case-insensitively and add to list of recipients
member = Member.where('lower(login_name) = ?', $1.downcase).first
member = Member.case_insensitive_login_name(Regexp.last_match(1)).first
recipients << member if member && !recipients.include?(member)
end
self.body.scan(Haml::Filters::GrowstuffMarkdown::MEMBER_AT_REGEX) do |m|
body.scan(Haml::Filters::GrowstuffMarkdown::MEMBER_AT_REGEX) do |_m|
# find member case-insensitively and add to list of recipients
member = Member.where('lower(login_name) = ?', $1[1..-1].downcase).first
member = Member.case_insensitive_login_name(Regexp.last_match(1)[1..-1]).first
recipients << member if member && !recipients.include?(member)
end
# don't send notifications to yourself
recipients.map{ |r| r.id }.each do |recipient|
if recipient != sender
Notification.create(
recipient_id: recipient,
sender_id: sender,
subject: "#{self.author} mentioned you in their post #{self.subject}",
body: self.body,
)
end
recipients.map(&:id).each do |recipient|
next unless recipient != sender
Notification.create(
recipient_id: recipient,
sender_id: sender,
subject: "#{author} mentioned you in their post #{subject}",
body: body
)
end
end
default_scope { order("created_at desc") }
validates :subject,
format: {
with: /\S/
},
presence: true,
length: { maximum: 255 }
def author_date_subject
# slugs are created before created_at is set
time = created_at || Time.zone.now
"#{author.login_name} #{time.strftime("%Y%m%d")} #{subject}"
"#{author.login_name} #{time.strftime('%Y%m%d')} #{subject}"
end
def comment_count
self.comments.size
comments.size
end
# return the timestamp of the most recent activity on this post
# i.e. the time of the most recent comment, or of the post itself if
# there are no comments.
def recent_activity
self.comments.present? ? self.comments.reorder('created_at DESC').first.created_at : self.created_at
comments.present? ? comments.reorder('created_at DESC').first.created_at : created_at
end
# return posts sorted by recent activity
def Post.recently_active
def self.recently_active
Post.all.sort do |a, b|
b.recent_activity <=> a.recent_activity
end
end
private
def update_crops_posts_association
self.crops.destroy_all
# look for crops mentioned in the post. eg. [tomato](crop)
self.body.scan(Haml::Filters::GrowstuffMarkdown::CROP_REGEX) do |m|
# find crop case-insensitively
crop = Crop.where('lower(name) = ?', $1.downcase).first
# create association
self.crops << crop if crop && !self.crops.include?(crop)
end
def update_crops_posts_association
crops.destroy_all
# look for crops mentioned in the post. eg. [tomato](crop)
body.scan(Haml::Filters::GrowstuffMarkdown::CROP_REGEX) do |_m|
# find crop case-insensitively
crop = Crop.case_insensitive_name(Regexp.last_match(1)).first
# create association
crops << crop if crop && !crops.include?(crop)
end
end
end

View File

@@ -1,15 +1,15 @@
class Product < ActiveRecord::Base
has_and_belongs_to_many :orders
has_and_belongs_to_many :orders # rubocop:disable Rails/HasAndBelongsToMany
belongs_to :account_type
validates :paid_months,
numericality: {
only_integer: true,
greater_than_or_equal_to: 0 },
greater_than_or_equal_to: 0
},
allow_nil: true
def to_s
name
end
end

View File

@@ -2,7 +2,7 @@ class Role < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: [:slugged, :finders]
has_and_belongs_to_many :members
has_and_belongs_to_many :members # rubocop:disable Rails/HasAndBelongsToMany
class << self
[:crop_wranglers, :admins].each do |method|

View File

@@ -2,4 +2,6 @@ class ScientificName < ActiveRecord::Base
after_commit { |sn| sn.crop.__elasticsearch__.index_document if sn.crop && ENV['GROWSTUFF_ELASTICSEARCH'] == "true" }
belongs_to :crop
belongs_to :creator, class_name: 'Member'
validates :name, presence: true
validates :crop, presence: true
end

View File

@@ -1,70 +1,79 @@
class Seed < ActiveRecord::Base
extend FriendlyId
include PhotoCapable
friendly_id :seed_slug, use: [:slugged, :finders]
belongs_to :crop
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id'
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id', counter_cache: true
default_scope { order("created_at desc") }
validates :crop, approved: true
validates :crop, presence: {message: "must be present and exist in our database"}
validates :crop, presence: { message: "must be present and exist in our database" }
validates :quantity,
numericality: {
only_integer: true,
greater_than_or_equal_to: 0 },
greater_than_or_equal_to: 0
},
allow_nil: true
validates :days_until_maturity_min,
numericality: {
only_integer: true,
greater_than_or_equal_to: 0 },
greater_than_or_equal_to: 0
},
allow_nil: true
validates :days_until_maturity_max,
numericality: {
only_integer: true,
greater_than_or_equal_to: 0 },
greater_than_or_equal_to: 0
},
allow_nil: true
scope :tradable, -> { where("tradable_to != 'nowhere'") }
TRADABLE_TO_VALUES = %w(nowhere locally nationally internationally)
TRADABLE_TO_VALUES = %w(nowhere locally nationally internationally).freeze
validates :tradable_to, inclusion: { in: TRADABLE_TO_VALUES,
message: "You may only trade seed nowhere, locally, nationally, or internationally" },
allow_nil: false,
allow_blank: false
message: "You may only trade seed nowhere, "\
"locally, nationally, or internationally" },
allow_nil: false,
allow_blank: false
ORGANIC_VALUES = [
'certified organic',
'non-certified organic',
'conventional/non-organic',
'unknown']
'unknown'
].freeze
validates :organic, inclusion: { in: ORGANIC_VALUES,
message: "You must say whether the seeds are organic or not, or that you don't know" },
allow_nil: false,
allow_blank: false
message: "You must say whether the seeds "\
"are organic or not, or that you don't know" },
allow_nil: false,
allow_blank: false
GMO_VALUES = [
'certified GMO-free',
'non-certified GMO-free',
'GMO',
'unknown']
'unknown'
].freeze
validates :gmo, inclusion: { in: GMO_VALUES,
message: "You must say whether the seeds are genetically modified or not, or that you don't know" },
allow_nil: false,
allow_blank: false
message: "You must say whether the seeds are "\
"genetically modified or not, or that you don't know" },
allow_nil: false,
allow_blank: false
HEIRLOOM_VALUES = %w(heirloom hybrid unknown)
HEIRLOOM_VALUES = %w(heirloom hybrid unknown).freeze
validates :heirloom, inclusion: { in: HEIRLOOM_VALUES,
message: "You must say whether the seeds are heirloom, hybrid, or unknown" },
allow_nil: false,
allow_blank: false
message: "You must say whether the seeds are heirloom, hybrid, or unknown" },
allow_nil: false,
allow_blank: false
def tradable?
if self.tradable_to == 'nowhere'
return false
if tradable_to == 'nowhere'
false
else
return true
true
end
end
@@ -72,27 +81,28 @@ class Seed < ActiveRecord::Base
# assuming we're passed something that's already known to be tradable
# eg. from Seed.tradable scope
return false if owner.location.blank? # don't want unspecified locations
return true
true
end
# Seed.interesting
# returns a list of interesting seeds, for use on the homepage etc
def Seed.interesting
def self.interesting
howmany = 12 # max number to find
interesting_seeds = []
Seed.tradable.each do |s|
break if interesting_seeds.size == howmany
if s.interesting?
interesting_seeds.push(s)
end
interesting_seeds.push(s) if s.interesting?
end
return interesting_seeds
interesting_seeds
end
def seed_slug
"#{owner.login_name}-#{crop}".downcase.gsub(' ', '-')
"#{owner.login_name}-#{crop}".downcase.tr(' ', '-')
end
def to_s
I18n.t('seeds.string', crop: crop.name, owner: owner)
end
end

View File

@@ -1,7 +1,5 @@
class ApprovedValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless record.crop.try(:approved?)
record.errors[attribute] << (options[:message] || 'must be approved')
end
record.errors[attribute] << (options[:message] || 'must be approved') unless record.crop.try(:approved?)
end
end

View File

@@ -1,7 +1,9 @@
= form_for @account_type do |f|
- if @account_type.errors.any?
#error_explanation
%h2= "#{pluralize(@account_type.errors.size, "error")} prohibited this account_type from being saved:"
%h2
= pluralize(@account_type.errors.size, "error")
prohibited this account_type from being saved:
%ul
- @account_type.errors.full_messages.each do |msg|
%li= msg

View File

@@ -1,4 +1,4 @@
-content_for :title, "Editing account type"
- content_for :title, "Editing account type"
= render 'form'

View File

@@ -16,7 +16,7 @@
%td= account_type.is_permanent_paid
%td= link_to 'Show', account_type
%td= link_to 'Edit', edit_account_type_path(account_type)
%td= link_to 'Destroy', account_type, :method => :delete, :data => { :confirm => 'Are you sure?' }
%td= link_to 'Destroy', account_type, method: :delete, data: { confirm: 'Are you sure?' }
%br

View File

@@ -12,6 +12,6 @@
= link_to 'Edit', edit_account_type_path(@account_type)
\|
= link_to 'Delete', @account_type, :method => :delete, :data => { :confirm => 'Are you sure?' }
= link_to 'Delete', @account_type, method: :delete, data: { confirm: 'Are you sure?' }
\|
= link_to 'Back', account_types_path

View File

@@ -1,7 +1,9 @@
= form_for @account do |f|
- if @account.errors.any?
#error_explanation
%h2= "#{pluralize(@account.errors.size, "error")} prohibited this account from being saved:"
%h2
= pluralize(@account.errors.size, "error")
prohibited this account from being saved:
%ul
- @account.errors.full_messages.each do |msg|
%li= msg

View File

@@ -16,7 +16,7 @@
%td= account.paid_until
%td= link_to 'Show', account
%td= link_to 'Edit', edit_account_path(account)
%td= link_to 'Destroy', account, :method => :delete, :data => { :confirm => 'Are you sure?' }
%td= link_to 'Destroy', account, method: :delete, data: { confirm: 'Are you sure?' }
%br

Some files were not shown because too many files have changed in this diff Show More