Compare commits

..

329 Commits

Author SHA1 Message Date
pozorvlak
494dd1d658 Merge pull request #1411 from Growstuff/dev
Release 30
2017-10-25 08:16:42 +01:00
Brenda Wallace
a3a88c48de Randomise the crops on the homepage 2017-10-23 22:09:34 +01:00
Brenda Wallace
705240014a Link harvest thumbnails to harvests
to be consistent with the rest of the site
2017-10-23 11:07:27 +01:00
Brenda Wallace
78aa049502 Fixed comment model spec 2017-10-23 10:44:37 +01:00
Brenda Wallace
97c7277a73 fixed up ambigous regex and use of expect in specs 2017-10-23 10:44:37 +01:00
Brenda Wallace
0e0af44d9f post show specs, use expect syntax, and more tests for js injection 2017-10-23 10:44:37 +01:00
Brenda Wallace
45af8d5f4f Converting to expect syntax 2017-10-23 10:44:37 +01:00
deppbot
a1ee822690 Bundle Update on 2017-10-22 2017-10-23 14:55:15 +13:00
Brenda Wallace
b6e61eba7a Merge branch 'master' into dev-conflict-fix 2017-10-22 11:30:43 +13:00
Brenda Wallace
b356d86931 Allow inline style on the progress bar width 2017-10-21 22:48:37 +01:00
Brenda Wallace
34f91c2189 Wrap garden overview buttons to right of photo on small screens 2017-10-21 22:48:37 +01:00
Brenda Wallace
faf3f60e78 small screen gardens overview 2017-10-21 22:48:37 +01:00
Brenda Wallace
e3113fd53d Re-work gardens#index to show planting progress 2017-10-21 22:48:37 +01:00
Brenda Wallace
68768c4d6a Fixed redirection after planting is deleted 2017-10-21 22:48:37 +01:00
pozorvlak
da7fec5e0b Merge pull request #1405 from Br3nda/fix-1379
Display messages even when member is deleted
2017-10-20 16:10:51 +01:00
Brenda Wallace
191c8e4e9d Display messages even when member is deleted 2017-10-20 23:44:51 +13:00
deppbot
edc763cd8c Bundle Update on 2017-10-19 2017-10-20 23:23:02 +13:00
Brenda Wallace
fdfb116d92 Ignore one Style/ClassAndModuleChildren 2017-10-19 08:22:40 +13:00
Brenda Wallace
888e0669a0 Added hound config 2017-10-19 08:22:40 +13:00
Brenda Wallace
d55e2b5466 Update heroku maintenance script
maintenance is just an attribute now
2017-10-19 08:22:40 +13:00
Brenda Wallace
c28ae4fe83 Use ! to indicate the method changes class variables 2017-10-19 08:22:40 +13:00
Brenda Wallace
4b4669459e Fixed duplicated code in growstuff member link markdown 2017-10-19 08:22:40 +13:00
Brenda Wallace
77902ad300 Moved member look up to a method (less duplicate code) 2017-10-19 08:22:40 +13:00
Brenda Wallace
f314fcd919 Fixed members link in growstuff markdown 2017-10-19 08:22:40 +13:00
Brenda Wallace
8171c12a5b Fixed links to crops in growstuff markdown 2017-10-19 08:22:40 +13:00
Brenda Wallace
08b6b46bfa Removed some rubocop todos 2017-10-19 08:22:40 +13:00
Brenda Wallace
bf189092ea More simplification of growstuff markup 2017-10-19 08:22:40 +13:00
Brenda Wallace
a539a47044 Reduced complexity of growstuff_markdown 2017-10-19 08:22:40 +13:00
Brenda Wallace
e29ac8827a Another code style fixup 2017-10-19 08:22:40 +13:00
Brenda Wallace
c5cee72ae5 Migrate to new heroku platform api - maintenance mode trigger 2017-10-19 08:22:40 +13:00
deppbot
5396550a8a Bundle Update on 2017-10-16 2017-10-19 08:22:40 +13:00
deppbot
76d2fb37b4 Bundle Update on 2017-09-28 2017-10-19 08:22:40 +13:00
deppbot
a42676ef0a Bundle Update on 2017-09-25 2017-10-19 08:22:40 +13:00
Brenda Wallace
3f3fc6a4ca Only install elastic search in travis on the matix that tests elasticsearch 2017-10-19 08:22:40 +13:00
Brenda Wallace
c710a8b1ef Outputs which version of elasticsearch we are running on travis 2017-10-19 08:22:40 +13:00
Brenda Wallace
6ada0c4f84 Install elastic search 2.4.0 when running on travis 2017-10-19 08:22:40 +13:00
Brenda Wallace
2e5a2455d6 Sleep before tests
as suggested here https://docs.travis-ci.com/user/database-setup/#ElasticSearch
2017-10-19 08:22:40 +13:00
Brenda Wallace
d89d4cea39 Further gem updates 2017-10-19 08:22:40 +13:00
Brenda Wallace
01a82ac993 Use floats, so the percentage calc works 2017-10-19 08:22:40 +13:00
Brenda Wallace
68660b3c65 update from erubi to erubis gem broke stuff - rolling back 2017-10-19 08:22:40 +13:00
Brenda Wallace
67b4f3558e Set required executable to jshint linting 2017-10-19 08:22:40 +13:00
Brenda Wallace
63b973833f Don't need to create database if just running linters 2017-10-19 08:22:40 +13:00
Brenda Wallace
4b19f73eb8 Remove git guilt 2017-10-19 08:22:40 +13:00
Brenda Wallace
9b4d6044ef Specify the executable in the npm installed linters 2017-10-19 08:22:40 +13:00
Brenda Wallace
9c70ffe051 Specify the executable in the npm installed linters 2017-10-19 08:22:40 +13:00
Brenda Wallace
e7a1d2345d Bundle update and change to platform-api instead of heroku 2017-10-19 08:22:40 +13:00
Brenda Wallace
c7585f1931 Use string.start_with? instead of a regexp 2017-10-19 08:22:40 +13:00
Brenda Wallace
63b76d175d Changed regex to matches? to appease rubocop 2017-10-19 08:22:40 +13:00
Brenda Wallace
1d5d2cc704 Added xmlrpc gem to solve rake errors on travis 2017-10-19 08:22:40 +13:00
Brenda Wallace
9477b4f9c7 Bump ruby version to 2.4.1 2017-10-19 08:22:40 +13:00
deppbot
a42a61abdd Bundle Update on 2017-08-03 2017-10-19 08:22:40 +13:00
pozorvlak
62eaa07862 Merge pull request #1401 from Br3nda/fix/codestyle
Another code style fixup
2017-10-18 10:52:38 +01:00
pozorvlak
f26420c380 Merge branch 'dev' into fix/codestyle 2017-10-18 10:41:03 +01:00
pozorvlak
6de13b7327 Merge pull request #1402 from Br3nda/fix/heroku-deploys
Update heroku maintenance script - maintenance is just an attribute now
2017-10-18 10:34:33 +01:00
Brenda Wallace
310f631f40 Ignore one Style/ClassAndModuleChildren 2017-10-18 20:45:27 +13:00
Brenda Wallace
bec59aba43 Merge remote-tracking branch 'origin/fix/codestyle' into fix/codestyle 2017-10-18 19:27:36 +13:00
Brenda Wallace
c86902967d Merge remote-tracking branch 'upstream/dev' into fix/codestyle 2017-10-18 19:27:08 +13:00
Brenda Wallace
361e3df692 Added hound config 2017-10-18 19:26:36 +13:00
Shiny
ce18bef892 Merge branch 'dev' into fix/codestyle 2017-10-18 14:01:57 +13:00
Shiny
ac2b0d04ea Merge branch 'dev' into fix/heroku-deploys 2017-10-18 13:40:52 +13:00
Brenda Wallace
9d0b48b84c Update heroku maintenance script
maintenance is just an attribute now
2017-10-18 13:37:54 +13:00
Brenda Wallace
d8f41b5ca0 Use ! to indicate the method changes class variables 2017-10-18 12:20:28 +13:00
Brenda Wallace
b5fbfaf515 Fixed duplicated code in growstuff member link markdown 2017-10-18 12:13:05 +13:00
Brenda Wallace
ce9a71cdad Moved member look up to a method (less duplicate code) 2017-10-18 12:10:59 +13:00
Brenda Wallace
42a10bcd80 Fixed members link in growstuff markdown 2017-10-18 12:10:04 +13:00
Brenda Wallace
33656a4104 Fixed links to crops in growstuff markdown 2017-10-18 12:05:22 +13:00
pozorvlak
ca200c1f30 Merge pull request #1400 from Br3nda/fix/heroku-deploys
Migrate to new heroku platform api - maintenance mode trigger
2017-10-17 14:52:16 +01:00
Brenda Wallace
ccd352d699 Removed some rubocop todos 2017-10-17 22:33:22 +13:00
Brenda Wallace
bd396dabfe More simplification of growstuff markup 2017-10-17 22:29:02 +13:00
Brenda Wallace
1279dd63bc Reduced complexity of growstuff_markdown 2017-10-17 22:20:17 +13:00
Brenda Wallace
8d681dd90a Another code style fixup 2017-10-17 17:29:48 +13:00
Brenda Wallace
dfd0e1dbf5 Migrate to new heroku platform api - maintenance mode trigger 2017-10-17 16:23:12 +13:00
deppbot
0d555542c2 Bundle Update on 2017-10-16 2017-10-16 18:46:50 +13:00
deppbot
99a69cd492 Bundle Update on 2017-09-28 2017-10-16 14:52:16 +13:00
deppbot
e8e9aa23b2 Bundle Update on 2017-09-25 2017-09-25 09:34:12 +13:00
pozorvlak
2fafc6f3e4 Merge pull request #1391 from Br3nda/feature/bundle-update-and-heroku-api-change
Bundle update and change to platform-api instead of heroku
2017-09-24 14:59:44 +01:00
Brenda Wallace
6b1714eb05 Only install elastic search in travis on the matix that tests elasticsearch 2017-09-24 18:50:23 +13:00
Brenda Wallace
8e5c52e85e Outputs which version of elasticsearch we are running on travis 2017-09-24 18:40:50 +13:00
Brenda Wallace
c749f4a813 Install elastic search 2.4.0 when running on travis 2017-09-24 18:35:39 +13:00
Brenda Wallace
5ed5f9ec7e Sleep before tests
as suggested here https://docs.travis-ci.com/user/database-setup/#ElasticSearch
2017-09-24 15:17:39 +13:00
Brenda Wallace
f4658df208 Further gem updates 2017-09-24 14:28:51 +13:00
Brenda Wallace
e21b95a353 Use floats, so the percentage calc works 2017-09-13 22:21:15 +12:00
Brenda Wallace
19205cb6a8 update from erubi to erubis gem broke stuff - rolling back 2017-09-13 22:08:21 +12:00
Brenda Wallace
17521cde17 Set required executable to jshint linting 2017-09-13 22:01:33 +12:00
Brenda Wallace
5f7d48c633 Don't need to create database if just running linters 2017-09-05 14:30:03 +12:00
Brenda Wallace
94bb3bf6bb Remove git guilt 2017-09-05 14:22:52 +12:00
Brenda Wallace
c9aacd0110 Specify the executable in the npm installed linters 2017-09-05 14:20:28 +12:00
Brenda Wallace
ca5f14bb37 Specify the executable in the npm installed linters 2017-09-05 14:19:24 +12:00
Brenda Wallace
43da004ccb Bundle update and change to platform-api instead of heroku 2017-09-05 13:58:56 +12:00
Cesy
2704fcf515 Merge pull request #1387 from Br3nda/ruby-2-4-1
Bump ruby version to 2.4.1
2017-09-04 11:21:40 +01:00
Shiny
1af19335d7 Merge branch 'dev' into ruby-2-4-1 2017-09-01 13:00:46 +12:00
Shiny
4d33c32866 Merge branch 'master' into dev 2017-09-01 12:20:15 +12:00
Brenda Wallace
01333bf965 Use string.start_with? instead of a regexp 2017-09-01 12:11:57 +12:00
Brenda Wallace
a145abff56 Changed regex to matches? to appease rubocop 2017-08-31 21:27:22 +12:00
Brenda Wallace
9732553d3b Added xmlrpc gem to solve rake errors on travis 2017-08-31 21:04:55 +12:00
Brenda Wallace
9142613b6b Bump ruby version to 2.4.1 2017-08-22 13:49:43 +12:00
Cesy
7132c95b61 Merge pull request #1382 from Growstuff/bundle-update-2017-08-03-163455
Bundle Update on 2017-08-03
2017-08-21 09:40:49 +01:00
Shiny
38b2d8de0f Merge branch 'dev' into master 2017-08-20 17:25:01 +12:00
Shiny
8f76ccf836 Merge branch 'dev' into bundle-update-2017-08-03-163455 2017-08-20 17:21:38 +12:00
ancyentMariner
491982f8f3 added security contact info to readme
udpated to actual email address

added name to contributors
2017-08-20 17:21:14 +12:00
deppbot
58e6411bbe Bundle Update on 2017-08-03 2017-08-03 16:34:56 +08:00
Daniel O'Connor
ac7e116eae Merge pull request #1375 from Growstuff/bundle-update-2017-07-25-161454
Bundle Update on 2017-07-25
2017-08-03 14:17:43 +09:30
deppbot
1526257a0d Bundle Update on 2017-07-25 2017-07-25 16:14:55 +08:00
deppbot
7234848c5f Bundle Update on 2017-07-22 2017-07-24 06:57:44 +12:00
deppbot
6e453707b9 Bundle Update on 2017-07-18 2017-07-20 21:24:40 +12:00
Daniel O'Connor
dac2d1d4c2 Merge pull request #1367 from Growstuff/bundle-update-2017-06-28-101508
Bundle Update on 2017-06-28
2017-07-17 23:31:09 +09:30
deppbot
6c4c1ff8ba Bundle Update on 2017-06-25 2017-06-30 07:06:28 +12:00
deppbot
93d1bfd05d Bundle Update on 2017-06-22 2017-06-30 07:06:28 +12:00
deppbot
6167e291d2 Bundle Update on 2017-06-18 2017-06-30 07:06:28 +12:00
Cesy Avon
deb1e27176 Making rubocop happy 2017-06-30 07:06:28 +12:00
Cesy Avon
82bb6c2f3b Putting jquery-ui-rails back so things work 2017-06-30 07:06:28 +12:00
Cesy Avon
24d9d714b2 Bundle update 2017-06-30 07:06:28 +12:00
Cesy Avon
d9ad55db7c Removing any locks on versions that don't have comments explaining why 2017-06-30 07:06:28 +12:00
deppbot
4dad76e635 Bundle Update on 2017-06-15 2017-06-30 07:06:28 +12:00
deppbot
252791b47d Bundle Update on 2017-06-12 2017-06-30 07:06:28 +12:00
deppbot
aa849c2e1f Bundle Update on 2017-06-28 2017-06-28 10:15:09 +08:00
Shiny
b03a59cb93 Merge branch 'master' into dev 2017-06-25 12:09:34 +12:00
deppbot
e761ecc356 Bundle Update on 2017-06-25 2017-06-25 12:08:30 +12:00
deppbot
69b887ba79 Bundle Update on 2017-06-22 2017-06-22 08:09:01 +12:00
deppbot
e4c2f777ac Bundle Update on 2017-06-18 2017-06-19 23:06:24 +12:00
Daniel O'Connor
f0cb635b42 Merge pull request #1362 from cesy/bundleupdate2
Upgrade and unpin some gems
2017-06-16 07:52:55 +09:30
Cesy Avon
4116e201b5 Making rubocop happy 2017-06-15 15:28:50 +00:00
Cesy Avon
5788c0c5ce Putting jquery-ui-rails back so things work 2017-06-15 15:28:50 +00:00
Cesy Avon
6f6e0a58a3 Bundle update 2017-06-15 15:28:50 +00:00
Cesy Avon
15b49672ee Removing any locks on versions that don't have comments explaining why 2017-06-15 15:28:14 +00:00
Daniel O'Connor
9e2c7d0748 Merge pull request #1361 from Growstuff/bundle-update-2017-06-15-181612
Bundle Update on 2017-06-15
2017-06-15 20:04:07 +09:30
deppbot
5ff0e2c565 Bundle Update on 2017-06-15 2017-06-15 18:16:13 +08:00
Cesy
d40665fb08 Merge pull request #1360 from Growstuff/bundle-update-2017-06-12-143439
Bundle Update on 2017-06-12
2017-06-12 09:03:45 +01:00
Cesy
3b6a42b8f2 Merge pull request #1343 from Growstuff/dev
Release 26
2017-06-12 09:01:10 +01:00
deppbot
cf3772af43 Bundle Update on 2017-06-12 2017-06-12 14:34:40 +08:00
Cesy
2f30343303 Merge pull request #1341 from Br3nda/issue-1044-account-deletion
Issue 1044 account deletion
2017-06-11 19:01:00 +01:00
Brenda Wallace
8de7e7a00b remove pending admin deletion specs. covered by model spec 2017-06-09 23:35:04 +12:00
Brenda Wallace
46efcf3e61 Spec for Forum owners and Crop creators deleting their accounts 2017-06-09 23:25:40 +12:00
Brenda Wallace
7968f3e407 Marked some un-written specs as pending 2017-06-09 23:00:38 +12:00
Brenda Wallace
639232bc87 Removal from newsletter spec is in model spec 2017-06-09 22:55:11 +12:00
Brenda Wallace
e0bc1c936a Spec for comments by deleted members 2017-06-09 22:54:36 +12:00
Brenda Wallace
910a9673dc Unsubscribes newsletter before member destroying 2017-06-09 22:39:07 +12:00
Brenda Wallace
582dd2c9fd Checks the deleted members are not found 2017-06-09 21:28:47 +12:00
Brenda Wallace
1a743d7592 Filled in spec for link to delete member's account 2017-06-09 21:17:12 +12:00
Shiny
174040aa1b Merge branch 'dev' into issue-1044-account-deletion 2017-06-09 21:04:41 +12:00
deppbot
4471ac64e4 Bundle Update on 2017-06-09 2017-06-09 21:03:03 +12:00
Daniel O'Connor
a8bb6c9f58 Merge pull request #1357 from cesy/bundleupdate0
Bundle update 2017-06-08
2017-06-09 09:55:12 +09:30
Daniel O'Connor
7d7053f558 Merge branch 'dev' into bundleupdate0 2017-06-09 09:54:24 +09:30
Daniel O'Connor
6f59896d96 Merge pull request #1358 from cesy/bundleupdate
Rails 4.2.7->4.2.8
2017-06-09 09:53:45 +09:30
Cesy Avon
e8cf19cc9d Bundle update 2017-06-08 2017-06-08 16:20:11 +00:00
Cesy Avon
5a3d15d101 Bundle update 2017-06-08 16:19:00 +00:00
Cesy Avon
142be72fc3 Upgrading Rails 2017-06-08 16:07:30 +00:00
Brenda Wallace
c6331fc449 Spec checks deleted member doesn't appear in interesting queries 2017-06-04 19:31:27 +12:00
Brenda Wallace
e8455cd943 Merge remote-tracking branch 'origin/issue-1044-account-deletion' into issue-1044-account-deletion 2017-06-04 19:27:37 +12:00
Brenda Wallace
080e728905 Spec checks you can't log in after deleting your account 2017-06-04 19:21:58 +12:00
Shiny
db532fcc8f Merge branch 'dev' into issue-1044-account-deletion 2017-06-04 13:00:30 +12:00
deppbot
e78d899528 Bundle Update on 2017-06-03 2017-06-04 12:55:47 +12:00
Brenda Wallace
1f916b8314 Post says Member Deleted when they are 2017-06-02 22:51:48 +12:00
Brenda Wallace
1cdcaac41e comment says "Member Deleted" when they are 2017-06-02 22:50:48 +12:00
Brenda Wallace
bbc3ca749f Removed author_exists scope. It is part of default 2017-06-02 22:43:25 +12:00
Brenda Wallace
20b980a162 Helpful comment explains why we use act_as_paranoid 2017-06-02 22:42:03 +12:00
Brenda Wallace
37897ad595 Merge remote-tracking branch 'origin/issue-1044-account-deletion' into issue-1044-account-deletion 2017-06-02 22:40:56 +12:00
Brenda Wallace
72f805e135 Doesn't need check the :deleted field in registraions 2017-06-02 22:40:39 +12:00
Shiny
1bb4f601a1 Merge branch 'dev' into issue-1044-account-deletion 2017-06-02 22:35:07 +12:00
Brenda Wallace
fb012c073e leaves a record of orders and payments intact when members deleted 2017-06-02 22:34:19 +12:00
Brenda Wallace
3dfd9eedca Updating member deletion specs 2017-06-02 21:49:28 +12:00
Brenda Wallace
75d2c0ea3c destroy member if password correct 2017-06-02 20:49:30 +12:00
Brenda Wallace
08996c4157 removed members#destroy. this should be on the registrations controller 2017-06-02 20:48:43 +12:00
Brenda Wallace
c48e24845e Remove owner_exists scope 2017-06-02 20:28:32 +12:00
Cesy Avon
61f93df6ff Feature specs for member deletion 2017-06-02 19:48:59 +12:00
deppbot
34e5e0850d Bundle Update on 2017-05-31 2017-05-31 18:27:23 +12:00
Shiny
7621da7041 Merge branch 'dev' into issue-1044-account-deletion 2017-05-30 20:39:44 +12:00
Brenda Wallace
8bcc5104e5 Delegate planting predictions 2017-05-29 22:45:14 +12:00
Brenda Wallace
4bbeca9f3e only look up other plantings finishing, if we have a crop 2017-05-29 22:45:14 +12:00
Brenda Wallace
54748ac20d Removed current_date variable from planting_predictions 2017-05-29 22:45:14 +12:00
Brenda Wallace
3c8b80574a Small DRY of planting models -> predict added 2017-05-29 22:45:14 +12:00
Brenda Wallace
288ad782d2 Planted? = true when planted today 2017-05-29 22:45:14 +12:00
Brenda Wallace
5d97a7edac Move setting of days_before_maturity back to plant model 2017-05-29 22:45:14 +12:00
Brenda Wallace
ff1c835cda Moving the planting predictions to own service 2017-05-29 22:45:14 +12:00
Daniel O'Connor
479f61b224 Merge pull request #1352 from Br3nda/admin-typo
Fixed admin typo
2017-05-29 19:18:59 +09:30
Brenda Wallace
ac94b8b6d3 Fixed admin typo 2017-05-29 17:52:08 +12:00
Shiny
fedc7a7fb6 Merge branch 'dev' into issue-1044-account-deletion 2017-05-29 16:17:59 +12:00
Brenda Wallace
9f9df07390 DRY photos controller more 2017-05-29 16:17:43 +12:00
Brenda Wallace
e5a705aeae Responders on the roles controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
fb0f74c4d8 Changed location we direct to after garden destroy 2017-05-29 16:17:43 +12:00
Brenda Wallace
963aafd5ab Added missing respond_with to crops controller
This tells rails what to use in json responses
2017-05-29 16:17:43 +12:00
Brenda Wallace
efe2f49e7f More DRY Harvests controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
a7178b6da7 changed spec to expect responder gem flash 2017-05-29 16:17:43 +12:00
Brenda Wallace
2da3cd6673 Fixed location to redirect to afver comment add/update 2017-05-29 16:17:43 +12:00
Brenda Wallace
5d50f9aec2 DRY the admin controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
cfb43ba07c DRY the homes controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
3811417d70 More DRY comments controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
9b3c77a0e6 More DRY comments controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
b5636af3be Add responders to alternate names controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
3e93fb5e2e Add responders on products controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
c22c92e9f4 Validates min price on product
the database has this constraint already. Adding so the ruby models
match.
2017-05-29 16:17:43 +12:00
Brenda Wallace
97a763660a DRY the products controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
8a25ecc635 DRY the roles controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
ee52c14b95 Put rubocop word array settings back 2017-05-29 16:17:43 +12:00
Brenda Wallace
3178e44843 DRY some of the places_controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
f510dfd8d9 Removed fixed issues from rubocop_todo 2017-05-29 16:17:43 +12:00
Brenda Wallace
7ad13d3eff Don't restrict crop search to approved 2017-05-29 16:17:43 +12:00
Brenda Wallace
e0c7e8c15b Removed route comments and extras on plant_parts controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
5e91effb12 More DRY the plant_parts controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
9560da90ab Add Scientific names to the menu 2017-05-29 16:17:43 +12:00
Brenda Wallace
9e1ed8e9eb add flash responders to plants parts controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
15592d01d0 Small dry of plant_parts controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
15d93e6c33 Move includes(:photos) before pagination 2017-05-29 16:17:43 +12:00
Brenda Wallace
484e20ba83 Don't attempt to create blank altnames or scinames 2017-05-29 16:17:43 +12:00
Brenda Wallace
d341e977c3 Fix up check of pending crops in view 2017-05-29 16:17:43 +12:00
Brenda Wallace
e7d7ee396e Further DRY of saving crops 2017-05-29 16:17:43 +12:00
Brenda Wallace
adf585852a Revert "Wikipedia url is always required"
This reverts commit ba5ad00f5c.
2017-05-29 16:17:43 +12:00
Brenda Wallace
de5b56235e Small style change to reduce size of crops#show 2017-05-29 16:17:43 +12:00
Brenda Wallace
318ef46ae8 crops pending approval, fetched in one method (DRY) 2017-05-29 16:17:43 +12:00
Brenda Wallace
b982793fbf Wikipedia url is always required
The form says it's required, so it should be required.
2017-05-29 16:17:43 +12:00
Brenda Wallace
6fef56ebb7 DRY the crops controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
fa586c15aa Dry the scientific names controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
51be3db970 Use a guard clasue in shop controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
5d654175a9 A bunch of single line methods 2017-05-29 16:17:43 +12:00
Brenda Wallace
e9003ad32a Small dry of crops controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
38c3320731 Rubocop fix up in accounts controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
e6b556851a More DRYing of members controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
a30285ef49 DRY some of the members controller 2017-05-29 16:17:43 +12:00
Brenda Wallace
4f67f17551 DRY the shop controller 2017-05-29 16:17:43 +12:00
Shiny
8f66009d0d Merge branch 'dev' into issue-1044-account-deletion 2017-05-29 15:56:17 +12:00
Daniel O'Connor
cdd12fd4dd Merge pull request #1348 from Br3nda/inactive-plantings
Inactive plantings show as tiny thumbnails
2017-05-29 10:52:37 +09:30
Daniel O'Connor
3ff0018a12 Merge branch 'dev' into inactive-plantings 2017-05-29 09:46:03 +09:30
Daniel O'Connor
0b0f479752 Merge pull request #1346 from Br3nda/bugfix-brokenurl-crop-rss
Fixed url in crop rss feed
2017-05-29 09:44:04 +09:30
Shiny
b7148b99dc Merge branch 'dev' into issue-1044-account-deletion 2017-05-28 20:54:02 +12:00
Brenda Wallace
8076e58a97 Owner must exist so we can see photos 2017-05-28 19:32:34 +12:00
Shiny
251d390c23 Merge branch 'dev' into bugfix-brokenurl-crop-rss 2017-05-28 18:52:03 +12:00
Brenda Wallace
f380f222a9 Move edit link to top of card 2017-05-28 18:51:01 +12:00
Brenda Wallace
eacdab45ba Removed planting.with_dates 2017-05-28 18:44:26 +12:00
Brenda Wallace
dcb949e7b3 Fixed bug - error when planting has no finished_at 2017-05-28 18:10:53 +12:00
Brenda Wallace
ebf1468652 Fix up small haml nexting bug 2017-05-28 18:07:19 +12:00
Brenda Wallace
4726b57c47 Inactive plantings show as tiny thumbnails 2017-05-28 17:13:04 +12:00
deppbot
f422336aff Bundle Update on 2017-05-28 2017-05-28 14:23:17 +12:00
Brenda Wallace
2c622af49c Fixed url in crop rss feed 2017-05-27 14:30:24 +12:00
Brenda Wallace
0b684eb05e Checks owner exists, in default_scopes of many models 2017-05-26 23:00:06 +12:00
Brenda Wallace
9c4a45bc29 Merge remote-tracking branch 'origin/issue-1044-account-deletion' into issue-1044-account-deletion 2017-05-26 21:25:00 +12:00
Brenda Wallace
00f7551c0a Merge remote-tracking branch 'upstream/dev' into issue-1044-account-deletion 2017-05-26 21:24:41 +12:00
Shiny
ee7b915313 Merge branch 'dev' into issue-1044-account-deletion 2017-05-26 21:24:29 +12:00
Daniel O'Connor
af0871cd0a Merge pull request #1344 from Growstuff/bundle-update-2017-05-25-051814
Bundle Update on 2017-05-25
2017-05-25 11:49:55 +09:30
deppbot
60d074a0de Bundle Update on 2017-05-25 2017-05-25 05:18:15 +08:00
Shiny
c2ba2719de Merge branch 'master' into dev 2017-05-24 13:26:06 +12:00
Shiny
afb0b9e387 Merge branch 'dev' into issue-1044-account-deletion 2017-05-24 13:25:21 +12:00
pozorvlak
e4e4d9600e Merge pull request #1340 from Br3nda/fix-1334
Display seeds for trade, on homepage, as thumbnails.
2017-05-24 00:35:28 +01:00
Brenda Wallace
a6964a8f4e Update specs to join before checking member is destroyed. 2017-05-21 21:59:28 +12:00
Brenda Wallace
b538330785 Form to delete your own account 2017-05-21 21:51:44 +12:00
Brenda Wallace
aee90268a5 Fixed old migration - to work under act_as_paranoid 2017-05-21 21:50:52 +12:00
Brenda Wallace
cabf849774 Deleting of users 2017-05-21 21:29:09 +12:00
Brenda Wallace
7251f3308b Merge branch 'fix-1334' into issue-1044-account-deletion 2017-05-21 11:46:30 +12:00
Brenda Wallace
121d3d99fe Tests for retrieving data of deleted members 2017-05-21 11:36:07 +12:00
Brenda Wallace
c4938e00e4 Member acts as paranoid 2017-05-21 11:33:12 +12:00
Brenda Wallace
4a926415db Call destroy, to mark a member as deleted 2017-05-21 11:32:54 +12:00
Brenda Wallace
7d4c9011aa Member.deleted_at column added 2017-05-21 11:31:53 +12:00
Brenda Wallace
b5b2582335 default scope says members deleted :false 2017-05-21 11:17:42 +12:00
Brenda Wallace
7d2a2b96a2 Only show gardens of members who are not deleted 2017-05-21 11:17:09 +12:00
Brenda Wallace
e2fe04a44b Form and controller method to mark members as deleted 2017-05-20 22:01:20 +12:00
Brenda Wallace
18c02bf33b Add deleted column to members table 2017-05-20 22:00:15 +12:00
Brenda Wallace
6c0b1018bc Updated spec for homepage seeds 2017-05-20 17:16:03 +12:00
Brenda Wallace
15e2b4f595 Seeds on home page looking like thumbnails 2017-05-20 17:01:07 +12:00
Brenda Wallace
6e7bf11ec8 Seeds delegate name and default_photo to their crop 2017-05-20 17:00:49 +12:00
Brenda Wallace
5f9b0890fb Move seed.interesting to a scope 2017-05-20 16:58:49 +12:00
Brenda Wallace
4841c52bcd order crop.plant_parts by plant_parts.name 2017-05-20 15:46:37 +12:00
Brenda Wallace
7baabca827 Unique is un-necesary when declaring relationship to plant_parts 2017-05-20 15:46:37 +12:00
Brenda Wallace
9a19007b85 More railsy order by in models 2017-05-20 15:46:37 +12:00
Brenda Wallace
677f850e21 Removed extra blank line 2017-05-20 15:46:37 +12:00
Brenda Wallace
d771bc3688 More railsy syntax in default scopes 2017-05-20 15:46:37 +12:00
Brenda Wallace
1dfc58c120 Remove default scope from harvest.
Causes an ORDER clause to be added in queries even when not selecting
from that table. E.g. if we 're looking for PlantParts that have a
Harvest
2017-05-20 15:46:37 +12:00
Brenda Wallace
6f58f266a6 Moving has_photos scope to PhotoCapable
-
2017-05-20 15:46:37 +12:00
deppbot
e38395b6ba Bundle Update on 2017-05-19 2017-05-20 07:07:27 +12:00
Daniel O'Connor
944d477dbc Merge pull request #1338 from Growstuff/bundle-update-2017-05-16-135240
Bundle Update on 2017-05-16
2017-05-16 16:45:08 +09:30
deppbot
cbf7ac0126 Bundle Update on 2017-05-16 2017-05-16 13:52:41 +08:00
Cesy
1ad171f37b Merge pull request #1335 from Growstuff/dev
Release 25
2017-05-15 20:43:16 +01:00
deppbot
06896dacd5 Bundle Update on 2017-05-13 2017-05-14 18:20:44 +12:00
Shiny
ff90d6430d Merge branch 'master' into dev 2017-05-13 11:35:26 +12:00
Brenda Wallace
4dbdbc4285 Pull haml gem back to version 4 2017-05-13 11:31:32 +12:00
deppbot
0f1c8e0658 Bundle Update on 2017-05-03 2017-05-13 11:31:32 +12:00
Daniel O'Connor
c9ec116c9b Merge pull request #1333 from Br3nda/garden-photos-fixup
Fix up of photo display on garden#show
2017-05-11 17:25:51 +09:30
Brenda Wallace
e61c3f619b Revert "Only show first 5 photos on gardens#show"
This reverts commit 93b25a5c32.
2017-05-07 16:10:14 +12:00
Brenda Wallace
93b25a5c32 Only show first 5 photos on gardens#show 2017-05-07 14:41:14 +12:00
Brenda Wallace
f7ca32d888 Moved garden photos to right/bottom 2017-05-06 13:30:57 +12:00
Brenda Wallace
d57c46066a updated view spec to find glypicon 2017-05-06 13:27:23 +12:00
Brenda Wallace
1e6cb2cfe4 don't eager load harvests 2017-05-06 12:15:03 +12:00
Brenda Wallace
67ae80056a Removed unnecesary div wrap 2017-05-06 12:08:23 +12:00
Brenda Wallace
13fa3c69e8 fixes places
card -> thumbnail
2017-05-06 12:06:28 +12:00
Brenda Wallace
caad557b2a Updating specs to click glypicons 2017-05-06 12:03:57 +12:00
Brenda Wallace
0f030d2c27 Planting thumbnail links to planting
fixes #1308
2017-05-06 11:48:17 +12:00
Brenda Wallace
66d548c9c1 Added some glypicons to gardenshow 2017-05-06 11:47:24 +12:00
Brenda Wallace
c168bb4a2b More fix up to alignment and thumbnail row counts gardens#show 2017-05-06 11:39:02 +12:00
Brenda Wallace
811db2961a Quick fix up of photo display on garden#show 2017-05-05 23:38:19 +12:00
Brenda Wallace
42cea2ebde Fixed spec for days_before_maturity 2017-04-28 20:48:25 +12:00
Brenda Wallace
ccc5eb3c9a Make calc_and_set_days_before_maturity public 2017-04-28 20:48:25 +12:00
Brenda Wallace
0e71a4fcb3 Removed un-needed rubocop ignores 2017-04-28 20:48:25 +12:00
Brenda Wallace
4ea681984f Call calc_and_set_days_before_maturity from controller 2017-04-28 20:48:25 +12:00
Brenda Wallace
dadc5b96c6 Reduced duplicate code further, with responders gem
This makes locale-friendly flash notices
2017-04-28 20:48:25 +12:00
Brenda Wallace
787fca138b Added helpful comment about days_until_maturity 2017-04-28 20:48:25 +12:00
Brenda Wallace
b820615081 Moved planting maturity to planting model. simplified controller 2017-04-28 20:48:25 +12:00
Cesy
812a6f5ec2 Merge pull request #1328 from Growstuff/dev
release 24
2017-04-28 07:31:21 +01:00
Shiny
f1b42ec699 Merge branch 'master' into dev 2017-04-25 13:14:40 +12:00
Brenda Wallace
26c17ea19c Plantings Thumbnails, fit to box 2017-04-25 10:58:17 +12:00
Brenda Wallace
acc75f80bf include harvests when retrieving data for plantings#index 2017-04-25 10:58:17 +12:00
Daniel O'Connor
a79a65363f Merge pull request #1326 from Br3nda/plantings-validators
Plantings validators
2017-04-24 17:47:41 +09:30
Shiny
dfeb4804e7 Merge branch 'dev' into plantings-validators 2017-04-23 19:35:37 +12:00
deppbot
9d20fafd06 Bundle Update on 2017-04-23 2017-04-23 19:35:23 +12:00
Shiny
e9a5ef0058 Merge branch 'dev' into plantings-validators 2017-04-22 20:50:29 +12:00
Brenda Wallace
d2378376e4 Plantings validators
Adding garden presence true.
Checks crop presence before crop approved
2017-04-22 20:48:48 +12:00
Daniel O'Connor
4b1b5d8a18 Merge pull request #1323 from Growstuff/bundle-update-2017-04-20-122131
Bundle Update on 2017-04-20
2017-04-20 15:27:04 +09:30
deppbot
a0770e80e7 Bundle Update on 2017-04-20 2017-04-20 12:21:32 +08:00
Shiny
f39fe94173 Merge branch 'master' into dev 2017-04-18 18:27:43 +00:00
Brenda Wallace
976bdbbd96 Removed owner_matches?
it's not used anymore
2017-04-18 07:09:47 +00:00
Brenda Wallace
cff1d8bfb9 Photo#show for signed in and not signed in, and other members 2017-04-18 07:09:47 +00:00
Brenda Wallace
bbdc54cb69 Photos#show links to items 2017-04-18 07:09:47 +00:00
Brenda Wallace
36f1f7b71a updating view spec - link to delete photo has changed 2017-04-18 07:09:47 +00:00
Brenda Wallace
e1731793dd controller specs for PhotoAssociations 2017-04-18 07:09:47 +00:00
Brenda Wallace
8ea3b27612 Responsive image on photos#show 2017-04-18 07:09:47 +00:00
Brenda Wallace
9469a69078 Deleting photo's association with another item 2017-04-18 07:09:47 +00:00
Brenda Wallace
cc46fe3336 Only delete own associations 2017-04-18 07:09:47 +00:00
Brenda Wallace
52b4064a2d Don't overwrite edited photo titles 2017-04-18 07:09:47 +00:00
Brenda Wallace
d367b9ef21 UI for removing photos from plantings 2017-04-18 07:09:47 +00:00
Brenda Wallace
4711e4669f Layout change on photos 2017-04-18 07:09:47 +00:00
Brenda Wallace
3e55024f98 Editing title of photos 2017-04-18 07:09:47 +00:00
Daniel O'Connor
ccf56bf944 Merge pull request #1321 from Br3nda/harvests-display
bugfix: Only show harvests if we have some
2017-04-18 12:24:01 +09:30
Shiny
42e51a9cf6 Merge branch 'dev' into harvests-display 2017-04-17 10:00:20 +00:00
Brenda Wallace
667e0cc0e3 bugfix: Only show harvests if we have some 2017-04-17 21:59:31 +12:00
Brenda Wallace
339830b3bb gardens#show Include crop, owner, harvesss and garden in query 2017-04-17 08:59:34 +00:00
Brenda Wallace
7770164672 Include owner in query, because we need it later 2017-04-17 08:59:34 +00:00
Brenda Wallace
f333607572 Reduced query count by .includes() on plantings 2017-04-17 08:59:34 +00:00
Brenda Wallace
87d3764eeb Route for flickr auth callback -- Fixes #1106 2017-04-17 08:28:52 +00:00
Cesy
faf487b719 Merge pull request #1314 from Br3nda/members-controller
Rubocop compliance for members controller
2017-04-17 09:13:26 +01:00
Shiny
3dbf0df19e Merge branch 'dev' into members-controller 2017-04-17 03:49:54 +00:00
Shiny
cd272a6443 Merge branch 'dev' into members-controller 2017-04-16 09:44:32 +00:00
Brenda Wallace
936a8778ed Rubocop compliance for members controller 2017-04-16 12:03:48 +12:00
110 changed files with 1391 additions and 1248 deletions

10
.hound.yml Normal file
View File

@@ -0,0 +1,10 @@
---
fail_on_violations: true
ruby:
config_file: .rubocop.yml
haml:
config_file: .haml-lint.yml
scss:
config_file: .scss-lint.yml
eslint:
config_file: .eslintrc

View File

@@ -31,6 +31,7 @@ PreCommit:
enabled: true
on_fail: warn
command: ['npm', 'run', 'coffeelint']
required_executable: 'npm'
HardTabs:
enabled: true
AuthorEmail:
@@ -42,10 +43,9 @@ PreCommit:
exclude:
- '**/bootstrap.min.css'
command: ['npm', 'run', 'csslint']
required_executable: 'npm'
HamlLint:
enabled: true
requires_files: true
on_warn: fail
command: ['bundle', 'exec', 'haml-lint', 'app/views']
JsonSyntax:
enabled: true
@@ -62,6 +62,7 @@ PreCommit:
- 'spec/javascripts/support/vendor/**'
- '**/bootstrap*'
command: ['npm', 'run', 'jshint']
required_executable: 'npm'
ScssLint:
enabled: true
RailsSchemaUpToDate:
@@ -71,11 +72,6 @@ PreCommit:
YamlLint:
enabled: true
PostCommit:
GitGuilt:
enabled: true
command: ['npm', 'run', 'git-guilt']
PostCheckout:
ALL:
quiet: false

View File

@@ -1,22 +1,11 @@
# This configuration was generated by
# `rubocop --auto-gen-config --no-offense-counts`
# on 2017-03-01 11:18:11 +1300 using RuboCop version 0.47.1.
# on 2017-05-28 10:57:55 +1200 using RuboCop version 0.47.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
Lint/AmbiguousRegexpLiteral:
Exclude:
- 'spec/controllers/admin/orders_controller_spec.rb'
- 'spec/controllers/orders_controller_spec.rb'
- 'spec/features/cms_spec.rb'
- 'spec/lib/haml/filters/escaped_markdown_spec.rb'
- 'spec/lib/haml/filters/growstuff_markdown_spec.rb'
- 'spec/models/comment_spec.rb'
- 'spec/models/planting_spec.rb'
- 'spec/views/members/show.rss.haml_spec.rb'
- 'spec/views/posts/show.html.haml_spec.rb'
Lint/HandleExceptions:
Exclude:
@@ -26,10 +15,8 @@ Lint/HandleExceptions:
# Configuration parameters: IgnoreEmptyBlocks, AllowUnusedKeywordArguments.
Lint/UnusedBlockArgument:
Exclude:
- 'app/controllers/crops_controller.rb'
- 'app/controllers/sessions_controller.rb'
- 'config/unicorn.rb'
- 'lib/haml/filters/growstuff_markdown.rb'
# Cop supports --auto-correct.
# Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods.
@@ -41,12 +28,6 @@ Lint/UnusedMethodArgument:
- 'app/validators/approved_validator.rb'
- 'spec/views/plantings/show.html.haml_spec.rb'
Lint/Void:
Exclude:
- 'spec/models/crop_spec.rb'
- 'spec/models/garden_spec.rb'
- 'spec/models/post_spec.rb'
# Cop supports --auto-correct.
Performance/StringReplacement:
Exclude:
@@ -63,12 +44,9 @@ Rails/OutputSafety:
- 'app/helpers/gardens_helper.rb'
# Configuration parameters: Blacklist.
# Blacklist: decrement!, decrement_counter, increment!, increment_counter
# toggle!, touch, update_all, update_attribute, update_column, update_columns,
# update_counters
# Blacklist: decrement!, decrement_counter, increment!, increment_counter, toggle!, touch, update_all, update_attribute, update_column, update_columns, update_counters
Rails/SkipsModelValidations:
Exclude:
- 'app/controllers/plantings_controller.rb'
- 'db/seeds.rb'
# Configuration parameters: EnforcedStyle, SupportedStyles.
@@ -115,7 +93,6 @@ Style/BlockDelimiters:
- 'spec/models/comment_spec.rb'
- 'spec/models/follow_spec.rb'
- 'spec/models/member_spec.rb'
- 'spec/models/planting_spec.rb'
- 'spec/models/post_spec.rb'
- 'spec/views/crops/edit.html.haml_spec.rb'
@@ -124,7 +101,6 @@ Style/BlockEndNewline:
Exclude:
- 'spec/models/ability_spec.rb'
- 'spec/models/member_spec.rb'
- 'spec/models/planting_spec.rb'
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: nested, compact
@@ -133,12 +109,6 @@ Style/ClassAndModuleChildren:
- 'app/controllers/admin/orders_controller.rb'
- 'lib/actions/oauth_signup_action.rb'
- 'lib/haml/filters/escaped_markdown.rb'
- 'lib/haml/filters/growstuff_markdown.rb'
# Cop supports --auto-correct.
Style/ClassMethods:
Exclude:
- 'app/models/planting.rb'
# Cop supports --auto-correct.
Style/ColonMethodCall:
@@ -146,13 +116,6 @@ Style/ColonMethodCall:
- 'spec/lib/haml/filters/escaped_markdown_spec.rb'
- 'spec/lib/haml/filters/growstuff_markdown_spec.rb'
# Cop supports --auto-correct.
# Configuration parameters: Keywords.
# Keywords: TODO, FIXME, OPTIMIZE, HACK, REVIEW
Style/CommentAnnotation:
Exclude:
- 'app/controllers/crops_controller.rb'
# Cop supports --auto-correct.
Style/EachForSimpleLoop:
Exclude:
@@ -164,14 +127,7 @@ Style/EachForSimpleLoop:
# SupportedStyles: compact, expanded
Style/EmptyMethod:
Exclude:
- 'app/controllers/accounts_controller.rb'
- 'app/controllers/photos_controller.rb'
- 'app/controllers/plant_parts_controller.rb'
- 'app/controllers/posts_controller.rb'
- 'app/controllers/products_controller.rb'
- 'app/controllers/roles_controller.rb'
- 'app/controllers/scientific_names_controller.rb'
- 'app/controllers/seeds_controller.rb'
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: format, sprintf, percent
@@ -189,7 +145,6 @@ Style/IdenticalConditionalBranches:
# Configuration parameters: MaxLineLength.
Style/IfUnlessModifier:
Exclude:
- 'app/controllers/shop_controller.rb'
- 'app/helpers/crops_helper.rb'
- 'app/models/planting.rb'
- 'config/initializers/geocoder.rb'
@@ -208,11 +163,6 @@ Style/MultilineIfModifier:
Exclude:
- 'spec/rails_helper.rb'
# Cop supports --auto-correct.
Style/MultilineIfThen:
Exclude:
- 'script/check_contributors_md'
Style/MultilineTernaryOperator:
Exclude:
- 'app/controllers/notifications_controller.rb'
@@ -228,10 +178,6 @@ Style/NegatedIf:
Exclude:
- 'app/helpers/crops_helper.rb'
Style/NestedTernaryOperator:
Exclude:
- 'app/controllers/plantings_controller.rb'
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, MinBodyLength, SupportedStyles.
# SupportedStyles: skip_modifier_ifs, always
@@ -253,7 +199,6 @@ Style/NumericPredicate:
- 'app/helpers/harvests_helper.rb'
- 'app/helpers/plantings_helper.rb'
- 'lib/tasks/growstuff.rake'
- 'script/check_contributors_md'
# Cop supports --auto-correct.
Style/ParallelAssignment:
@@ -265,15 +210,9 @@ Style/ParallelAssignment:
Style/PercentLiteralDelimiters:
Exclude:
- 'app/helpers/auto_suggest_helper.rb'
- 'script/check_contributors_md'
- 'spec/features/signin_spec.rb'
- 'spec/features/signout_spec.rb'
# Cop supports --auto-correct.
Style/PerlBackrefs:
Exclude:
- 'lib/haml/filters/growstuff_markdown.rb'
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
# SupportedStyles: slashes, percent_r, mixed
@@ -297,14 +236,8 @@ Style/SpecialGlobalVars:
# IgnoredMethods: respond_to, define_method
Style/SymbolProc:
Exclude:
- 'app/controllers/crops_controller.rb'
- 'lib/tasks/growstuff.rake'
# Cop supports --auto-correct.
Style/UnlessElse:
Exclude:
- 'app/controllers/omniauth_callbacks_controller.rb'
# Cop supports --auto-correct.
# Configuration parameters: SupportedStyles, WordRegex.
# SupportedStyles: percent, brackets

View File

@@ -1 +1 @@
2.3.4
2.4.1

View File

@@ -1,4 +1,4 @@
sudo: false
sudo: required
language: ruby
cache:
bundler: true
@@ -14,18 +14,26 @@ env:
- GROWSTUFF_SITE_NAME="Growstuff (travis)"
- RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
- secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
rvm:
- 2.3.4
before_install:
- ./script/install_phantomjs;
- export PATH=$PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64/bin:$PATH
# Force Travis to use Elastic Search 2.4.0
- >
if [ "${GROWSTUFF_ELASTICSEARCH}" = "true" ]; then
sudo dpkg -r elasticsearch;
curl -O https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/2.4.0/elasticsearch-2.4.0.deb;
sudo dpkg -i --force-confnew elasticsearch-2.4.0.deb;
sudo service elasticsearch start;
sleep 10;
curl localhost:9200;
fi
before_script:
- bundle exec rake db:create db:migrate db:test:prepare
- set -e
- >
if [ "${STATIC_CHECKS}" = "true" ]; then
./script/install_linters;
else
bundle exec rake db:create db:migrate db:test:prepare;
bundle exec rake assets:precompile;
fi
- set +e
@@ -40,9 +48,6 @@ script:
bundle exec rake jasmine:ci;
fi;
- set +e
services:
- elasticsearch
before_deploy:
- bundle exec script/heroku_maintenance.rb on
deploy:

View File

@@ -80,6 +80,7 @@ submit the change with your pull request.
- Megan Talbot / [meganft](https://github.com/meganft)
- Arun Kumar / [arun1595](https://github.com/arun1595)
- Harry Brodsky / [hbrodsk1](https://github.com/hbrodsk1)
- Jeff Kingswood / [ancyentmariner](https://github.com/ancyentmariner)
## Bots

44
Gemfile
View File

@@ -1,28 +1,28 @@
# frozen_string_literal: true
source 'https://rubygems.org'
ruby '2.3.4'
ruby '2.4.1'
gem 'rails', '~> 4.2.7'
gem 'rails', '~> 4.2.8'
gem 'bundler', '>=1.1.5'
gem 'coffee-rails', '~> 4.1.0'
gem 'coffee-rails'
gem 'haml'
gem 'sass-rails', '~> 5.0.4'
gem 'sass-rails'
# CSS framework
gem 'bootstrap-sass', '~> 3.3.6'
gem 'bootstrap-sass'
gem 'font-awesome-sass'
gem 'uglifier', '~> 2.7.2' # JavaScript compressor
gem 'uglifier' # JavaScript compressor
gem 'flickraw'
gem 'jquery-rails'
gem 'jquery-ui-rails', '~> 5.0.2'
gem 'jquery-ui-rails', '~> 5.0.2' # needs careful upgrade with change of location
gem 'js-routes' # provides access to Rails routes in Javascript
gem 'cancancan', '~> 1.9' # for checking member privileges
gem 'cancancan' # for checking member privileges
gem 'csv_shaper' # CSV export
gem 'figaro' # for handling config via ENV variables
gem 'gibbon', '~>1.2.0' # for Mailchimp newsletter subscriptions
@@ -32,10 +32,10 @@ gem 'pg'
gem 'ruby-units' # for unit conversion
gem 'unicorn' # http server
gem 'comfortable_mexican_sofa', '~> 1.12.0' # content management system
gem 'comfortable_mexican_sofa' # content management system
gem 'bootstrap-kaminari-views' # bootstrap views for kaminari
gem 'kaminari', '~> 0.17.0' # pagination
gem 'kaminari' # pagination
gem 'activemerchant'
gem 'active_utils'
@@ -45,13 +45,13 @@ gem 'sidekiq'
gem 'bluecloth'
# Pagination
gem 'will_paginate', '~> 3.0'
gem 'will_paginate'
# user signup/login/etc
gem 'devise', '>= 4.0.0'
gem 'devise'
# nicely formatted URLs
gem 'friendly_id', '~> 5.0.4'
gem 'friendly_id'
# gravatars
gem 'gravatar-ultimate'
@@ -66,7 +66,7 @@ gem 'bootstrap-datepicker-rails'
gem 'omniauth', '~> 1.3'
gem 'omniauth-facebook'
gem 'omniauth-flickr', '>= 0.0.15'
gem 'omniauth-twitter', '~> 1.2'
gem 'omniauth-twitter'
# 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
@@ -85,8 +85,13 @@ gem "hashie", ">= 3.5.3"
gem 'rake', '>= 10.0.0'
# # CMS
# gem 'comfortable_mexican_sofa', '~> 1.12.0'
# locale based flash notices for controllers
gem "responders"
# allows soft delete. Used for members.
gem 'acts_as_paranoid', '~> 0.5.0'
gem 'xmlrpc' # fixes rake error - can be removed if not needed later
group :production, :staging do
gem 'bonsai-elasticsearch-rails' # Integration with Bonsa-Elasticsearch on heroku
@@ -101,7 +106,7 @@ 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 'better_errors'
gem 'better_errors', '~> 2.2.0'
gem 'binding_of_caller'
gem 'guard'
gem 'guard-rspec'
@@ -118,7 +123,7 @@ group :development, :test do
gem 'capybara-email' # integration tests for email
gem 'capybara-screenshot' # for test debugging
gem 'coveralls', require: false # coverage analysis
gem 'database_cleaner', '~> 1.5.0'
gem 'database_cleaner'
gem 'factory_girl_rails' # for creating test data
gem 'haml-i18n-extractor'
gem 'haml-rails' # HTML templating language
@@ -136,8 +141,9 @@ end
group :test do
gem 'codeclimate-test-reporter', require: false
gem 'timecop'
end
group :travis do
gem 'heroku-api'
gem 'platform-api'
end

View File

@@ -1,71 +1,74 @@
GEM
remote: https://rubygems.org/
specs:
actionmailer (4.2.8)
actionpack (= 4.2.8)
actionview (= 4.2.8)
activejob (= 4.2.8)
actionmailer (4.2.10)
actionpack (= 4.2.10)
actionview (= 4.2.10)
activejob (= 4.2.10)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 1.0, >= 1.0.5)
actionpack (4.2.8)
actionview (= 4.2.8)
activesupport (= 4.2.8)
actionpack (4.2.10)
actionview (= 4.2.10)
activesupport (= 4.2.10)
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.8)
activesupport (= 4.2.8)
actionview (4.2.10)
activesupport (= 4.2.10)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
active_link_to (1.0.4)
active_link_to (1.0.5)
actionpack
addressable
active_merchant-paypal-bogus-gateway (0.1.0)
activemerchant
active_utils (3.3.3)
active_utils (3.3.9)
activesupport (>= 3.2, < 5.2.0)
i18n
activejob (4.2.8)
activesupport (= 4.2.8)
activejob (4.2.10)
activesupport (= 4.2.10)
globalid (>= 0.3.0)
activemerchant (1.64.0)
activesupport (>= 3.2.14, < 5.1)
activemerchant (1.73.0)
activesupport (>= 3.2.14, < 6.x)
builder (>= 2.1.2, < 4.0.0)
i18n (>= 0.6.9)
nokogiri (~> 1.4)
activemodel (4.2.8)
activesupport (= 4.2.8)
activemodel (4.2.10)
activesupport (= 4.2.10)
builder (~> 3.1)
activerecord (4.2.8)
activemodel (= 4.2.8)
activesupport (= 4.2.8)
activerecord (4.2.10)
activemodel (= 4.2.10)
activesupport (= 4.2.10)
arel (~> 6.0)
activesupport (4.2.8)
activesupport (4.2.10)
i18n (~> 0.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.5.1)
public_suffix (~> 2.0, >= 2.0.2)
acts_as_paranoid (0.5.0)
activerecord (>= 4.0, < 5.1)
activesupport (>= 4.0, < 5.1)
addressable (2.5.2)
public_suffix (>= 2.0.2, < 4.0)
arel (6.0.4)
ast (2.3.0)
autoprefixer-rails (6.7.7.2)
autoprefixer-rails (7.1.6)
execjs
bcrypt (3.1.11)
better_errors (2.1.1)
better_errors (2.2.0)
coderay (>= 1.0.0)
erubis (>= 2.6.6)
rack (>= 0.9.0)
binding_of_caller (0.7.2)
binding_of_caller (0.7.3)
debug_inspector (>= 0.0.1)
bluecloth (2.2.0)
bonsai-elasticsearch-rails (0.2.0)
elasticsearch-model (~> 0)
elasticsearch-rails (~> 0)
bootstrap-datepicker-rails (1.6.4.1)
bootstrap-datepicker-rails (1.7.1.1)
railties (>= 3.0)
bootstrap-kaminari-views (0.0.5)
kaminari (>= 0.13)
@@ -73,16 +76,16 @@ GEM
bootstrap-sass (3.3.7)
autoprefixer-rails (>= 5.2.1)
sass (>= 3.3.4)
bootstrap_form (2.6.0)
bootstrap_form (2.7.0)
builder (3.2.3)
bullet (5.5.1)
bullet (5.6.1)
activesupport (>= 3.0.0)
uniform_notifier (~> 1.10.0)
byebug (9.0.6)
cancancan (1.16.0)
capybara (2.13.0)
byebug (9.1.0)
cancancan (2.0.0)
capybara (2.15.4)
addressable
mime-types (>= 1.16)
mini_mime (>= 0.1.3)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
@@ -90,12 +93,12 @@ GEM
capybara-email (2.5.0)
capybara (~> 2.4)
mail
capybara-screenshot (1.0.14)
capybara-screenshot (1.0.17)
capybara (>= 1.0, < 3)
launchy
childprocess (0.6.3)
childprocess (0.8.0)
ffi (~> 1.0, >= 1.0.11)
climate_control (0.1.0)
climate_control (0.2.0)
cliver (0.3.2)
cocaine (0.5.8)
climate_control (>= 0.0.3, < 1.0)
@@ -103,10 +106,10 @@ GEM
simplecov (<= 0.13)
codemirror-rails (5.16.0)
railties (>= 3.0, < 6.0)
coderay (1.1.1)
coffee-rails (4.1.1)
coderay (1.1.2)
coffee-rails (4.2.2)
coffee-script (>= 2.2.0)
railties (>= 4.0.0, < 5.1.x)
railties (>= 4.0.0)
coffee-script (2.4.1)
coffee-script-source
execjs
@@ -134,17 +137,18 @@ GEM
term-ansicolor (~> 1.3)
thor (~> 0.19.1)
tins (~> 1.6)
crass (1.0.2)
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.1)
database_cleaner (1.6.1)
debug_inspector (0.0.3)
devise (4.3.0)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 4.1.0, < 5.1)
railties (>= 4.1.0, < 5.2)
responders
warden (~> 1.2.3)
diff-lcs (1.3)
@@ -167,14 +171,14 @@ GEM
faraday
multi_json
erubis (2.7.0)
excon (0.55.0)
excon (0.59.0)
execjs (2.7.0)
factory_girl (4.8.0)
factory_girl (4.8.1)
activesupport (>= 3.0.0)
factory_girl_rails (4.8.0)
factory_girl (~> 4.8.0)
railties (>= 3.0.0)
faraday (0.11.0)
faraday (0.12.2)
multipart-post (>= 1.2, < 3)
ffi (1.9.18)
figaro (1.1.1)
@@ -183,9 +187,9 @@ GEM
font-awesome-sass (4.7.0)
sass (>= 3.2)
formatador (0.2.5)
friendly_id (5.0.5)
friendly_id (5.2.3)
activerecord (>= 4.0.0)
geocoder (1.4.3)
geocoder (1.4.4)
gibbon (1.2.1)
httparty
multi_json (>= 1.9.0)
@@ -208,7 +212,8 @@ GEM
guard (~> 2.1)
guard-compat (~> 1.1)
rspec (>= 2.99.0, < 4.0)
haml (4.0.7)
haml (5.0.4)
temple (>= 0.8.0)
tilt
haml-i18n-extractor (0.5.9)
activesupport
@@ -216,31 +221,34 @@ GEM
highline
tilt
trollop (= 1.16.2)
haml-rails (0.9.0)
haml-rails (1.0.0)
actionpack (>= 4.0.1)
activesupport (>= 4.0.1)
haml (>= 4.0.6, < 5.0)
haml (>= 4.0.6, < 6.0)
html2haml (>= 1.0.1)
railties (>= 4.0.1)
haml_lint (0.24.0)
haml_lint (0.25.1)
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)
hashie (3.5.6)
heroics (0.0.24)
erubis (~> 2.0)
excon
moneta
multi_json (>= 1.9.2)
highline (1.7.8)
html2haml (2.1.0)
html2haml (2.2.0)
erubis (~> 2.7.0)
haml (~> 4.0)
haml (>= 4.0, < 6)
nokogiri (>= 1.6.0)
ruby_parser (~> 3.5)
httparty (0.14.0)
httparty (0.15.6)
multi_xml (>= 0.5.2)
i18n (0.8.1)
i18n (0.9.0)
concurrent-ruby (~> 1.0)
i18n-tasks (0.9.12)
activesupport (>= 4.0.2)
ast (>= 2.1.0)
@@ -251,28 +259,37 @@ GEM
parser (>= 2.2.3.0)
term-ansicolor (>= 1.3.2)
terminal-table (>= 1.5.1)
jasmine (2.5.2)
jasmine-core (>= 2.5.1, < 3.0.0)
jasmine (2.8.0)
jasmine-core (>= 2.8.0, < 3.0.0)
phantomjs
rack (>= 1.2.1)
rake
jasmine-core (2.5.2)
jasmine-core (2.8.0)
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.3)
js-routes (1.4.1)
railties (>= 3.2)
sprockets-rails
json (2.0.4)
json (2.1.0)
jwt (1.5.6)
kaminari (0.17.0)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
kaminari (1.1.1)
activesupport (>= 4.1.0)
kaminari-actionview (= 1.1.1)
kaminari-activerecord (= 1.1.1)
kaminari-core (= 1.1.1)
kaminari-actionview (1.1.1)
actionview
kaminari-core (= 1.1.1)
kaminari-activerecord (1.1.1)
activerecord
kaminari-core (= 1.1.1)
kaminari-core (1.1.1)
kgio (2.11.0)
kramdown (1.13.2)
kramdown (1.15.0)
launchy (2.4.3)
addressable (~> 2.3)
leaflet-markercluster-rails (0.7.0)
@@ -284,37 +301,40 @@ GEM
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
loofah (2.0.3)
loofah (2.1.1)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
lumberjack (1.0.11)
mail (2.6.4)
lumberjack (1.0.12)
mail (2.6.6)
mime-types (>= 1.16, < 4)
memcachier (0.0.2)
method_source (0.8.2)
method_source (0.9.0)
mime-types (3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2016.0521)
mimemagic (0.3.2)
mini_portile2 (2.1.0)
minitest (5.10.1)
mini_mime (0.1.4)
mini_portile2 (2.3.0)
minitest (5.10.3)
moneta (0.8.1)
multi_json (1.11.3)
multi_xml (0.6.0)
multipart-post (2.0.0)
nenv (0.3.0)
newrelic_rpm (4.1.0.333)
nokogiri (1.7.1)
mini_portile2 (~> 2.1.0)
newrelic_rpm (4.5.0.337)
nokogiri (1.8.1)
mini_portile2 (~> 2.3.0)
notiffany (0.1.1)
nenv (~> 0.1)
shellany (~> 0.0)
oauth (0.5.1)
oauth2 (1.3.1)
faraday (>= 0.8, < 0.12)
oauth (0.5.3)
oauth2 (1.4.0)
faraday (>= 0.8, < 0.13)
jwt (~> 1.0)
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (>= 1.2, < 3)
omniauth (1.6.1)
omniauth (1.7.1)
hashie (>= 3.4.6, < 3.6.0)
rack (>= 1.6.2, < 3)
omniauth-facebook (4.0.0)
@@ -340,37 +360,39 @@ GEM
mimemagic (~> 0.3.0)
parser (2.4.0.0)
ast (~> 2.2)
pg (0.20.0)
pg (0.21.0)
phantomjs (2.1.1.0)
platform-api (2.1.0)
heroics (~> 0.0.23)
moneta (~> 0.8.1)
plupload-rails (1.2.1)
rails (>= 3.1)
poltergeist (1.14.0)
poltergeist (1.16.0)
capybara (~> 2.1)
cliver (~> 0.3.1)
websocket-driver (>= 0.2.0)
powerpack (0.1.1)
pry (0.10.4)
pry (0.11.2)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
public_suffix (2.0.5)
method_source (~> 0.9.0)
public_suffix (3.0.0)
quiet_assets (1.1.0)
railties (>= 3.1, < 5.0)
rack (1.6.5)
rack-protection (1.5.3)
rack (1.6.8)
rack-protection (2.0.0)
rack
rack-test (0.6.3)
rack (>= 1.0)
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)
rails (4.2.10)
actionmailer (= 4.2.10)
actionpack (= 4.2.10)
actionview (= 4.2.10)
activejob (= 4.2.10)
activemodel (= 4.2.10)
activerecord (= 4.2.10)
activesupport (= 4.2.10)
bundler (>= 1.3.0, < 2.0)
railties (= 4.2.8)
railties (= 4.2.10)
sprockets-rails
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
@@ -388,108 +410,112 @@ GEM
rails_stdout_logging
rails_serve_static_assets (0.0.5)
rails_stdout_logging (0.0.5)
railties (4.2.8)
actionpack (= 4.2.8)
activesupport (= 4.2.8)
railties (4.2.10)
actionpack (= 4.2.10)
activesupport (= 4.2.10)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rainbow (2.1.0)
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.3)
responders (2.3.0)
railties (>= 4.2.0, < 5.1)
rspec (3.5.0)
rspec-core (~> 3.5.0)
rspec-expectations (~> 3.5.0)
rspec-mocks (~> 3.5.0)
raindrops (0.19.0)
rake (12.1.0)
rb-fsevent (0.10.2)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
redis (4.0.1)
responders (2.4.0)
actionpack (>= 4.2.0, < 5.3)
railties (>= 4.2.0, < 5.3)
rspec (3.7.0)
rspec-core (~> 3.7.0)
rspec-expectations (~> 3.7.0)
rspec-mocks (~> 3.7.0)
rspec-activemodel-mocks (1.0.3)
activemodel (>= 3.0)
activesupport (>= 3.0)
rspec-mocks (>= 2.99, < 4.0)
rspec-core (3.5.4)
rspec-support (~> 3.5.0)
rspec-expectations (3.5.0)
rspec-core (3.7.0)
rspec-support (~> 3.7.0)
rspec-expectations (3.7.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
rspec-mocks (3.5.0)
rspec-support (~> 3.7.0)
rspec-mocks (3.7.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
rspec-rails (3.5.2)
rspec-support (~> 3.7.0)
rspec-rails (3.7.1)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
rspec-core (~> 3.5.0)
rspec-expectations (~> 3.5.0)
rspec-mocks (~> 3.5.0)
rspec-support (~> 3.5.0)
rspec-support (3.5.0)
rspec-core (~> 3.7.0)
rspec-expectations (~> 3.7.0)
rspec-mocks (~> 3.7.0)
rspec-support (~> 3.7.0)
rspec-support (3.7.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.1.0)
ruby-progressbar (1.9.0)
ruby-units (2.2.0)
ruby_dep (1.5.0)
ruby_parser (3.9.0)
sexp_processor (~> 4.1)
ruby_parser (3.10.1)
sexp_processor (~> 4.9)
rubyzip (1.2.1)
sass (3.4.23)
sass (3.5.2)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
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 (3.3.0)
selenium-webdriver (3.6.0)
childprocess (~> 0.5)
rubyzip (~> 1.0)
websocket (~> 1.0)
sexp_processor (4.9.0)
sexp_processor (4.10.0)
shellany (0.0.1)
sidekiq (4.2.10)
sidekiq (5.0.5)
concurrent-ruby (~> 1.0)
connection_pool (~> 2.2, >= 2.2.0)
rack-protection (>= 1.5.0)
redis (~> 3.2, >= 3.2.1)
redis (>= 3.3.4, < 5)
simplecov (0.12.0)
docile (~> 1.1.0)
json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.0)
slop (3.6.0)
simplecov-html (0.10.2)
sparkpost_rails (1.4.0)
rails (>= 4.0, < 5.1)
sprockets (3.7.1)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (3.2.0)
sprockets-rails (3.2.1)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
sysexits (1.2.0)
temple (0.8.0)
term-ansicolor (1.6.0)
tins (~> 1.0)
terminal-table (1.7.3)
unicode-display_width (~> 1.1.1)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
thor (0.19.4)
thread (0.2.2)
thread_safe (0.3.6)
tilt (2.0.7)
tins (1.13.2)
tilt (2.0.8)
timecop (0.9.1)
tins (1.15.0)
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.3)
unicorn (5.3.0)
uglifier (3.2.0)
execjs (>= 0.3.0, < 3)
unicode-display_width (1.3.0)
unicorn (5.3.1)
kgio (~> 2.6)
raindrops (~> 0.7)
uniform_notifier (1.10.0)
@@ -499,12 +525,12 @@ GEM
nokogiri (>= 1.2.0)
rack (>= 1.0)
rack-test (>= 0.5.3)
websocket (1.2.4)
websocket-driver (0.6.5)
websocket-driver (0.7.0)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.2)
will_paginate (3.1.5)
xpath (2.0.0)
will_paginate (3.1.6)
xmlrpc (0.3.0)
xpath (2.1.0)
nokogiri (~> 1.3)
PLATFORMS
@@ -514,29 +540,30 @@ DEPENDENCIES
active_merchant-paypal-bogus-gateway
active_utils
activemerchant
better_errors
acts_as_paranoid (~> 0.5.0)
better_errors (~> 2.2.0)
binding_of_caller
bluecloth
bonsai-elasticsearch-rails
bootstrap-datepicker-rails
bootstrap-kaminari-views
bootstrap-sass (~> 3.3.6)
bootstrap-sass
bullet
bundler (>= 1.1.5)
byebug
cancancan (~> 1.9)
cancancan
capybara
capybara-email
capybara-screenshot
codeclimate-test-reporter
coffee-rails (~> 4.1.0)
comfortable_mexican_sofa (~> 1.12.0)
coffee-rails
comfortable_mexican_sofa
coveralls
csv_shaper
d3-rails (~> 3.5)
dalli
database_cleaner (~> 1.5.0)
devise (>= 4.0.0)
database_cleaner
devise
elasticsearch-api (~> 2.0.0)
elasticsearch-model
elasticsearch-rails
@@ -544,7 +571,7 @@ DEPENDENCIES
figaro
flickraw
font-awesome-sass
friendly_id (~> 5.0.4)
friendly_id
geocoder
gibbon (~> 1.2.0)
gravatar-ultimate
@@ -555,13 +582,12 @@ DEPENDENCIES
haml-rails
haml_lint
hashie (>= 3.5.3)
heroku-api
i18n-tasks
jasmine
jquery-rails
jquery-ui-rails (~> 5.0.2)
js-routes
kaminari (~> 0.17.0)
kaminari
leaflet-markercluster-rails
leaflet-rails (~> 0.7.7)
letter_opener
@@ -570,30 +596,35 @@ DEPENDENCIES
omniauth (~> 1.3)
omniauth-facebook
omniauth-flickr (>= 0.0.15)
omniauth-twitter (~> 1.2)
omniauth-twitter
pg
platform-api
poltergeist
pry
quiet_assets
rails (~> 4.2.7)
rails (~> 4.2.8)
rails_12factor
rainbow (< 2.2.0)
rake (>= 10.0.0)
responders
rspec-activemodel-mocks
rspec-rails
rubocop (<= 0.47.1)
ruby-units
sass-rails (~> 5.0.4)
sass-rails
selenium-webdriver
sidekiq
sparkpost_rails
uglifier (~> 2.7.2)
timecop
uglifier
unicorn
webrat
will_paginate (~> 3.0)
will_paginate
xmlrpc
RUBY VERSION
ruby 2.3.4p301
ruby 2.4.1p111
BUNDLED WITH
1.14.6
1.15.4

View File

@@ -57,5 +57,7 @@ Feel free to comment on any of the issues on [Github](https://github.com/Growstu
For more information about this project, contact [info@growstuff.org](mailto:info@growstuff.org).
Security Issues: If you find an authorization bypass or data breach, please contact our maintainers directly at [maintainers@growstuff.org](mailto:maintainers@growstuff.org).
You can also contact us on [Twitter](http://twitter.com/growstufforg/) or
[Facebook](https://www.facebook.com/pages/Growstuff/1531133417099494) or [Github](https://github.com/Growstuff/growstuff/issues)..

View File

@@ -108,8 +108,6 @@ p.stats
.planting
dl.planting-attributes
font-size: 85%
dt
text-align: left
dd
@@ -118,14 +116,13 @@ p.stats
@media (min-width: $screen-md-min)
.planting-thumbnail
dl.planting-attributes
font-size: 85%
width: 100%
dt
text-align: left
width: 80px
width: 120px
dd
padding-left: 80px
padding-left: 120px
margin-left: auto
.navbar .navbar-form
@@ -336,3 +333,15 @@ $state-success-bg: lighten($green, 50%)
ul.plantings
list-style-type: none
ul.thumbnail-buttons
list-style-type: none
text-align: right
.hover-wrapper .text
position: absolute
visibility: hidden
.hover-wrapper:hover .text
visibility: visible

View File

@@ -15,8 +15,7 @@ class AccountsController < ApplicationController
end
# GET /accounts/1/edit
def edit
end
def edit; end
# PUT /accounts/1
def update

View File

@@ -1,16 +1,12 @@
class AdminController < ApplicationController
respond_to :html
def index
authorize! :manage, :all
respond_to do |format|
format.html # index.html.haml
end
end
def newsletter
authorize! :manage, :all
@members = Member.confirmed.wants_newsletter.all
respond_to do |format|
format.html # index.html.haml
end
respond_with @members
end
end

View File

@@ -2,6 +2,7 @@ class AlternateNamesController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
responders :flash
# GET /alternate_names
# GET /alternate_names.json

View File

@@ -3,56 +3,42 @@ class CommentsController < ApplicationController
load_and_authorize_resource
respond_to :html, :json
respond_to :rss, only: :index
responders :flash
# GET /comments
# GET /comments.json
# GET /comments.rss
def index
@comments = Comment.paginate(page: params[:page])
respond_with(@comments)
end
# GET /comments/new
# GET /comments/new.json
def new
@comment = Comment.new
@post = Post.find_by(id: params[:post_id])
if @post
@comments = @post.comments
respond_with(@comment)
respond_with(@comments)
else
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
@comments = @comment.post.comments
end
# POST /comments
# POST /comments.json
def create
@comment = Comment.new(comment_params)
@comment.author = current_member
flash[:notice] = "Comment was successfully created." if @comment.save
respond_with(@comment.post)
@comment.save
respond_with @comment, location: @comment.post
end
# PUT /comments/1
# PUT /comments/1.json
def update
# only body can be updated
if @comment.update(body: comment_params['body'])
flash[:notice] = 'Comment was successfully updated.'
end
respond_with(@comment.post)
@comment.update(body: comment_params['body'])
respond_with @comment, location: @comment.post
end
# DELETE /comments/1
# DELETE /comments/1.json
def destroy
@post = @comment.post
@comment.destroy

View File

@@ -4,40 +4,22 @@ class CropsController < ApplicationController
before_action :authenticate_member!, except: [:index, :hierarchy, :search, :show]
load_and_authorize_resource
skip_authorize_resource only: [:hierarchy, :search]
respond_to :html, :json, :rss, :csv
responders :flash
# GET /crops
# GET /crops.json
def index
@sort = params[:sort]
@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
format.json { render json: @crops }
format.rss do
@crops = Crop.recent.includes(:scientific_names, :creator)
render rss: @crops
end
format.csv do
@filename = "Growstuff-Crops-#{Time.zone.now.to_s(:number)}.csv"
@crops = Crop.includes(:scientific_names, :plantings, :seeds, :creator)
render csv: @crops
end
end
@crops = crops
@num_requested_crops = requested_crops.size if current_member
@filename = filename
respond_with @crops
end
def requested
@requested = Crop.pending_approval.where(requester: current_member).paginate(page: params[:page])
@requested = requested_crops.paginate(page: params[:page])
respond_with @requested
end
# GET /crops/wrangle
def wrangle
@approval_status = params[:approval_status]
@crops = case @approval_status
@@ -47,176 +29,124 @@ class CropsController < ApplicationController
Crop.rejected
else
Crop.recent
end
@crops = @crops.paginate(page: params[:page])
end.paginate(page: params[:page])
@crop_wranglers = Role.crop_wranglers
respond_to do |format|
format.html
end
respond_with @crops
end
# GET /crops/hierarchy
def hierarchy
@crops = Crop.toplevel
respond_to do |format|
format.html
end
respond_with @crops
end
# GET /crops/search
def search
@term = params[:term]
@matches = Crop.search(@term)
@paginated_matches = @matches.paginate(page: params[:page])
respond_to do |format|
format.html
format.json { render json: @matches }
end
respond_with @matches
end
# GET /crops/1
# GET /crops/1.json
def show
@crop = Crop.includes(:scientific_names, plantings: :photos).find(params[:id])
@posts = @crop.posts.paginate(page: params[:page])
respond_to do |format|
format.html # show.html.haml
format.json do
# TODO RABL or similar one day to avoid presentation logic here
owner_structure = {
owner: {
only: [:id, :login_name, :location, :latitude, :longitude]
}
}
render json: @crop.to_json(include: {
plantings: {
include: owner_structure
}
})
end
format.json { render json: @crop.to_json(crop_json_fields) }
end
end
# GET /crops/new
# GET /crops/new.json
def new
@crop = Crop.new
@crop.alternate_names.build
@crop.scientific_names.build
respond_to do |format|
format.html # new.html.haml
format.json { render json: @crop }
end
respond_with @crop
end
# GET /crops/1/edit
def edit
@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.role? :crop_wrangler
@crop.creator = current_member
success_msg = "Crop was successfully created."
else
@crop.requester = current_member
@crop.approval_status = "pending"
success_msg = "Crop was successfully requested."
end
respond_to do |format|
if @crop.save
params[:alt_name].each do |index, value|
create_name('alternate', value)
end
params[:sci_name].each do |index, value|
create_name('scientific', value)
end
unless current_member.role? :crop_wrangler
Role.crop_wranglers.each do |w|
Notifier.new_crop_request(w, @crop).deliver_now!
end
end
notify_wranglers if Crop.transaction { @crop.save && save_crop_names }
format.html { redirect_to @crop, notice: success_msg }
format.json { render json: @crop, status: :created, location: @crop }
else
format.html { render action: "new" }
format.json { render json: @crop.errors, status: :unprocessable_entity }
end
end
respond_with @crop
end
# PUT /crops/1
# PUT /crops/1.json
def update
previous_status = @crop.approval_status
@crop.creator = current_member if previous_status == "pending"
respond_to do |format|
if @crop.update(crop_params)
recreate_names('alt_name', 'alternate')
recreate_names('sci_name', 'scientific')
if @crop.update(crop_params)
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_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 }
else
format.html { render action: "edit" }
format.json { render json: @crop.errors, status: :unprocessable_entity }
end
notifier.deliver_now! if previous_status == "pending"
end
respond_with @crop
end
# DELETE /crops/1
# DELETE /crops/1.json
def destroy
@crop.destroy
respond_to do |format|
format.html { redirect_to crops_url }
format.json { head :no_content }
end
respond_with @crop
end
private
def popular_crops
Crop.popular.includes(:scientific_names, plantings: :photos)
def notifier
case @crop.approval_status
when "approved"
Notifier.crop_request_approved(@crop.requester, @crop)
when "rejected"
Notifier.crop_request_rejected(@crop.requester, @crop)
end
end
def save_crop_names
params[:alt_name]&.values&.each do |value|
create_name!('alternate', value) unless value.empty?
end
params[:sci_name]&.values&.each do |value|
create_name!('scientific', value) unless value.empty?
end
end
def notify_wranglers
return if current_member.role? :crop_wrangler
Role.crop_wranglers.each do |w|
Notifier.new_crop_request(w, @crop).deliver_now!
end
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)
params[param_name].each do |_i, 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
@crop.send("#{name_type}_names").each(&:destroy)
end
def create_name(name_type, value)
@crop.send("#{name_type}_names").create(name: value, creator_id: current_member.id)
def create_name!(name_type, value)
@crop.send("#{name_type}_names").create!(name: value, creator_id: current_member.id)
end
def crop_params
@@ -227,8 +157,37 @@ class CropsController < ApplicationController
:approval_status,
:request_notes,
:reason_for_rejection,
:rejection_notes, scientific_names_attributes: [:scientific_name,
:_destroy,
:id])
:rejection_notes,
scientific_names_attributes: [:scientific_name,
:_destroy,
:id])
end
def filename
"Growstuff-Crops-#{Time.zone.now.to_s(:number)}.csv"
end
def crop_json_fields
{
include: {
plantings: {
include: {
owner: { only: [:id, :login_name, :location, :latitude, :longitude] }
}
},
scientific_names: { only: [:name] },
alternate_names: { only: [:name] }
}
}
end
def crops
q = Crop.approved.includes(:scientific_names, plantings: :photos)
q = q.popular unless @sort == 'alpha'
q.includes(:photos).paginate(page: params[:page])
end
def requested_crops
current_member.requested_crops.pending_approval
end
end

View File

@@ -10,13 +10,18 @@ class GardensController < ApplicationController
@owner = Member.find_by(slug: params[:owner])
@show_all = params[:all] == '1'
@gardens = gardens
respond_with(@gardens)
end
# GET /gardens/1
# GET /gardens/1.json
def show
@current_plantings = @garden.plantings.current
.includes(:crop, :owner)
.order(planted_at: :desc)
@finished_plantings = @garden.plantings.finished
.includes(:crop)
.order(finished_at: :desc)
respond_with(@garden)
end
@@ -63,6 +68,6 @@ class GardensController < ApplicationController
def gardens
g = @owner ? @owner.gardens : Garden.all
g = g.active unless @show_all
g.includes(:owner).order(:updated_at).paginate(page: params[:page])
g.joins(:owner).order(:updated_at).paginate(page: params[:page])
end
end

View File

@@ -3,58 +3,45 @@ class HarvestsController < ApplicationController
load_and_authorize_resource
respond_to :html, :json
respond_to :csv, only: :index
responders :flash
# GET /harvests
# GET /harvests.json
def index
@owner = Member.find_by(slug: params[:owner])
@crop = Crop.find_by(slug: params[:crop])
@planting = Planting.find_by(slug: params['planting_id'])
@owner = Member.find_by(slug: params[:owner]) if params[:owner]
@crop = Crop.find_by(slug: params[:crop]) if params[:crop]
@planting = Planting.find_by(slug: params[:planting_id]) if params[:planting_id]
@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: 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])
respond_with(@harvest)
end
# GET /harvests/1/edit
def edit
@planting = @harvest.planting if @harvest.planting_id
end
# POST /harvests
# POST /harvests.json
def create
@harvest.crop_id = @harvest.planting.crop_id if @harvest.planting_id
flash[:notice] = I18n.t('harvests.created') if @harvest.save
@harvest.save
respond_with(@harvest)
end
# PUT /harvests/1
# PUT /harvests/1.json
def update
flash[:notice] = I18n.t('harvests.updated') if @harvest.update(harvest_params)
@harvest.update(harvest_params)
respond_with(@harvest)
end
# DELETE /harvests/1
# DELETE /harvests/1.json
def destroy
@harvest.destroy
respond_with(@harvest)
@@ -81,11 +68,11 @@ class HarvestsController < ApplicationController
@owner.harvests
elsif @crop
@crop.harvests
elsif @planting_id
elsif @planting
@planting.harvests
else
Harvest
end.includes(:owner, :crop).paginate(page: params[:page])
end.joins(:owner, :crop).paginate(page: params[:page])
end
def csv_filename

View File

@@ -1,14 +1,11 @@
class HomeController < ApplicationController
skip_authorize_resource
respond_to :html
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
# caching will be effective.
respond_to do |format|
format.html # index.html.haml
end
end
end

View File

@@ -1,26 +1,15 @@
class MembersController < ApplicationController
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
respond_to :html, :json, :rss
after_action :expire_homepage, only: :create
def index
@sort = params[:sort]
@members = if @sort == 'recently_joined'
Member.confirmed.recently_joined.paginate(page: params[:page])
else
Member.confirmed.paginate(page: params[:page])
end
@members = members
respond_to do |format|
format.html # index.html.haml
format.json do
render json: @members.to_json(only: [
:id, :login_name,
:slug, :bio, :created_at,
:location, :latitude, :longitude
])
end
format.json { render json: @members.to_json(only: member_json_fields) }
end
end
@@ -31,6 +20,7 @@ class MembersController < ApplicationController
@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.
@@ -38,13 +28,7 @@ class MembersController < ApplicationController
respond_to do |format|
format.html # show.html.haml
format.json do
render json: @member.to_json(only: [
:id, :login_name, :bio,
:created_at, :slug, :location,
:latitude, :longitude
])
end
format.json { render json: @member.to_json(only: member_json_fields) }
format.rss do
render(
layout: false,
@@ -99,11 +83,21 @@ class MembersController < ApplicationController
private
def expire_cache_fragments
expire_fragment("homepage_stats")
end
def member_params
params.require(:member).permit(:login_name, :tos_agreement, :email, :newsletter)
end
def member_json_fields
[
:id, :login_name,
:slug, :bio, :created_at,
:location, :latitude, :longitude
]
end
def members
q = Member.confirmed
q = q.recently_joined if @sort == 'recently_joined'
q.paginate(page: params[:page])
end
end

View File

@@ -31,9 +31,11 @@ class NotificationsController < ApplicationController
@sender_notification.read = true
@sender_notification.save
@recipient = @sender_notification.sender
@subject = @sender_notification.subject =~ /^Re: / ?
@sender_notification.subject :
"Re: " + @sender_notification.subject
@subject = if @sender_notification.subject.start_with? 'Re: '
@sender_notification.subject
else
"Re: #{@sender_notification.subject}"
end
end
# DELETE /notifications/1

View File

@@ -29,15 +29,15 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
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
if action.member_created?
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)
else
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?
end
end

View File

@@ -3,51 +3,41 @@ class PhotosController < ApplicationController
after_action :expire_homepage, only: [:create, :delete]
load_and_authorize_resource
respond_to :html, :json
responders :flash
# GET /photos
# GET /photos.json
def index
@photos = Photo.paginate(page: params[:page])
respond_with(@photos)
end
# GET /photos/new
# GET /photos/new.json
def new
@type = params[:type]
@id = params[:id]
@photo = Photo.new
retrieve_from_flickr
respond_with(@photo)
respond_with @photo
end
# GET /photos/1/edit
def edit
respond_with @photo
end
# POST /photos
# POST /photos.json
def create
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)
@photo.save if @photo.present?
respond_with @photo
end
# PUT /photos/1
# PUT /photos/1.json
def update
flash[:notice] = 'Photo was successfully updated.' if @photo.update(photo_params)
respond_with(@photo)
@photo.update(photo_params)
respond_with @photo
end
# DELETE /photos/1
# DELETE /photos/1.json
def destroy
@photo.destroy
flash[:alert] = "Photo successfully deleted."
respond_with(@photo)
respond_with @photo
end
private

View File

@@ -1,5 +1,6 @@
class PlacesController < ApplicationController
skip_authorize_resource
respond_to :html, :json
def index
respond_to do |format|
@@ -30,17 +31,9 @@ class PlacesController < ApplicationController
def search
if params[:new_place].empty?
respond_to do |format|
format.html do
redirect_to places_path, alert: 'Please enter a valid location'
end
end
redirect_to places_path, alert: 'Please enter a valid location'
else
respond_to do |format|
format.html do
redirect_to place_path(params[:new_place])
end
end
redirect_to place_path(params[:new_place])
end
end
end

View File

@@ -1,70 +1,37 @@
class PlantPartsController < ApplicationController
load_and_authorize_resource
respond_to :html, :json
responders :flash
# GET /plant_parts
# GET /plant_parts.json
def index
@plant_parts = PlantPart.all
respond_with(@plant_parts)
end
# GET /plant_parts/1
# GET /plant_parts/1.json
def show
respond_with(@plant_part)
end
# GET /plant_parts/new
# GET /plant_parts/new.json
def new
@plant_part = PlantPart.new
respond_with(@plant_part)
end
# GET /plant_parts/1/edit
def edit
end
def edit; end
# POST /plant_parts
# POST /plant_parts.json
def create
@plant_part = PlantPart.new(plant_part_params)
respond_to do |format|
if @plant_part.save
format.html { redirect_to @plant_part, notice: 'Plant part was successfully created.' }
format.json { render json: @plant_part, status: :created, location: @plant_part }
else
format.html { render action: "new" }
format.json { render json: @plant_part.errors, status: :unprocessable_entity }
end
end
@plant_part = PlantPart.create(plant_part_params)
respond_with(@plant_part)
end
# PUT /plant_parts/1
# PUT /plant_parts/1.json
def update
respond_to do |format|
if @plant_part.update(plant_part_params)
format.html { redirect_to @plant_part, notice: 'Plant part was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @plant_part.errors, status: :unprocessable_entity }
end
end
@plant_part.update(plant_part_params)
respond_with(@plant_part)
end
# DELETE /plant_parts/1
# DELETE /plant_parts/1.json
def destroy
@plant_part.destroy
respond_to do |format|
format.html { redirect_to plant_parts_url }
format.json { head :no_content }
end
respond_with(@plant_part)
end
private

View File

@@ -1,126 +1,81 @@
class PlantingsController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
after_action :expire_homepage, only: [:create, :update, :destroy]
load_and_authorize_resource
# GET /plantings
# GET /plantings.json
respond_to :html, :json
respond_to :csv, :rss, only: [:index]
responders :flash
def index
@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.csv do
specifics = (@owner ? "#{@owner.login_name}-" : @crop ? "#{@crop.name}-" : nil)
@filename = "Growstuff-#{specifics}Plantings-#{Time.zone.now.to_s(:number)}.csv"
render csv: @plantings
end
end
specifics = if @owner
"#{@owner.login_name}-"
elsif @crop
"#{@crop.name}-"
end
@filename = "Growstuff-#{specifics}Plantings-#{Time.zone.now.to_s(:number)}.csv"
respond_with(@plantings)
end
# GET /plantings/1
# GET /plantings/1.json
def show
@planting = Planting.includes(:owner, :crop, :garden, :photos).friendly.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @planting }
end
@planting = Planting.includes(:owner, :crop, :garden, :photos)
.friendly
.find(params[:id])
respond_with @planting
end
# GET /plantings/new
# GET /plantings/new.json
def new
@planting = Planting.new('planted_at' => Time.zone.today)
@planting = Planting.new(planted_at: Time.zone.today)
# using find_by_id here because it returns nil, unlike find
@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
format.json { render json: @planting }
end
respond_with @planting
end
# GET /plantings/1/edit
def edit
# the following are needed to display the form but aren't used
@crop = Crop.new
@garden = Garden.new
end
# POST /plantings
# POST /plantings.json
def create
params[:planted_at] = parse_date(params[:planted_at])
@planting = Planting.new(planting_params)
@planting.owner = current_member
respond_to do |format|
if @planting.save
@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")
else
format.html { render action: "new" }
format.json { render json: @planting.errors, status: :unprocessable_entity }
end
end
@planting.calc_and_set_days_before_maturity
@planting.save
respond_with @planting
end
# PUT /plantings/1
# PUT /plantings/1.json
def update
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]))
format.html { redirect_to @planting, notice: 'Planting was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @planting.errors, status: :unprocessable_entity }
end
end
@planting.calc_and_set_days_before_maturity
@planting.update(planting_params)
respond_with @planting
end
# DELETE /plantings/1
# DELETE /plantings/1.json
def destroy
@garden = @planting.garden
@planting.destroy
expire_fragment("homepage_stats")
respond_to do |format|
format.html { redirect_to @garden }
format.json { head :no_content }
end
respond_with @planting, location: @planting.garden
end
private
def planting_params
params.require(:planting).permit(:crop_id, :description, :garden_id, :planted_at,
:quantity, :sunniness, :planted_from, :owner_id, :finished,
:finished_at)
end
def update_days_before_maturity(planting, crop_id)
if planting.finished_at.nil?
planting.calculate_days_before_maturity(planting, crop_id)
else
(planting.finished_at - planting.planted_at).to_i
end
params[:planted_at] = parse_date(params[:planted_at]) if params[:planted_at]
params.require(:planting).permit(
:crop_id, :description, :garden_id, :planted_at,
:quantity, :sunniness, :planted_from, :finished,
:finished_at
)
end
def plantings
@@ -132,6 +87,6 @@ class PlantingsController < ApplicationController
Planting
end
p = p.current unless @show_all
p.includes(:owner, :crop, :garden).order(:created_at).paginate(page: params[:page])
p.joins(:owner, :crop, :garden).order(:created_at).paginate(page: params[:page])
end
end

View File

@@ -30,8 +30,7 @@ class PostsController < ApplicationController
end
# GET /posts/1/edit
def edit
end
def edit; end
# POST /posts
# POST /posts.json

View File

@@ -1,67 +1,40 @@
class ProductsController < ApplicationController
before_action :authenticate_member!
load_and_authorize_resource
respond_to :html
responders :flash
# GET /products
def index
@products = Product.all
respond_to do |format|
format.html # index.html.erb
end
respond_with @products
end
# GET /products/1
def show
respond_to do |format|
format.html # show.html.erb
end
respond_with @product
end
# GET /products/new
def new
@product = Product.new
respond_to do |format|
format.html # new.html.erb
end
respond_with @product
end
# GET /products/1/edit
def edit
respond_with @product
end
# POST /products
def create
@product = Product.new(product_params)
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Product was successfully created.' }
else
format.html { render action: "new" }
end
end
@product = Product.create(product_params)
respond_with @product
end
# PUT /products/1
def update
respond_to do |format|
if @product.update(product_params)
format.html { redirect_to @product, notice: 'Product was successfully updated.' }
else
format.html { render action: "edit" }
end
end
@product.update(product_params)
respond_with @product
end
# DELETE /products/1
def destroy
@product.destroy
respond_to do |format|
format.html { redirect_to products_url }
end
respond_with @product
end
private

View File

@@ -35,6 +35,14 @@ class RegistrationsController < Devise::RegistrationsController
render "edit"
end
end
def destroy
if @member.destroy_with_password(params.require(:member)[:current_password])
redirect_to root_path
else
render "edit"
end
end
end
# check if we need the current password to update fields

View File

@@ -1,67 +1,40 @@
class RolesController < ApplicationController
before_action :authenticate_member!
load_and_authorize_resource
respond_to :html
responders :flash
# GET /roles
def index
@roles = Role.all
respond_to do |format|
format.html # index.html.erb
end
respond_with @roles
end
# GET /roles/1
def show
respond_to do |format|
format.html # show.html.erb
end
respond_with @role
end
# GET /roles/new
def new
@role = Role.new
respond_to do |format|
format.html # new.html.erb
end
respond_with @role
end
# GET /roles/1/edit
def edit
respond_with @role
end
# POST /roles
def create
@role = Role.new(role_params)
respond_to do |format|
if @role.save
format.html { redirect_to @role, notice: 'Role was successfully created.' }
else
format.html { render action: "new" }
end
end
@role = Role.create(role_params)
respond_with @role
end
# PUT /roles/1
def update
respond_to do |format|
if @role.update(role_params)
format.html { redirect_to @role, notice: 'Role was successfully updated.' }
else
format.html { render action: "edit" }
end
end
@role.update(role_params)
respond_with @role
end
# DELETE /roles/1
def destroy
@role.destroy
respond_to do |format|
format.html { redirect_to roles_url }
end
respond_with @role
end
private

View File

@@ -2,6 +2,7 @@ class ScientificNamesController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
responders :flash
# GET /scientific_names
# GET /scientific_names.json
@@ -25,8 +26,7 @@ class ScientificNamesController < ApplicationController
end
# GET /scientific_names/1/edit
def edit
end
def edit; end
# POST /scientific_names
# POST /scientific_names.json
@@ -34,14 +34,14 @@ class ScientificNamesController < ApplicationController
@scientific_name = ScientificName.new(scientific_name_params)
@scientific_name.creator = current_member
flash[:notice] = 'Scientific name was successfully created.' if @scientific_name.save
@scientific_name.save
respond_with(@scientific_name.crop)
end
# PUT /scientific_names/1
# PUT /scientific_names/1.json
def update
flash[:notice] = 'Scientific name was successfully updated.' if @scientific_name.update(scientific_name_params)
@scientific_name.update(scientific_name_params)
respond_with(@scientific_name.crop)
end

View File

@@ -33,8 +33,7 @@ class SeedsController < ApplicationController
end
# GET /seeds/1/edit
def edit
end
def edit; end
# POST /seeds
# POST /seeds.json

View File

@@ -1,4 +1,5 @@
class ShopController < ApplicationController
respond_to :html
def index
@products = Product.all
@order_item = OrderItem.new
@@ -11,15 +12,8 @@ class ShopController < ApplicationController
@order = nil
@most_recent_item = nil
if current_member
@order = current_member.current_order
if @order
@most_recent_item = @order.order_items.first
end
end
respond_to do |format|
format.html # index.html.haml
end
return unless current_member
@order = current_member.current_order
@most_recent_item = @order.order_items.first if @order
end
end

View File

@@ -55,6 +55,7 @@ module ApplicationHelper
# Falls back to Gravatar
#
def avatar_uri(member, size = 150)
return unless member
if member.preferred_avatar_uri.present?
# Some avatars support different sizes
# http://graph.facebook.com/12345678/picture?width=150&height=150

View File

@@ -6,6 +6,7 @@ module PhotoCapable
has_and_belongs_to_many :photos # rubocop:disable Rails/HasAndBelongsToMany
before_destroy :remove_from_list
scope :has_photos, -> { includes(:photos).where.not(photos: { id: nil }) }
end
def remove_from_list

View File

@@ -12,7 +12,7 @@ class Crop < ActiveRecord::Base
has_many :photos, through: :plantings
has_many :seeds
has_many :harvests
has_many :plant_parts, -> { uniq }, through: :harvests
has_many :plant_parts, -> { uniq.reorder("plant_parts.name") }, through: :harvests
belongs_to :creator, class_name: 'Member'
belongs_to :requester, class_name: 'Member'
@@ -39,7 +39,7 @@ class Crop < ActiveRecord::Base
scope :approved, -> { where(approval_status: "approved") }
scope :rejected, -> { where(approval_status: "rejected") }
scope :interesting, -> { approved.has_photos }
scope :interesting, -> { approved.has_photos.randomized }
scope :has_photos, -> { includes(:photos).where.not(photos: { id: nil }) }
## Wikipedia urls are only necessary when approving a crop

View File

@@ -5,7 +5,7 @@ class Garden < ActiveRecord::Base
friendly_id :garden_slug, use: [:slugged, :finders]
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id', counter_cache: true
has_many :plantings, -> { order(created_at: :desc) }, dependent: :destroy
has_many :plantings, dependent: :destroy
has_many :crops, through: :plantings
# set up geocoding
@@ -14,7 +14,7 @@ class Garden < ActiveRecord::Base
after_validation :empty_unwanted_geocodes
after_save :mark_inactive_garden_plantings_as_finished
default_scope { order("lower(name) asc") }
default_scope { joins(:owner).order("lower(name) asc") }
scope :active, -> { where(active: true) }
scope :inactive, -> { where(active: false) }

View File

@@ -9,8 +9,7 @@ class Harvest < ActiveRecord::Base
belongs_to :plant_part
belongs_to :planting
default_scope { order('created_at DESC') }
default_scope { joins(:owner).order(created_at: :desc) }
validates :crop, approved: true
validates :crop, presence: { message: "must be present and exist in our database" }

View File

@@ -1,4 +1,6 @@
class Member < ActiveRecord::Base
acts_as_paranoid # implements soft deletion
before_destroy :newsletter_unsubscribe
include Geocodable
extend FriendlyId
@@ -7,7 +9,6 @@ class Member < ActiveRecord::Base
has_many :posts, foreign_key: 'author_id'
has_many :comments, foreign_key: 'author_id'
has_many :forums, foreign_key: 'owner_id'
has_many :gardens, foreign_key: 'owner_id'
has_many :plantings, foreign_key: 'owner_id'
@@ -27,21 +28,17 @@ class Member < ActiveRecord::Base
has_many :photos
has_many :requested_crops, class_name: Crop, foreign_key: 'requester_id'
has_many :likes, dependent: :destroy
default_scope { order("lower(login_name) asc") }
scope :confirmed, -> { where('confirmed_at IS NOT NULL') }
scope :located, -> { where("location <> '' and latitude IS NOT NULL and longitude IS NOT NULL") }
scope :recently_signed_in, -> { reorder('updated_at DESC') }
scope :recently_joined, -> { reorder("confirmed_at desc") }
scope :wants_newsletter, -> { where(newsletter: true) }
scope :interesting, lambda {
confirmed
.located
.recently_signed_in
.has_plantings
}
scope :confirmed, -> { where.not(confirmed_at: nil) }
scope :located, -> { where.not(location: '').where.not(latitude: nil).where.not(longitude: nil) }
scope :recently_signed_in, -> { reorder(updated_at: :desc) }
scope :recently_joined, -> { reorder(confirmed_at: :desc) }
scope :wants_newsletter, -> { where(newsletter: true) }
scope :interesting, -> { confirmed.located.recently_signed_in.has_plantings }
scope :has_plantings, -> { joins(:plantings).group("members.id") }

View File

@@ -1,5 +1,5 @@
class Order < ActiveRecord::Base
belongs_to :member
belongs_to :member, with_deleted: true
has_many :order_items, dependent: :destroy
@@ -64,7 +64,7 @@ class Order < ActiveRecord::Base
if args[:for]
case args[:by]
when "member"
member = Member.find_by(login_name: args[:for])
member = Member.with_deleted.find_by(login_name: args[:for])
return member.orders if member
when "order_id"
order = Order.find_by(id: args[:for])

View File

@@ -8,7 +8,7 @@ class Photo < ActiveRecord::Base
before_destroy { all_associations.clear }
default_scope { order("created_at desc") }
default_scope { joins(:owner).order(created_at: :desc) }
def associations?
plantings.any? || harvests.any? || gardens.any? || seeds.any?

View File

@@ -6,19 +6,18 @@ class Planting < ActiveRecord::Base
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_many :harvests, dependent: :destroy
default_scope { order("plantings.created_at desc") }
default_scope { joins(:owner).order(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")
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,
@@ -27,9 +26,9 @@ class Planting < ActiveRecord::Base
to: :crop,
prefix: true
validates :crop, approved: true
validates :crop, presence: { message: "must be present and exist in our database" }
validates :garden, presence: true
validates :crop, presence: true
validates :crop, approved: { message: "must be present and exist in our database" }
validates :quantity,
numericality: {
@@ -64,6 +63,11 @@ class Planting < ActiveRecord::Base
validate :finished_must_be_after_planted
delegate :days_until_finished, to: :predict
delegate :days_until_mature, to: :predict
delegate :percentage_grown, to: :predict
delegate :start_to_finish_diff, to: :predict
# check that any finished_at date occurs after planted_at
def finished_must_be_after_planted
return unless planted_at && finished_at # only check if we have both
@@ -92,49 +96,17 @@ class Planting < ActiveRecord::Base
photos.first
end
def calculate_days_before_maturity(planting, crop)
p_crop = Planting.where(crop_id: crop).where.not(id: planting)
differences = p_crop.collect do |p|
if p.finished && !p.finished_at.nil?
(p.finished_at - p.planted_at).to_i
end
end
if differences.compact.empty?
nil
else
differences.compact.sum / differences.compact.size
end
def planted?
planted_at.present? && planted_at <= Date.current
end
def planted?(current_date = Date.current)
planted_at.present? && current_date.to_date >= planted_at
def calc_and_set_days_before_maturity
self.days_before_maturity = predict.predict_days_before_maturity
end
def days_until_finished
return 0 if finished?
days = (finished_at - Date.current).to_i
days.positive? ? days : 0
end
private
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)
days = (current_date.to_date - planted_at.to_date).to_i
return 0 if current_date < planted_at
return 100 if days > days_before_maturity
percent = (days / days_before_maturity * 100).to_i
if percent >= 100
percent = 100
end
percent
def predict
PlantingPredictions.new(self)
end
end

View File

@@ -36,7 +36,7 @@ class Post < ActiveRecord::Base
end
end
default_scope { order("created_at desc") }
default_scope { joins(:author).order(created_at: :desc) }
validates :subject,
presence: true,

View File

@@ -8,6 +8,7 @@ class Product < ActiveRecord::Base
greater_than_or_equal_to: 0
},
allow_nil: true
validates :min_price, presence: true
def to_s
name

View File

@@ -6,9 +6,11 @@ class Seed < ActiveRecord::Base
belongs_to :crop
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id', counter_cache: true
default_scope { order("created_at desc") }
default_scope { joins(:owner).order(created_at: :desc) }
validates :crop, approved: true
delegate :name, to: :crop
delegate :default_photo, to: :crop
validates :crop, presence: { message: "must be present and exist in our database" }
validates :quantity,
@@ -30,8 +32,9 @@ class Seed < ActiveRecord::Base
},
allow_nil: true
scope :tradable, -> { where("tradable_to != 'nowhere'") }
scope :tradable, -> { where.not(tradable_to: 'nowhere') }
scope :interesting, -> { tradable.has_location }
scope :has_location, -> { joins(:owner).where.not("members.location": nil) }
TRADABLE_TO_VALUES = %w(nowhere locally nationally internationally).freeze
validates :tradable_to, inclusion: { in: TRADABLE_TO_VALUES,
message: "You may only trade seed nowhere, "\
@@ -77,27 +80,6 @@ class Seed < ActiveRecord::Base
end
end
def interesting?
# 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
true
end
# Seed.interesting
# returns a list of interesting seeds, for use on the homepage etc
def self.interesting
howmany = 12 # max number to find
interesting_seeds = []
Seed.tradable.each do |s|
break if interesting_seeds.size == howmany
interesting_seeds.push(s) if s.interesting?
end
interesting_seeds
end
def seed_slug
"#{owner.login_name}-#{crop}".downcase.tr(' ', '-')
end

View File

@@ -0,0 +1,58 @@
class PlantingPredictions
def initialize(planting)
@planting = planting
end
def days_until_finished
return 0 if @planting.finished?
days = (@planting.finished_at - Date.current).to_i
days.positive? ? days : 0
end
def days_until_mature
days = ((@planting.planted_at + @planting.days_before_maturity) - Date.current).to_i
days.positive? ? days : 0
end
def percentage_grown
return nil unless @planting.days_before_maturity && @planting.planted?
days = (Date.current - @planting.planted_at.to_date).to_f
return 0 if Date.current < @planting.planted_at
return 100 if days > @planting.days_before_maturity
percent = (days / @planting.days_before_maturity * 100).to_i
percent = 100 if percent >= 100
percent
end
def start_to_finish_diff
(@planting.finished_at - @planting.planted_at).to_i if @planting.finished_at && @planting.planted_at
end
def predict_days_before_maturity
# calculate the number of days, from planted_at, until maturity
if @planting.planted_at && @planting.finished_at
start_to_finish_diff
elsif @planting.crop_id
plantings = other_finished_plantings_same_crop
PlantingPredictions.mean_days_until_maturity(plantings)
end
end
def self.mean_days_until_maturity(plantings)
## Given a set of finished plantings, calculate the average/mean time from start to finish
differences = plantings.collect(&:start_to_finish_diff)
differences.compact.sum / differences.compact.size unless differences.compact.empty?
end
private
def other_finished_plantings_same_crop
Planting.where(crop_id: @planting.crop_id)
.where.not(id: @planting.id)
.where.not(finished_at: nil)
end
end

View File

@@ -5,6 +5,7 @@
%ul#admin_links
%li= link_to "Account types", account_types_path
%li= link_to "Alternate names", alternate_names_path
%li= link_to "Scientific names", scientific_names_path
%li= link_to "Products", products_path
%li= link_to "Roles", roles_path
%li= link_to "Forums", forums_path

View File

@@ -18,7 +18,9 @@
- @orders.each do |order|
%tr
%td= link_to order.member.login_name, order.member
%td
= link_to order.member.login_name, order.member
= "(deleted)" if order.member.deleted_at
%td= order.id
%td
- if order.completed_at

View File

@@ -6,7 +6,10 @@
.col-md-11
.comment-meta
Posted by
= link_to comment.author.login_name, member_path(comment.author)
- if comment.author
= link_to comment.author.login_name, member_path(comment.author)
- else
Member Deleted
on
= comment.created_at
- if comment.updated_at > comment.created_at

View File

@@ -4,8 +4,8 @@
- if can? :wrangle, Crop
= link_to 'Wrangle Crops', wrangle_crops_path, class: 'btn btn-primary'
- if @has_requested_pending
= link_to(I18n.t('crops.requested.link', number_crops: @has_requested_pending), requested_crops_path)
- if @num_requested_crops && @num_requested_crops.positive?
= link_to(I18n.t('crops.requested.link', number_crops: @num_requested_crops), requested_crops_path)
%p
#{ENV['GROWSTUFF_SITE_NAME']} tracks who's growing what, where.
@@ -23,10 +23,10 @@
= submit_tag "Show", class: 'btn btn-primary'
.pagination
= will_paginate @paginated_crops
= will_paginate @crops
.row
- @paginated_crops.each do |crop|
- @crops.each do |crop|
.col-md-2.six-across
= render partial: "thumbnail", locals: { crop: crop }
@@ -35,7 +35,7 @@
= link_to 'New Crop', new_crop_path, class: 'btn btn-primary'
.pagination
= will_paginate @paginated_crops
= will_paginate @crops
%ul.list-inline

View File

@@ -7,5 +7,5 @@
%item
%title= crop.name
%pubdate= crop.created_at.to_s(:rfc822)
%link= post_url(crop)
%guid= post_url(crop)
%link= crop_url(crop)
%guid= crop_url(crop)

View File

@@ -0,0 +1,12 @@
= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :delete, class: 'form-horizontal' }) do |f|
%br/
= devise_error_messages!
.form-group
= f.label :current_password, "Password required to delete", class: 'control-label col-md-2'
.col-md-4
= f.password_field :current_password, class: 'form-control', id: 'current_pw_for_delete'
.form-group
.form-actions.col-md-offset-2.col-md-8
= f.submit "Delete", class: 'btn btn-primary'

View File

@@ -13,6 +13,9 @@
%li
%a{ href: '#password', role: 'tab', 'data-toggle': 'tab' }
Password
%li
%a{ href: '#delete', role: 'tab', 'data-toggle': 'tab' }
Delete Account
.tab-content
.tab-pane.active#profile
@@ -23,3 +26,5 @@
= render partial: 'edit_apps'
.tab-pane#password
= render partial: 'edit_password'
.tab-pane#delete
= render partial: 'delete'

View File

@@ -0,0 +1,23 @@
- if can?(:edit, garden) || can?(:delete, garden)
- if can? :edit, garden
- if garden.active
= link_to new_planting_path(garden_id: garden.id), class: 'btn btn-primary' do
%span.glyphicon.glyphicon-grain{ title: "Plant" }
Plant something
= link_to "Mark as inactive", garden_path(garden, garden: { active: 0 }),
method: :put, class: 'btn btn-default',
data: { confirm: 'All plantings associated with this garden will be marked as finished. Are you sure?' }
- else
= link_to "Mark as active", garden_path(garden, garden: { active: 1 }),
method: :put,
class: 'btn btn-default'
= link_to edit_garden_path(garden), class: 'btn btn-default', id: 'edit_garden_link' do
%span.glyphicon.glyphicon-pencil{ title: "Edit garden" }
Edit
- if can?(:destroy, garden)
= link_to garden,
method: :delete,
data: { confirm: 'All plantings associated with this garden will also be deleted. Are you sure?' },
class: 'btn btn-default', id: 'delete_garden_link' do
%span.glyphicon.glyphicon-trash{ title: "Delete" }
Delete

View File

@@ -0,0 +1,25 @@
.panel.panel-success
.panel-heading
%h3.panel-title
= link_to garden.name, garden_path(garden)
.panel-body
.row
.col-md-2.col-xs-12.garden-info
.row
.col-md-12.col-xs-6
= render 'gardens/photo', garden: garden
.col-md-12.col-xs-6
= render 'gardens/actions', garden: garden
.col-md-10
.row
- if garden.plantings.current.size.positive?
- garden.plantings.current.includes(:crop).each do |planting|
.col-md-2.col-sm-6.col-xs-6
.hover-wrapper
.text= render 'plantings/actions', planting: planting
= render partial: "plantings/thumbnail", locals: { planting: planting }
- else
no plantings
-# .panel-footer

View File

@@ -0,0 +1,3 @@
= link_to image_tag((garden.default_photo ? garden.default_photo.thumbnail_url : 'placeholder_150.png'),
alt: garden.name, class: 'img-responsive'),
garden_path(garden)

View File

@@ -6,15 +6,13 @@
= page_entries_info @gardens
= will_paginate @gardens
.row
- if @gardens.empty?
%p There are no gardens to display.
- else
- @gardens.each do |garden|
.col-md-6
= render partial: 'gardens/thumbnail', locals: { garden: garden }
- if @gardens.empty?
%p There are no gardens to display.
- else
- @gardens.each do |garden|
= render 'overview', garden: garden
.pagination
= page_entries_info @gardens
= will_paginate @gardens

View File

@@ -11,24 +11,7 @@
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
.row
.col-md-9
- if can?(:edit, @garden) || can?(:delete, @garden)
%p.btn-group
- if can? :edit, @garden
- if @garden.active
= link_to "Plant something", new_planting_path(garden_id: @garden.id), class: 'btn btn-primary'
= link_to "Mark as inactive", garden_path(@garden, garden: { active: 0 }),
method: :put, class: 'btn btn-default',
data: { confirm: 'All plantings associated with this garden will be marked as finished. Are you sure?' }
- else
= link_to "Mark as active", garden_path(@garden, garden: { active: 1 }),
method: :put,
class: 'btn btn-default'
= link_to 'Edit garden', edit_garden_path(@garden), class: 'btn btn-default'
- if can?(:destroy, @garden)
= link_to 'Delete garden', @garden,
method: :delete,
data: { confirm: 'All plantings associated with this garden will also be deleted. Are you sure?' },
class: 'btn btn-default'
%p.btn-group= render 'gardens/actions', garden: @garden
- unless @garden.active
.alert.alert-warning
@@ -49,35 +32,23 @@
Why not
= link_to 'tell us more.', edit_garden_path(@garden)
- if !@garden.photos.empty? || (can?(:edit, @garden) && can?(:create, Photo))
.row-fluid
%h3 Photos
%p= localize_plural(@garden.photos, Photo)
.row-fluid
%ul.thumbnails
- @garden.photos.includes(:owner).each do |p|
.col-md-2.six-across
= render partial: 'photos/thumbnail', locals: { photo: p }
.row-fluid
- if can?(:create, Photo) && can?(:edit, @garden)
%p
= link_to "Add photo", new_photo_path(type: "garden", id: @garden.id), class: 'btn btn-primary'
.row-fluid
%h3 What's planted here?
- if @garden.plantings.current.empty?
%p Nothing is currently planted here.
%h3 What's planted here?
.row
- if @current_plantings.size.positive?
- @current_plantings.each do |planting|
.col-xs-12.col-md-6
= render partial: "plantings/card", locals: { planting: planting }
- else
.col-md-12
%p Nothing is currently planted here.
%h3 Previously planted in this garden
.row
- if @finished_plantings.size.positive?
- @finished_plantings.each do |planting|
.col-xs-6.col-md-2
= render partial: "plantings/thumbnail", locals: { planting: planting }
- else
- @garden.plantings.current.includes(:crop, :owner, :harvests, :garden).each.with_index do |planting_current, _|
= render partial: "plantings/thumbnail", locals: { planting: planting_current }
.row-fluid
%h3 Previously planted in this garden
- if @garden.plantings.finished.empty?
%p Nothing has been planted here.
- else
- @garden.plantings.finished.each.with_index do |planting_finished|
= render partial: "plantings/thumbnail", locals: { planting: planting_finished }
.col-md-3
%h4 About this garden
%p
@@ -107,9 +78,24 @@
- @garden.owner.gardens.inactive.each do |othergarden|
%li
- if @garden == othergarden
= @garden
= @garden.name
- else
= link_to othergarden, garden_path(othergarden)
- if @garden.owner == current_member
= link_to 'Add New Garden', new_garden_path, class: 'btn btn-default btn-xs'
%p
= link_to new_garden_path, class: 'btn btn-default btn-xs' do
Add New Garden
- if can?(:edit, @garden) && can?(:create, Photo)
%p
= link_to new_photo_path(type: "garden", id: @garden.id),
class: 'btn btn-primary' do
%span.glyphicon.glyphicon-camera{ title: "Add Photo" }
Add Photo
- if @garden.photos.size.positive?
%h3= localize_plural(@garden.photos, Photo)
.row
- @garden.photos.includes(:owner).each do |photo|
.col-xs-6
= render partial: 'photos/thumbnail', locals: { photo: photo }

View File

@@ -10,7 +10,7 @@
.col-md-4
= link_to image_tag((harvest.default_photo ? harvest.default_photo.thumbnail_url : 'placeholder_150.png'),
alt: harvest.crop.name, class: 'img'),
harvest.crop
harvest
.col-md-8
%dl.dl-horizontal
%dt Crop :

View File

@@ -1,28 +1,21 @@
- seeds = Seed.interesting.first(6)
- if seeds.present?
- cache cache_key_for(Seed, 'interesting'), expires_in: 1.day do
%h2= t('.title')
- cache cache_key_for(Seed) do
%table.table.table-striped
%tr
%th= t('.owner')
%th= t('.crop')
%th.hidden-xs.hidden-sm= t('.description')
%th= t('.trade_to')
%th= t('.from')
%th
- seeds.each do |seed|
%tr
%td= link_to seed.owner.login_name, seed.owner
%td= link_to seed.crop.name, seed.crop
%td.hidden-xs.hidden-sm= truncate(seed.description, length: 40, separator: ' ')
%td= seed.tradable? ? seed.tradable_to : ''
%td
- if seed.tradable? && seed.owner.location.blank?
= t('.unspecified')
- elsif seed.tradable?
= truncate(seed.owner.location, length: 25, separator: ', ')
%td= link_to t('.details'), seed, class: 'btn btn-default btn-xs'
%p.text-right
= link_to "#{t('.view_all')} »", seeds_path
.row
.col-md-8
- Seed.includes(:owner, crop: :photos).interesting.first(6).each do |seed|
.col-md-3
.thumbnail
- cache cache_key_for(Crop, seed.id) do
= link_to image_tag((seed.default_photo ? seed.default_photo.thumbnail_url : 'placeholder_150.png'),
alt: seed.crop.name, class: 'img'),
seed
.seedinfo
= link_to seed.crop.name, seed
.trade-to
%p= seed.owner.location
%p
Will trade to:
%br/
#{seed.tradable_to}
%p.text-right
= link_to "#{t('.view_all')} »", seeds_path

View File

@@ -1,4 +1,5 @@
= link_to image_tag(avatar_uri(member, 150),
alt: '',
class: 'img img-responsive avatar'),
member_path(member)
- if member
= link_to image_tag(avatar_uri(member, 150),
alt: '',
class: 'img img-responsive avatar'),
member_path(member)

View File

@@ -49,7 +49,7 @@
- unless g.featured_plantings.empty?
- g.featured_plantings.each.with_index do |planting|
.col-xs-12.col-lg-6
= render partial: "plantings/thumbnail", locals: { planting: planting }
= render partial: "plantings/card", locals: { planting: planting }
%p
= link_to "More about this garden...", url_for(g)

View File

@@ -15,10 +15,13 @@
- if can? :read, n
%tr
%td
- if n.read
= link_to n.sender, member_path(n.sender)
- if n.sender.present?
- if n.read
= link_to n.sender, member_path(n.sender)
- else
%strong= link_to n.sender, member_path(n.sender)
- else
%strong= link_to n.sender, member_path(n.sender)
*deleted member*
%td
- if n.read
= link_to n.subject, notification_path(n)

View File

@@ -44,11 +44,9 @@
.row
- plantings.first(10).each.with_index do |planting, index|
.col-xs-12.col-lg-6
= render partial: "plantings/thumbnail", locals: { planting: planting, index: index }
.row
= link_to "View all plantings >>", plantings_path
= render partial: "plantings/card", locals: { planting: planting, index: index }
= link_to "View all plantings >>", plantings_path
- else
.row
%p No nearby plantings found
%p No nearby plantings found
- else
%p No results found

View File

@@ -0,0 +1,16 @@
- if can?(:edit, planting) || can?(:destroy, planting)
- if can? :edit, planting
= link_to edit_planting_path(planting), class: 'btn btn-default btn-xs' do
%span.glyphicon.glyphicon-pencil{ title: "Edit garden" }
Edit
- if can? :destroy, planting
= link_to planting, method: :delete,
data: { confirm: 'Are you sure?' },
class: 'btn btn-default btn-xs' do
%span.glyphicon.glyphicon-trash{ title: "Delete" }
Delete
- unless planting.finished
= link_to "Mark as finished", planting_path(planting, planting: { finished: 1 }),
method: :put, class: 'btn btn-default btn-xs append-date'
- if can? :create, Harvest
= link_to 'Harvest', new_planting_harvest_path(planting), class: 'btn btn-default btn-xs'

View File

@@ -0,0 +1,60 @@
.panel.panel-success.planting-thumbnail
.panel-heading
%h3.panel-title
= link_to planting.crop.name, planting_path(planting)
- if can? :edit, planting
%a.pull-right{ href: edit_planting_path(planting), role: "button", id: "edit_garden_glyphicon" }
%span.glyphicon.glyphicon-pencil{ title: "Edit" }
.panel-body
.row
.col-xs-12.col-md-5
= link_to image_tag((planting.default_photo ? planting.default_photo.thumbnail_url : 'placeholder_150.png'),
alt: planting.crop_id, class: 'img img-responsive'),
planting
.col-xs-12.col-md-7
%dl.dl-horizontal.planting-attributes
%dt Owner:
%dd= link_to planting.owner.login_name, planting.owner
%dt Garden:
%dd= link_to planting.garden&.name, planting.garden
%dt Planted on:
%dd= planting.planted_at
- if planting.quantity
%dt Quantity:
%dd= display_planting_quantity(planting)
- if planting.finished?
%dt Finished on:
%dd= display_finished(planting)
%dt Sun/shade?:
%dd
- sunniness = planting.sunniness.blank? ? "not specified" : planting.sunniness
= image_tag("sunniness_#{sunniness}.png", size: "25x25", alt: sunniness, title: sunniness)
= " (#{sunniness})"
%dt Planted from:
%dd= display_planted_from(planting)
%dt Mature in:
%dd
= display_days_before_maturity(planting)
days
%p= render 'plantings/progress', planting: planting, show_explanation: true
= link_to 'Details', planting_path(planting),
class: 'btn btn-default btn-xs'
- if can?(:edit, planting) && can?(:create, Harvest)
= link_to 'Harvest', new_planting_harvest_path(planting),
class: 'btn btn-default btn-xs'
- if can?(:edit, planting) && !planting.finished
= link_to "Mark as finished",
planting_path(planting, planting: { finished: 1 }),
method: :put,
class: 'btn btn-default btn-xs append-date'
- if can? :destroy, planting
= link_to planting, method: :delete,
data: { confirm: 'Are you sure?' },
class: 'btn btn-default btn-xs' do
%span.glyphicon.glyphicon-trash{ title: "Delete" }

View File

@@ -1,10 +0,0 @@
- if !planting.planted?
Progress: 0% - not planted yet
- elsif planting.finished?
Progress: 100%
= render partial: "plantings/progress_bar", locals: { status: "success", progress: "100%" }
- elsif planting.days_before_maturity.nil?
Progress: Not calculated, days before maturity unknown
- else
Progress: #{planting.percentage_grown}%
= render partial: "plantings/progress_bar", locals: { status: "success", progress: "#{planting.percentage_grown}%" }

View File

@@ -0,0 +1,19 @@
- if !planting.planted?
- if show_explanation == true
Progress: 0% - not planted yet
= render "plantings/progress_bar", status: "not planted", progress: 0
- elsif planting.finished?
- if show_explanation == true
Progress: 100%
= render "plantings/progress_bar", status: 'finished', progress: 100
- elsif planting.days_before_maturity.nil?
- if show_explanation == true
Progress: Not calculated, days before maturity unknown
= render "plantings/progress_bar", status: "unknown", progress: nil
- else
- if show_explanation == true
Progress: #{planting.percentage_grown}%
= render "plantings/progress_bar", status: 'growing', progress: planting.percentage_grown

View File

@@ -1,3 +1,11 @@
.progress
%div{ class: "progress-bar progress-bar-#{status}", role: "progressbar", style: "width: #{progress}" }
- if progress.nil?
= status
- else
-# haml-lint:disable InlineStyles
%div{ class: "progress-bar progress-bar-#{status}", role: "progressbar", style: "width: #{progress}%" }
- if progress >= 30
#{progress}%
- if progress < 30
#{progress}%
-# haml-lint:enable InlineStyles

View File

@@ -1,57 +1,10 @@
.panel.panel-success.planting-thumbnail
.panel-heading
%h3.panel-title= link_to planting.crop.name, planting.crop
.panel-body
.row
.col-xs-12.col-md-4
= link_to image_tag((planting.default_photo ? planting.default_photo.thumbnail_url : 'placeholder_150.png'),
alt: planting.crop_id, class: 'img'),
planting
.col-xs-7.col-md-5
%dl.dl-horizontal.planting-attributes
%dt Owner:
%dd= link_to planting.owner.login_name, planting.owner
%dt Garden:
%dd= link_to planting.garden.name, planting.garden
%dt Planted on:
%dd= planting.planted_at
%dt Quantity:
%dd= display_planting_quantity(planting)
%dt Finished on:
%dd= display_finished(planting)
%dt Sun/shade?:
%dd
- sunniness = planting.sunniness.blank? ? "not specified" : planting.sunniness
= image_tag("sunniness_#{sunniness}.png", size: "25x25", alt: sunniness, title: sunniness)
= " (#{sunniness})"
%dt Planted from:
%dd= display_planted_from(planting)
.col-xs-1.col-md-3
%ul{ style: "list-style-type:none; text-align:right" }
%li= link_to 'Details', planting, class: 'btn btn-default btn-xs'
- if can? :edit, planting
%li= link_to 'Edit', edit_planting_path(planting), class: 'btn btn-default btn-xs'
- if can? :create, Harvest
%li= link_to 'Harvest', new_planting_harvest_path(planting), class: 'btn btn-default btn-xs'
- unless planting.finished
%li
= link_to "Mark as finished",
planting_path(planting, planting: { finished: 1 }),
method: :put,
class: 'btn btn-default btn-xs append-date'
- if can? :destroy, planting
%li
= link_to 'Delete',
planting, method: :delete,
data: { confirm: 'Are you sure?' },
class: 'btn btn-default btn-xs'
.row
.col-xs-12.col-md-4
%dl
%dt Days until maturity:
%dd= display_days_before_maturity(planting)
.col-xs-12.col-md-8
= render partial: 'plantings/planting_progress', locals: { planting: planting }
.col-xs-12.col-md-8
= render partial: 'plantings/planting_harvest', locals: { planting: planting }
.thumbnail
.planting-thumbnail
- if planting
= link_to image_tag((planting.default_photo ? planting.default_photo.thumbnail_url : 'placeholder_150.png'),
alt: planting.crop.name, class: 'img'),
planting
.plantinginfo
.planting-name
= render 'plantings/progress', planting: planting, show_explanation: false
= link_to planting.crop.name, planting

View File

@@ -13,7 +13,7 @@
- unless @plantings.empty?
- @plantings.each.with_index do |planting|
.col-xs-12.col-lg-6
= render partial: "plantings/thumbnail", locals: { planting: planting }
= render partial: "plantings/card", locals: { planting: planting }
.pagination
= page_entries_info @plantings

View File

@@ -48,22 +48,10 @@
%dt Finished:
%dd= display_finished(@planting)
%p= render 'plantings/planting_harvest', planting: @planting
%p= render 'planting_progress', planting: @planting
%p= render 'plantings/harvests', planting: @planting
%p= render 'plantings/progress', planting: @planting, show_explanation: true
- if can?(:edit, @planting) || can?(:destroy, @planting)
%p
- if can? :edit, @planting
= link_to 'Edit', edit_planting_path(@planting), class: 'btn btn-default btn-xs'
- unless @planting.finished
= link_to "Mark as finished", planting_path(@planting, planting: { finished: 1 }),
method: :put, class: 'btn btn-default btn-xs append-date'
- if can? :create, Harvest
= link_to 'Harvest', new_planting_harvest_path(@planting), class: 'btn btn-default btn-xs'
- if can? :destroy, @planting
= link_to 'Delete', @planting, method: :delete,
data: { confirm: 'Are you sure?' },
class: 'btn btn-default btn-xs'
= render 'plantings/actions', planting: @planting
.col-md-6
= render partial: "crops/index_card", locals: { crop: @planting.crop }

View File

@@ -10,7 +10,10 @@
.post-meta
%p
Posted by
= link_to post.author.login_name, member_path(post.author)
- if post.author
= link_to post.author.login_name, member_path(post.author)
- else
Member Deleted
- if post.forum
in
= link_to post.forum, post.forum

View File

@@ -7,7 +7,7 @@
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
- unless current_member
- if @post.author && !current_member
.alert.alert-info
= link_to @post.author.login_name, member_path(@post.author)
is using

View File

@@ -4,7 +4,7 @@ class CounterCaches < ActiveRecord::Migration
add_column :members, :harvests_count, :integer
add_column :members, :seeds_count, :integer
Member.find_each do |member|
Member.unscoped.find_each do |member|
Member.reset_counters(member.id, :gardens)
Member.reset_counters(member.id, :harvests)
Member.reset_counters(member.id, :seeds)

View File

@@ -0,0 +1,6 @@
class AddDeletedToMembers < ActiveRecord::Migration
def change
add_column :members, :deleted_at, :datetime
add_index :members, :deleted_at
end
end

View File

@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20170413221549) do
ActiveRecord::Schema.define(version: 20170520060252) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -326,9 +326,11 @@ ActiveRecord::Schema.define(version: 20170413221549) do
t.integer "gardens_count"
t.integer "harvests_count"
t.integer "seeds_count"
t.datetime "deleted_at"
end
add_index "members", ["confirmation_token"], name: "index_members_on_confirmation_token", unique: true, using: :btree
add_index "members", ["deleted_at"], name: "index_members_on_deleted_at", using: :btree
add_index "members", ["email"], name: "index_members_on_email", unique: true, using: :btree
add_index "members", ["reset_password_token"], name: "index_members_on_reset_password_token", unique: true, using: :btree
add_index "members", ["slug"], name: "index_members_on_slug", unique: true, using: :btree

View File

@@ -1,56 +1,70 @@
require 'bluecloth'
module Haml::Filters
module Haml::Filters # rubocop:disable Style/ClassAndModuleChildren
module GrowstuffMarkdown
include Haml::Filters::Base
def render(text)
@expanded = text
expand_crops!
expand_members!
BlueCloth.new(@expanded).to_html
end
private
CROP_REGEX = /(?<!\\)\[([^\[\]]+?)\]\(crop\)/
MEMBER_REGEX = /(?<!\\)\[([^\[\]]+?)\]\(member\)/
MEMBER_AT_REGEX = /(?<!\\)(\@\w+)/
MEMBER_ESCAPE_AT_REGEX = /(?<!\\)\\(?=\@\w+)/
include Haml::Filters::Base
HOST = Growstuff::Application.config.host
def render(text)
def expand_crops!
# turn [tomato](crop) into [tomato](http://growstuff.org/crops/tomato)
expanded = text.gsub(CROP_REGEX) do |m|
crop_str = $1
@expanded = @expanded.gsub(CROP_REGEX) do
crop_str = Regexp.last_match(1)
# find crop case-insensitively
crop = Crop.where('lower(name) = ?', crop_str.downcase).first
if crop
url = Rails.application.routes.url_helpers.crop_url(crop, host: Growstuff::Application.config.host)
"[#{crop_str}](#{url})"
else
crop_str
end
crop_link crop, crop_str
end
end
def expand_members!
# turn [jane](member) into [jane](http://growstuff.org/members/jane)
expanded = expanded.gsub(MEMBER_REGEX) do |m|
member_str = $1
# find member case-insensitively
member = Member.case_insensitive_login_name(member_str).first
if member
url = Rails.application.routes.url_helpers.member_url(member, only_path: true)
"[#{member_str}](#{url})"
else
member_str
end
end
# turn @jane into [@jane](http://growstuff.org/members/jane)
expanded = expanded.gsub(MEMBER_AT_REGEX) do |m|
member_str = $1
# find member case-insensitively
member = Member.case_insensitive_login_name(member_str[1..-1]).first
if member
url = Rails.application.routes.url_helpers.member_url(member, only_path: true)
"[#{member_str}](#{url})"
else
member_str
[MEMBER_REGEX, MEMBER_AT_REGEX].each do |re|
@expanded = @expanded.gsub(re) do
member_str = Regexp.last_match(1)
member = find_member(member_str)
member_link(member, member_str)
end
end
expanded = expanded.gsub(MEMBER_ESCAPE_AT_REGEX, "")
@expanded = @expanded.gsub(MEMBER_ESCAPE_AT_REGEX, '')
end
BlueCloth.new(expanded).to_html
def member_link(member, link_text)
if member
url = Rails.application.routes.url_helpers.member_url(member, only_path: true)
"[#{link_text}](#{url})"
else
link_text
end
end
def crop_link(crop, link_text)
if crop
url = Rails.application.routes.url_helpers.crop_url(crop, host: HOST)
"[#{link_text}](#{url})"
else
link_text
end
end
def find_member(login_name)
# Remove @ if present
login_name = login_name[1..-1] if login_name.start_with?('@')
Member.case_insensitive_login_name(login_name).first
end
end

View File

@@ -8,7 +8,6 @@
"coffeelint": "^1.16.0",
"csslint": "^1.0.5",
"eslint": "^3.17.1",
"git-guilt": "^0.1.1",
"jshint": "^2.9.4"
},
"repository": {

View File

@@ -1,9 +1,9 @@
#!/usr/bin/env ruby
require 'heroku-api'
require 'platform-api'
require 'yaml'
heroku = Heroku::API.new(api_key: ENV['HEROKU_API_KEY'])
heroku = PlatformAPI.connect(ENV['HEROKU_API_KEY'])
branch = ENV['TRAVIS_BRANCH']
travis_config = YAML.load_file('.travis.yml')
if travis_config['deploy']['app'].key? branch
@@ -14,12 +14,12 @@ end
case ARGV[0]
when "on"
maintenance_state = 1
maintenance_state = true
when "off"
maintenance_state = 0
maintenance_state = false
else
abort "usage: #{$0} (on|off)"
end
puts "Turning #{maintenance_state} maintenance mode on app #{app}"
heroku.post_app_maintenance(app, maintenance_state)
heroku.app.update app, maintenance: maintenance_state

View File

@@ -24,7 +24,7 @@ describe Admin::OrdersController do
it "sets an error message if nothing found" do
get :search, search_by: 'order_id', search_text: 'foo'
flash[:alert].should match /Couldn't find order with/
flash[:alert].should have_text "Couldn't find order with"
end
end
end

View File

@@ -39,7 +39,7 @@ describe OrdersController do
order = Order.create!(member_id: member.id)
get :checkout, id: order.to_param
response.status.should eq 302
response.redirect_url.should match /paypal\.com/
response.redirect_url.should match(/paypal\.com/)
end
end

View File

@@ -21,6 +21,6 @@ feature "cms admin" do
scenario "admin members can view CMS admin area" do
login_as admin_member
visit comfy_admin_cms_path
expect(current_path).to match /#{comfy_admin_cms_path}/ # match any CMS admin page
expect(current_path).to match(/#{comfy_admin_cms_path}/) # match any CMS admin page
end
end

View File

@@ -12,7 +12,7 @@ feature 'Commenting on a post' do
scenario "creating a comment" do
fill_in "comment_body", with: "This is a sample test for comment"
click_button "Post comment"
expect(page).to have_content "Comment was successfully created"
expect(page).to have_content "comment was successfully created."
expect(page).to have_content "Posted by"
end
@@ -26,7 +26,7 @@ feature 'Commenting on a post' do
scenario "saving edit" do
fill_in "comment_body", with: "Testing edit for comment"
click_button "Post comment"
expect(page).to have_content "Comment was successfully updated"
expect(page).to have_content "comment was successfully updated."
expect(page).to have_content "edited at"
end
end

View File

@@ -27,7 +27,8 @@ feature "Crop - " do
click_button "Save"
end
expect(page).to have_content "Crop was successfully requested."
expect(page).to have_content 'crop was successfully created.'
expect(page).to have_content "This crop is currently pending approval."
expect(page).to have_content "Jasminum sambac 2"
expect(page).to have_content "Matsurika"
end

View File

@@ -48,7 +48,7 @@ feature "crop wranglers", js: true do
fill_in 'en_wikipedia_url', with: "http://en.wikipedia.org/wiki/Maize"
fill_in 'sci_name[1]', with: "planticus maximus"
click_on 'Save'
expect(page).to have_content 'Crop was successfully created'
expect(page).to have_content 'crop was successfully created.'
expect(page).to have_content 'planticus maximus'
end

View File

@@ -14,7 +14,8 @@ feature "Requesting a new crop" do
fill_in "Name", with: "Couch potato"
fill_in "request_notes", with: "Couch potatoes are real for real."
click_button "Save"
expect(page).to have_content "Crop was successfully requested."
expect(page).to have_content 'crop was successfully created.'
expect(page).to have_content "This crop is currently pending approval."
end
end
@@ -32,7 +33,7 @@ feature "Requesting a new crop" do
expect(page).to have_content "En wikipedia url is not a valid English Wikipedia URL"
fill_in "en_wikipedia_url", with: "http://en.wikipedia.org/wiki/Aung_San_Suu_Kyi"
click_button "Save"
expect(page).to have_content "Crop was successfully updated."
expect(page).to have_content "crop was successfully updated."
end
scenario "Rejecting a crop" do
@@ -40,7 +41,7 @@ feature "Requesting a new crop" do
select "rejected", from: "Approval status"
select "not edible", from: "Reason for rejection"
click_button "Save"
expect(page).to have_content "Crop was successfully updated."
expect(page).to have_content "crop was successfully updated."
end
end
end

View File

@@ -58,7 +58,7 @@ feature "Planting a crop", js: true do
end
scenario "button on index to edit garden" do
first(".panel-title").click_link("edit_garden_glyphicon")
first(".garden-info").click_link("Edit")
expect(page).to have_content 'Edit garden'
end
end
@@ -67,7 +67,7 @@ feature "Planting a crop", js: true do
visit new_garden_path
fill_in "Name", with: "New garden"
click_button "Save"
click_link "Edit garden"
click_link 'edit_garden_link'
fill_in "Name", with: "Different name"
click_button "Save"
expect(page).to have_content "Garden was successfully updated"
@@ -79,7 +79,7 @@ feature "Planting a crop", js: true do
fill_in "Name", with: "New garden"
click_button "Save"
visit garden_path(Garden.last)
click_link "Delete garden"
click_link 'delete_garden_link'
expect(page).to have_content "Garden was successfully deleted"
expect(page).to have_content "#{garden.owner}'s gardens"
end

View File

@@ -39,7 +39,7 @@ feature "Harvesting a crop", :js, :elasticsearch do
click_button "Save"
end
expect(page).to have_content "Harvest was successfully created"
expect(page).to have_content "harvest was successfully created."
end
context "Clicking edit from the index page" do
@@ -71,7 +71,7 @@ feature "Harvesting a crop", :js, :elasticsearch do
click_button "Save"
end
expect(page).to have_content "Harvest was successfully created"
expect(page).to have_content "harvest was successfully created."
expect(page).to have_content "maize"
end
@@ -83,7 +83,7 @@ feature "Harvesting a crop", :js, :elasticsearch do
select plant_part.name, from: 'harvest[plant_part_id]'
click_button "Save"
expect(page).to have_content "Harvest was successfully created"
expect(page).to have_content "harvest was successfully created."
expect(page).to have_content planting.garden.name
expect(page).to have_content "maize"
end
@@ -101,14 +101,14 @@ feature "Harvesting a crop", :js, :elasticsearch do
# Check that the autosuggest helper properly fills inputs with
# existing resource's data
click_button "Save"
expect(page).to have_content "Harvest was successfully updated"
expect(page).to have_content "harvest was successfully updated."
expect(page).to have_content "maize"
end
scenario "change plant part" do
select other_plant_part.name, from: 'harvest[plant_part_id]'
click_button "Save"
expect(page).to have_content "Harvest was successfully updated"
expect(page).to have_content "harvest was successfully updated."
expect(page).to have_content other_plant_part.name
end
end

View File

@@ -0,0 +1,169 @@
require 'rails_helper'
feature "member deletion" do
context "with activity and followers" do
let(:member) { FactoryGirl.create(:member) }
let(:other_member) { FactoryGirl.create(:member) }
let(:memberpost) { FactoryGirl.create(:post, author: member) }
let(:othermemberpost) { FactoryGirl.create(:post, author: other_member) }
let!(:planting) { FactoryGirl.create(:planting, owner: member) }
let!(:harvest) { FactoryGirl.create(:harvest, owner: member) }
let!(:seed) { FactoryGirl.create(:seed, owner: member) }
let!(:secondgarden) { FactoryGirl.create(:garden, owner: member) }
let!(:order) { FactoryGirl.create(:order, member: member, completed_at: Time.zone.now) }
let(:admin) { FactoryGirl.create(:admin_member) }
background do
login_as(member)
visit member_path(other_member)
click_link 'Follow'
logout
login_as(other_member)
visit member_path(member)
click_link 'Follow'
logout
login_as(member)
FactoryGirl.create(:comment, author: member, post: othermemberpost)
FactoryGirl.create(:comment, author: other_member, post: memberpost, body: "Fun comment-y thing")
# deletion breaks if no wranglers exist
FactoryGirl.create(:cropbot)
# deletion breaks if ex_member doesn't exist
FactoryGirl.create(:member, login_name: "ex_member")
end
scenario "has option to delete on member profile page" do
visit member_path(member)
click_link 'Edit profile'
expect(page).to have_link "Delete Account"
end
scenario "asks for password before deletion" do
visit member_path(member)
click_link 'Edit profile'
click_link 'Delete Account'
click_button "Delete"
expect(page).to have_content "Current password can't be blank"
end
scenario "password must be correct" do
visit member_path(member)
click_link 'Edit profile'
click_link 'Delete Account'
fill_in "current_pw_for_delete", with: "wrongpassword"
click_button "Delete"
expect(page).to have_content "Current password is invalid"
end
scenario "deletes and removes bio" do
visit member_path(member)
click_link 'Edit profile'
click_link 'Delete Account'
fill_in "current_pw_for_delete", with: "password1", match: :prefer_exact
click_button "Delete"
visit member_path(member)
expect(page.status_code).to eq(404)
end
context "deletes and" do
background do
logout
login_as(member)
visit member_path(member)
click_link 'Edit profile'
click_link 'Delete Account'
fill_in "current_pw_for_delete", with: "password1", match: :prefer_exact
click_button "Delete"
logout
end
scenario "removes plantings" do
visit planting_path(planting)
expect(page.status_code).to eq(404)
end
scenario "removes gardens" do
visit garden_path(secondgarden)
expect(page.status_code).to eq(404)
end
scenario "removes harvests and seeds" do
visit harvest_path(harvest)
expect(page.status_code).to eq(404)
end
scenario "removes seeds" do
visit seed_path(seed)
expect(page.status_code).to eq(404)
end
scenario "removes members from following" do
visit member_follows_path(other_member)
expect(page).not_to have_content member.login_name.to_s
visit member_followers_path(other_member)
expect(page).not_to have_content member.login_name.to_s
end
scenario "replaces posts with deletion note" do
visit post_path(memberpost)
expect(page.status_code).to eq(404)
end
scenario "replaces comments on others' posts with deletion note, leaving post intact" do
visit post_path(othermemberpost)
expect(page).not_to have_content member.login_name
expect(page).to have_content other_member.login_name
expect(page).to have_content "Member Deleted"
end
scenario "leaves a record of orders and payments intact" do
login_as(admin)
visit admin_path
fill_in "search_text", with: member.login_name.to_s
find("#maincontainer").click_button("Search", exact: true)
expect(page).to have_content member.login_name.to_s
expect(page).to have_content "Found 1 result"
logout
end
scenario "can't be interesting" do
expect(Member.interesting).not_to include(member)
expect(Planting.interesting).not_to include(planting)
expect(Seed.interesting).not_to include(seed)
end
pending "doesn't show in nearby"
scenario "can no longer sign in" do
visit new_member_session_path
fill_in 'Login', with: member.login_name
fill_in 'Password', with: member.password
click_button 'Sign in'
expect(page).to have_content 'Invalid Login or password'
end
end
end
context "for a crop wrangler" do
let(:member) { FactoryGirl.create(:crop_wrangling_member) }
let(:otherwrangler) { FactoryGirl.create(:crop_wrangling_member) }
let(:crop) { FactoryGirl.create(:crop, creator: member) }
FactoryGirl.create(:cropbot)
let!(:ex_wrangler) { FactoryGirl.create(:crop_wrangling_member, login_name: "ex_wrangler") }
scenario "leaves crops behind" do
login_as(otherwrangler)
visit edit_crop_path(crop)
expect(page).to have_content member.login_name
expect(page).not_to have_content "cropbot"
logout
login_as(member)
visit member_path(member)
click_link 'Edit profile'
click_link 'Delete Account'
fill_in "current_pw_for_delete", with: "password1", match: :prefer_exact
click_button "Delete"
login_as(otherwrangler)
visit edit_crop_path(crop)
expect(page).not_to have_content member.login_name
end
end
end

View File

@@ -42,7 +42,7 @@ feature "Planting a crop", :js, :elasticsearch do
click_button "Save"
end
expect(page).to have_content "Planting was successfully created"
expect(page).to have_content "planting was successfully created"
expect(page).to have_content "Progress: Not calculated, days before maturity unknown"
end
@@ -74,7 +74,7 @@ feature "Planting a crop", :js, :elasticsearch do
click_button "Save"
end
expect(page).to have_content "Planting was successfully created"
expect(page).to have_content "planting was successfully created"
expect(page).to have_content "Progress: 0% - not planted yet"
end
@@ -90,7 +90,7 @@ feature "Planting a crop", :js, :elasticsearch do
click_button "Save"
end
expect(page).to have_content "Planting was successfully created"
expect(page).to have_content "planting was successfully created"
expect(page).to have_content "Progress: Not calculated, days before maturity unknown"
expect(page).to have_content "Days until maturity: unknown"
end
@@ -108,7 +108,7 @@ feature "Planting a crop", :js, :elasticsearch do
click_button "Save"
end
expect(page).to have_content "Planting was successfully created"
expect(page).to have_content "planting was successfully created"
expect(page).to_not have_content "Progress: 0% - not planted yet"
expect(page).to_not have_content "Progress: Not calculated, days before maturity unknown"
end
@@ -126,7 +126,7 @@ feature "Planting a crop", :js, :elasticsearch do
click_button "Save"
end
expect(page).to have_content "Planting was successfully created"
expect(page).to have_content "planting was successfully created"
expect(page).to have_content "Progress: 100%"
expect(page).to have_content "Yes (no date specified)"
expect(page).to have_content "Days until maturity: 0"
@@ -145,7 +145,7 @@ feature "Planting a crop", :js, :elasticsearch do
click_button "Save"
end
expect(page).to have_content "Planting was successfully created"
expect(page).to have_content "planting was successfully created"
expect(page).to have_content "Progress: 100%"
expect(page).to have_content "Days until maturity: 0"
end
@@ -159,7 +159,7 @@ feature "Planting a crop", :js, :elasticsearch do
click_button "Save"
end
expect(page).to have_content "Planting was successfully created"
expect(page).to have_content "planting was successfully created"
expect(page).to have_content "maize"
end
@@ -168,7 +168,7 @@ feature "Planting a crop", :js, :elasticsearch do
click_link "Edit"
fill_in "Tell us more about it", with: "Some extra notes"
click_button "Save"
expect(page).to have_content "Planting was successfully updated"
expect(page).to have_content "planting was successfully updated"
end
scenario "Editing a planting to fill in the finished date" do
@@ -178,7 +178,7 @@ feature "Planting a crop", :js, :elasticsearch do
check "finished"
fill_in "Finished date", with: "2015-06-25"
click_button "Save"
expect(page).to have_content "Planting was successfully updated"
expect(page).to have_content "planting was successfully updated"
expect(page).to_not have_content "Progress: Not calculated, days before maturity unknown"
end
@@ -211,7 +211,7 @@ feature "Planting a crop", :js, :elasticsearch do
within "form#new_planting" do
click_button "Save"
end
expect(page).to have_content "Planting was successfully created"
expect(page).to have_content "planting was successfully created"
expect(page).to have_content "Finished: August 30, 2014"
# shouldn't be on the page
@@ -230,7 +230,7 @@ feature "Planting a crop", :js, :elasticsearch do
check "Mark as finished"
click_button "Save"
end
expect(page).to have_content "Planting was successfully created"
expect(page).to have_content "planting was successfully created"
expect(page).to have_content "Finished: Yes (no date specified)"
expect(page).to have_content "Progress: 100%"
end

View File

@@ -36,7 +36,7 @@ feature "Scientific names", js: true do
fill_in 'Name', with: "Zea mirabila"
click_on "Save"
expect(page).to have_content "Zea mirabila"
expect(page).to have_content 'Scientific name was successfully updated'
expect(page).to have_content 'crop was successfully updated'
end
scenario "Crop wranglers can delete scientific names" do
@@ -46,7 +46,7 @@ feature "Scientific names", js: true do
within('.scientific_names') { click_on "Delete" }
expect(page.status_code).to equal 200
expect(page).to_not have_content zea_mays.name
expect(page).to have_content 'Scientific name was successfully deleted'
expect(page).to have_content 'Scientific name was successfully deleted.'
end
scenario "Crop wranglers can add scientific names" do
@@ -60,7 +60,7 @@ feature "Scientific names", js: true do
click_on "Save"
expect(page.status_code).to equal 200
expect(page).to have_content "Zea mirabila"
expect(page).to have_content 'Scientific name was successfully created'
expect(page).to have_content 'crop was successfully created.'
end
scenario "The show-scientific-name page works" do

View File

@@ -17,6 +17,6 @@ describe 'Haml::Filters::Escaped_Markdown' do
it 'converts quick crop links' do
@crop = FactoryGirl.create(:crop)
rendered = Haml::Filters::EscapedMarkdown.render("[#{@crop.name}](crop)")
rendered.should match /&lt;a href=&quot;/
rendered.should match(/&lt;a href=&quot;/)
end
end

View File

@@ -31,18 +31,18 @@ describe 'Haml::Filters::Growstuff_Markdown' do
it 'converts quick crop links' do
@crop = FactoryGirl.create(:crop)
rendered = Haml::Filters::GrowstuffMarkdown.render(input_link(@crop.name))
rendered.should match /#{output_link(@crop)}/
expect(rendered).to match(/#{output_link(@crop)}/)
end
it "doesn't convert nonexistent crops" do
rendered = Haml::Filters::GrowstuffMarkdown.render(input_link("not a crop"))
rendered.should match /not a crop/
expect(rendered).to match(/not a crop/)
end
it "doesn't convert escaped crop links" do
@crop = FactoryGirl.create(:crop)
rendered = Haml::Filters::GrowstuffMarkdown.render("\\" << input_link(@crop.name))
rendered.should match /\[#{@crop.name}\]\(crop\)/
expect(rendered).to match(/\[#{@crop.name}\]\(crop\)/)
end
it "handles multiple crop links" do
@@ -50,55 +50,55 @@ describe 'Haml::Filters::Growstuff_Markdown' do
maize = FactoryGirl.create(:maize)
string = "#{input_link(tomato)} #{input_link(maize)}"
rendered = Haml::Filters::GrowstuffMarkdown.render(string)
rendered.should match /#{output_link(tomato)} #{output_link(maize)}/
expect(rendered).to match(/#{output_link(tomato)} #{output_link(maize)}/)
end
it "converts normal markdown" do
string = "**foo**"
rendered = Haml::Filters::GrowstuffMarkdown.render(string)
rendered.should match /<strong>foo<\/strong>/
expect(rendered).to match(/<strong>foo<\/strong>/)
end
it "finds crops case insensitively" do
@crop = FactoryGirl.create(:crop, name: 'tomato')
rendered = Haml::Filters::GrowstuffMarkdown.render(input_link('ToMaTo'))
rendered.should match /#{output_link(@crop, 'ToMaTo')}/
expect(rendered).to match(/#{output_link(@crop, 'ToMaTo')}/)
end
it "fixes PT bug #78615258 (Markdown rendering bug with URLs and crops in same text)" do
tomato = FactoryGirl.create(:tomato)
string = "[test](http://example.com) [tomato](crop)"
rendered = Haml::Filters::GrowstuffMarkdown.render(string)
rendered.should match /#{output_link(tomato)}/
rendered.should match "<a href=\"http://example.com\">test</a>"
expect(rendered).to match(/#{output_link(tomato)}/)
expect(rendered).to match "<a href=\"http://example.com\">test</a>"
end
it 'converts quick member links' do
@member = FactoryGirl.create(:member)
rendered = Haml::Filters::GrowstuffMarkdown.render(input_member_link(@member.login_name))
rendered.should match /#{output_member_link(@member)}/
expect(rendered).to match(/#{output_member_link(@member)}/)
end
it "doesn't convert nonexistent members" do
rendered = Haml::Filters::GrowstuffMarkdown.render(input_member_link("not a member"))
rendered.should match /not a member/
expect(rendered).to include('not a member')
end
it "doesn't convert escaped members" do
@member = FactoryGirl.create(:member)
rendered = Haml::Filters::GrowstuffMarkdown.render("\\" << input_member_link(@member.login_name))
rendered.should match /\[#{@member.login_name}\]\(member\)/
expect(rendered).to match(/\[#{@member.login_name}\]\(member\)/)
end
it 'converts @ member links' do
@member = FactoryGirl.create(:member)
rendered = Haml::Filters::GrowstuffMarkdown.render("Hey @#{@member.login_name}! What's up")
rendered.should match /#{output_member_link(@member, "@#{@member.login_name}")}/
expect(rendered).to match(/#{output_member_link(@member, "@#{@member.login_name}")}/)
end
it "doesn't convert invalid @ members" do
rendered = Haml::Filters::GrowstuffMarkdown.render("@not-a-member")
rendered.should match /@not-a-member/
rendered = Haml::Filters::GrowstuffMarkdown.render("@notamember")
expect(rendered).to include('@notamember')
end
it "doesn't convert nonexistent @ members" do
@@ -106,12 +106,12 @@ describe 'Haml::Filters::Growstuff_Markdown' do
@member_name = @member.login_name
@member.destroy
rendered = Haml::Filters::GrowstuffMarkdown.render("Hey @#{@member_name}")
rendered.should match /Hey @#{@member_name}/
expect(rendered).to include("Hey @#{@member_name}")
end
it "doesn't convert escaped @ members" do
@member = FactoryGirl.create(:member)
rendered = Haml::Filters::GrowstuffMarkdown.render("Hey \\@#{@member.login_name}! What's up")
rendered.should match /Hey @#{@member.login_name}!/
expect(rendered).to include("Hey @#{@member.login_name}!")
end
end

View File

@@ -27,7 +27,7 @@ describe Comment do
@n = Notification.first
@n.sender.should eq @c.author
@n.recipient.should eq @c.post.author
@n.subject.should match /commented on/
@n.subject.should include 'commented on'
@n.body.should eq @c.body
@n.post.should eq @c.post
end

View File

@@ -150,6 +150,10 @@ describe Crop do
@crop.default_photo.should be_an_instance_of Photo
@crop.default_photo.id.should eq @photo.id
end
it 'is found in has_photos scope' do
Crop.has_photos.should include(@crop)
end
end
context 'with a harvest photo' do

View File

@@ -242,4 +242,10 @@ describe Garden do
garden.default_photo.should eq @photo2
end
end
it 'excludes deleted members' do
expect(Garden.joins(:owner).all).to include(garden)
owner.destroy
expect(Garden.joins(:owner).all).not_to include(garden)
end
end

View File

@@ -252,6 +252,10 @@ describe Harvest do
@harvest.photos << @photo
end
it 'is found in has_photos scope' do
Harvest.has_photos.should include(@harvest)
end
it 'has a photo' do
@harvest.photos.first.should eq @photo
end
@@ -290,4 +294,12 @@ describe Harvest do
end
end
end
it 'excludes deleted members' do
member = FactoryGirl.create :member
harvest = FactoryGirl.create :harvest, owner: member
expect(Harvest.joins(:owner).all).to include(harvest)
member.destroy
expect(Harvest.joins(:owner).all).not_to include(harvest)
end
end

View File

@@ -438,4 +438,42 @@ describe 'member' do
member.newsletter_unsubscribe(gb, true)
end
end
context 'member deleted' do
let(:member) { FactoryGirl.create(:member) }
context 'queries a scope' do
before { member.destroy }
it { expect(Member.all).not_to include(member) }
it { expect(Member.confirmed).not_to include(member) }
it { expect(Member.located).not_to include(member) }
it { expect(Member.recently_signed_in).not_to include(member) }
it { expect(Member.recently_joined).not_to include(member) }
it { expect(Member.wants_newsletter).not_to include(member) }
it { expect(Member.interesting).not_to include(member) }
it { expect(Member.has_plantings).not_to include(member) }
end
it "unsubscribes from mailing list" do
expect(member).to receive(:newsletter_unsubscribe).and_return(true)
member.destroy
end
context "deleted admin member" do
let(:member) { FactoryGirl.create(:admin_member) }
before { member.destroy }
context 'crop creator' do
let!(:crop) { FactoryGirl.create(:crop, creator: member) }
it "leaves crops behind, reassigned to cropbot" do
expect(Crop.all).to include(crop)
end
end
context 'forum owners' do
let!(:forum) { FactoryGirl.create(:forum, owner: member) }
it "leaves forums behind, reassigned to ex_admin" do
expect(forum.owner).to eq(member)
end
end
end
end
end

View File

@@ -1,8 +1,9 @@
require 'rails_helper'
describe Photo do
let(:photo) { FactoryGirl.create(:photo, owner: member) }
let(:member) { FactoryGirl.create(:member) }
describe 'add/delete functionality' do
let(:photo) { FactoryGirl.create(:photo) }
let(:planting) { FactoryGirl.create(:planting) }
let(:harvest) { FactoryGirl.create(:harvest) }
let(:garden) { FactoryGirl.create(:garden) }
@@ -118,4 +119,10 @@ describe Photo do
photo.should.respond_to? :flickr_metadata
end
end
it 'excludes deleted members' do
expect(Photo.joins(:owner).all).to include(photo)
member.destroy
expect(Photo.joins(:owner).all).not_to include(photo)
end
end

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