Compare commits

...

238 Commits

Author SHA1 Message Date
Cesy
3325e1e388 Merge pull request #1020 from Growstuff/dev
Release 13
2016-07-19 10:45:28 +01:00
Daniel O'Connor
7947fd6e91 Clean up link_to as per #1013 2016-07-08 17:08:17 +09:30
Daniel O'Connor
70bf5499b2 Clean up logic a bit as per #1013 2016-07-08 17:07:14 +09:30
Daniel O'Connor
6b059cb4f4 Clean up a bit as per #1013 with TODO comments 2016-07-08 17:06:05 +09:30
Daniel O'Connor
efd112c4b8 And vs && - revised version of b50127c166 2016-07-08 17:01:59 +09:30
Mackenzie Morgan
5c7b760f34 Use array literal [] instead of Array.new 2016-07-08 16:58:34 +09:30
Mackenzie Morgan
81ae473972 space between comma-separated arguments 2016-07-08 16:58:29 +09:30
Mackenzie Morgan
a8171bb739 has_key? -> key? 2016-07-08 16:58:22 +09:30
Daniel O'Connor
c803ed4ee6 Merge pull request #976 from pozorvlak/remove_default_shows
Remove "show" methods that just do the default
2016-07-08 16:56:25 +09:30
Daniel O'Connor
9e41a65749 Tweak readme wiki links
Supercedes #1016
2016-07-08 15:33:16 +09:30
Cesy
a7539df5b5 Merge pull request #1018 from CloCkWeRX/minor_rails_bump
Minor gem upgrades for the month
2016-07-01 10:14:22 +01:00
Daniel O'Connor
3950619877 Update various minor gems even more 2016-07-01 17:42:58 +09:30
Daniel O'Connor
7373fd4aa9 Update various minor gems 2016-07-01 17:34:25 +09:30
Daniel O'Connor
c3d9885525 Merge pull request #987 from CloCkWeRX/upgradazzle_rails
Upgrade to rails 4.2.0+ (round 2)
2016-06-29 14:47:05 +09:30
Daniel O'Connor
4b5dee7bdb Merge pull request #1007 from ctlewitt/dev
issue #1006: change "Freenode" to "irc.freenode.net" in README.md
2016-06-29 12:51:05 +09:30
Charley Lewittes
55d846b9e0 Merge remote-tracking branch 'them/dev' into dev 2016-06-22 10:56:56 -04:00
Daniel O'Connor
f2d8349a88 #1012 Tweak script to avoid errors after merge 2016-06-22 10:46:26 +09:30
Daniel O'Connor
7c7dd7c609 Merge pull request #1012 from pozorvlak/check_contributors_md
Check PR author is in CONTRIBUTORS.md under Travis
2016-06-22 10:25:06 +09:30
Charley Lewittes
d8f2c580ee added myself to contributors list 2016-06-21 13:14:26 -04:00
Charley Lewittes
2a0602468d Added link and wording to access Freenode IRC growstuff channel easily
fixes #1006
2016-06-21 13:03:06 -04:00
Charley Lewittes
89a9c18188 fixes #1006: change "Freenode" to "irc.freenode.net" in README.md 2016-06-21 12:49:33 -04:00
Miles Gould
8b426da149 Check PR author is in CONTRIBUTORS.md under Travis
Results of testing this locally (the exit value of the last command is
in my prompt):

```
0 $ TRAVIS=true TRAVIS_REPO_SLUG=growstuff/growstuff
TRAVIS_PULL_REQUEST=1007 script/check_contributors_md
Checking to see if you're in CONTRIBUTORS.md...

Thanks for your contribution, ctlewitt!
Please add your name and GitHub handle to the file CONTRIBUTORS.md,
commit it, and update your PR.

1 $ TRAVIS=true TRAVIS_REPO_SLUG=growstuff/growstuff
TRAVIS_PULL_REQUEST=1008 script/check_contributors_md
Checking to see if you're in CONTRIBUTORS.md...
- Miles Gould / [pozorvlak](https://github.com/pozorvlak)
0 $ script/check_contributors_md
Checking to see if you're in CONTRIBUTORS.md...
- Miles Gould / [pozorvlak](https://github.com/pozorvlak)
0 $
```
2016-06-21 16:37:26 +01:00
pozorvlak
cab98f9750 Merge pull request #1011 from Growstuff/revert-1002-letsencrypt-pt2-1
Revert "challenge code"
2016-06-21 15:28:15 +01:00
pozorvlak
27b7a26fee Merge pull request #1010 from Growstuff/revert-999-letsencrypt
Revert "lets encrypt challenge page"
2016-06-21 15:27:38 +01:00
Cesy
7261fae9f2 Revert "challenge code" 2016-06-21 15:06:02 +01:00
Cesy
628ebd6841 Revert "lets encrypt challenge page" 2016-06-21 15:05:45 +01:00
Cesy
61bbf7c30d Merge pull request #1008 from pozorvlak/test_gemfile_commits
Check for "forgot to commit Gemfile.lock" in CI
2016-06-21 14:57:54 +01:00
Miles Gould
e33803343a Check for "forgot to commit Gemfile.lock" in CI
Quick-and-dirty script to catch an error we've missed a couple of times
in code review, but which is not (AFAICT) covered by any of our existing
checkers. Inspired by the following posts:

 - https://zachholman.com/posts/how-github-writes-blog-posts/
 - https://zachholman.com/talk/move-fast-break-nothing/
2016-06-21 13:32:11 +01:00
Mackenzie
b08a448fdc hotfix commit: letsencrypt try #2 2016-06-20 13:40:49 -04:00
Cesy
7210ebfb22 Merge pull request #1004 from maco/letsencrypt
Letsencrypt, will be backed out once SSL is up and running.
2016-06-20 16:57:24 +01:00
Mackenzie Morgan
039978357b letsencrypt verification for staging 2016-06-20 11:48:19 -04:00
Cesy
7ce2481cbc Merge pull request #1002 from Growstuff/letsencrypt-pt2-1
challenge code - will also get reverted once SSL is up.
2016-06-20 15:49:33 +01:00
Mackenzie
5bc6af87c5 challenge code 2016-06-20 10:46:40 -04:00
Cesy
a5eaf3566e Merge pull request #999 from Growstuff/letsencrypt
lets encrypt challenge page - temporary change for SSL tool, will be backed out after
2016-06-20 15:42:22 +01:00
Mackenzie
63d89be698 lets encrypt challenge page 2016-06-20 10:34:11 -04:00
pozorvlak
1b7be9f9b0 Merge pull request #936 from maco/add_bootstrap_flashes
Add support for Bootstrap alert types
2016-06-20 10:19:36 +01:00
Mackenzie Morgan
7a53e96d52 test the default case 2016-06-19 22:52:51 -04:00
Mackenzie Morgan
b28d146de7 use default of info
add tests
2016-06-19 22:42:20 -04:00
Mackenzie Morgan
55c8be8dc5 merge 2016-06-19 22:27:27 -04:00
Daniel O'Connor
38a273459a Merge pull request #996 from pozorvlak/block_unknown_urls_in_features
Block external URLs in feature tests
2016-06-18 20:21:32 +09:30
Miles Gould
1b07632c69 Block external URLs in features
https://github.com/teampoltergeist/poltergeist/issues/375#issuecomment-42620085
suggested that this might help with our intermittent "Request to
http://localhost:8081 failed to reach server, check DNS and/or server
status" errors in CI - the theory being that the error message is
misleading, and it's actually a daughter request to an external service
timing out. Seems worth a shot. It also ought to speed up testing, but
the effect is slight (20s out of 3.5 minutes) on my machine.

I've blacklisted only URLs I could find in app/views or by tcpdumping a
test run, because I couldn't get whitelisting to work.
2016-06-17 21:12:25 +01:00
pozorvlak
4a12523793 Merge pull request #991 from Growstuff/dev
Release 12
2016-06-17 11:37:29 +01:00
pozorvlak
6aa601b8ab Merge pull request #993 from Growstuff/revert-988-dev
Revert "Handled Issue #950 (Branded Error Pages)"
2016-06-16 13:30:50 +01:00
pozorvlak
a66a040207 Revert "Handled Issue #950 (Branded Error Pages)" 2016-06-16 12:58:22 +01:00
pozorvlak
547a408a99 Merge pull request #988 from Prashanth261993/dev
Add branding to error pages (#950)
2016-06-16 11:12:23 +01:00
pozorvlak
8cd224b7fa Merge pull request #990 from maco/sparkpost_#917
don't override our environment email settings with plain old sendmail
2016-06-15 20:03:35 +01:00
Mackenzie Morgan
8428e93b47 don't override our environment email settings with plain old sendmail 2016-06-15 13:27:51 -04:00
Prashanth
483143f2fe Merge branch 'growstuff-dev' into dev
Conflicts:
	CONTRIBUTORS.md
2016-06-14 17:09:06 +05:30
pozorvlak
1b3d106b6d Merge pull request #989 from maco/sparkpost_#917
update to SparkPost's mailserver
2016-06-13 18:04:43 +01:00
Mackenzie Morgan
e7be006fa7 update to SparkPost's mailserver 2016-06-13 12:12:00 -04:00
Prashanth
b9f40151d8 Handled Issue #950 (Branded Error Pages)
Moved error related views from public to errors (asset pipeline can be used).
Header and footer were included along with the error message.
2016-06-10 18:35:48 +05:30
Daniel O'Connor
fd467acc29 Clean up whitespace 2016-06-10 20:51:02 +09:30
pozorvlak
e1ad0c31c8 Merge pull request #986 from CloCkWeRX/update_various_gems_nokogiri
Update various gems - nokogiri, mime-types, parser, guard-rspec
2016-06-10 11:09:12 +01:00
Daniel O'Connor
ee604dc2b0 Upgrade activemerchant, fixing rails 5 deprecation warnings 2016-06-10 16:04:00 +09:30
Daniel O'Connor
0620646c6d Fix failing specs
- Updated assert_select behaviour given this is now based on nokogiri
 - Adjust some specs not to look for a specific asset name, but a behaviour
 - Adjust some specs for HTML5 style attributes instead of xhtml style
 - Fix tests that did not render before
2016-06-10 16:01:30 +09:30
Daniel O'Connor
df9cf3f5c4 Fix various rails deprecations 2016-06-10 15:58:39 +09:30
Daniel O'Connor
944349760a Fix DEPRECATION WARNING: #timestamps was called without specifying an option for null.
In Rails 5, this behavior will change to `null: false`. You should manually specify `null: true` to prevent the behavior of your existing migrations from changing
2016-06-10 15:57:48 +09:30
Daniel O'Connor
7fe75ee52a Fix DEPRECATION WARNING: #deliver is deprecated. 2016-06-10 15:45:01 +09:30
Daniel O'Connor
e3d7bf9a62 Upgrade to rails 4.2.* 2016-06-10 15:43:04 +09:30
Daniel O'Connor
deaf49c18f Update selenium-webdriver 2016-06-10 15:40:56 +09:30
Daniel O'Connor
53543fff4c Update terminal-table 2016-06-10 15:40:29 +09:30
Daniel O'Connor
ea5e710a70 Update codeclimate-test-reporter 2016-06-10 15:38:43 +09:30
Daniel O'Connor
ad5a52ae74 Update tilt 2016-06-10 15:36:07 +09:30
Daniel O'Connor
c0cc5ab085 Update geocoder 2016-06-10 15:35:29 +09:30
Daniel O'Connor
cf784cbedd Update parser to current 2016-06-10 15:20:31 +09:30
Daniel O'Connor
5c68830919 Update guard-rspec 2016-06-10 15:19:57 +09:30
Daniel O'Connor
370aab41c3 Update mime-types 2016-06-10 15:19:28 +09:30
Daniel O'Connor
081f4021bc Upgrade nokogiri 2016-06-10 15:19:03 +09:30
Daniel O'Connor
36f846fabf Merge pull request #982 from CloCkWeRX/update_gibbon
Upgrade gibbon
2016-06-10 15:13:18 +09:30
pozorvlak
f6d094f57c Merge pull request #985 from lucasnogueira/fix_simplecov_deprecation
Fix SimpleCov Deprecation Warning
2016-06-09 22:37:40 +01:00
Lucas Nogueira
9ce097b7d6 Fix SimpleCov Deprecation Warning 2016-06-09 17:42:11 -03:00
pozorvlak
b03ccce575 Merge pull request #980 from lucasnogueira/replace_pluralize
Replace pluralize calls
2016-06-09 16:39:34 +01:00
Lucas Nogueira
63b8788c80 Change hash syntax 2016-06-09 11:57:56 -03:00
Daniel O'Connor
faa3beddbc Upgrade gibbon 2016-06-10 00:17:28 +09:30
Lucas Nogueira
5dbd5bc1d2 Correct minor typos 2016-06-09 08:21:28 -03:00
Lucas Nogueira
b8b0d98e07 Update the contributors list 2016-06-08 22:06:26 -03:00
Lucas Nogueira
b911ebfd07 Replace pluralize calls 2016-06-08 22:03:40 -03:00
Lucas Nogueira
1ca515bd4e Add missing activerecord model to locales 2016-06-08 21:56:29 -03:00
Lucas Nogueira
905710b6e9 Helper for plural localization 2016-06-08 21:55:33 -03:00
Mackenzie
12e0f674bc Merge pull request #977 from pozorvlak/fix_devise_warnings
Replace deprecated Devise `for` method with `permit`
2016-06-08 13:14:05 -04:00
Mackenzie
18739c2a24 Merge pull request #974 from pozorvlak/remove_vendor_dir
Remove vendor directory
2016-06-08 11:12:14 -04:00
pozorvlak
f3dc2ff7e5 Replace deprecated Devise for method with permit
This should eliminate the screens-ful of deprecation warnings when
running the test suite.
2016-06-08 15:00:05 +00:00
pozorvlak
e6209a5906 Remove "show" methods that just do the default
We can just fall back to the default implementation for these.
2016-06-08 15:58:45 +01:00
Mackenzie
dbf64a4e90 Merge pull request #975 from Growstuff/revert-972-show_concern
Revert "Show concern"
2016-06-08 09:26:58 -04:00
pozorvlak
a8961c3466 Revert "Show concern" 2016-06-08 12:58:32 +01:00
pozorvlak
6931952688 Whitespace fixes 2016-06-07 17:43:36 +00:00
pozorvlak
936aa17ecc Remove references to vendor directory
This consisted of instructions to various code-quality tools to
ignore it.
2016-06-07 17:43:36 +00:00
pozorvlak
f3d7420b8a Remove vendor directory
We no longer need it, since we're now getting the functionality we
needed from upstream gems.
2016-06-07 17:43:35 +00:00
pozorvlak
e419acea6e Install BogusPayPalGateway gem
We were maintaining a vendor fork of active_merchant because they
refused to merge this feature in; it's now been released as a
separate gem.
2016-06-07 17:43:35 +00:00
pozorvlak
95ae15b780 Merge pull request #972 from maco/show_concern
Show concern
2016-06-07 16:22:17 +01:00
Mackenzie Morgan
ed468e79fc Merge branch 'dev' of gitmaco:Growstuff/growstuff into show_concern 2016-06-07 09:57:47 -04:00
Daniel O'Connor
130565af75 Merge pull request #969 from maco/code_climate_token
add Code Climate token to Travis config
2016-06-07 09:01:27 +09:30
Daniel O'Connor
ad8f360336 Merge pull request #970 from maco/codeclimate_exclude_vendor
exclude vendor gems from code climate
2016-06-07 09:01:05 +09:30
Daniel O'Connor
15775403fd Merge pull request #971 from maco/readme_email
info@ email exists again
2016-06-07 09:00:38 +09:30
Mackenzie Morgan
e1b83c32af info@ email exists again 2016-06-06 13:27:13 -04:00
Mackenzie Morgan
3fc7c65247 exclude vendor gems from code climate 2016-06-06 13:14:01 -04:00
Mackenzie Morgan
c8d1239b79 add Code Climate token to Travis config 2016-06-06 09:40:30 -04:00
Cesy
7885257fae Merge pull request #943 from CloCkWeRX/adjust_helper
Deal with .nil quantity of a seed in rendering helper
2016-06-04 12:41:03 +01:00
Daniel O'Connor
a8d22709e6 Add explict test coverage of the helper with nil seeds (page level tests already cover this rendering on crop detail in general) 2016-06-04 20:51:20 +09:30
pozorvlak
31b7b45ae3 Merge pull request #966 from cesy/readme
Updating readme with current wiki status and Gitter link
2016-06-03 14:34:35 +01:00
Cesy Avon
681798b582 Updating readme with current wiki status and Gitter link 2016-06-03 13:12:19 +00:00
Cesy
f05ea56179 Merge pull request #965 from dv2/dev
Add test coverage for GardensHelper
2016-06-03 14:03:07 +01:00
DV Dasari
ed4269ea4c fixing grammar in test descriptions 2016-06-03 07:54:24 -05:00
DV Dasari
085fcc958e Add test coverage for GardensHelper 2016-06-02 22:22:14 -05:00
pozorvlak
8f33fe3595 Merge pull request #960 from CloCkWeRX/update_various_gems
Update various gems
2016-06-02 18:18:12 +01:00
pozorvlak
980a7d79d3 Merge pull request #963 from CloCkWeRX/add_better_opengraph_squashed
Various bugfixes for facebook/opengraph
2016-06-02 17:58:05 +01:00
pozorvlak
9c5c07e087 Merge pull request #948 from cesy/issue875
Fix #875 edited date on comments on homepage
2016-06-02 17:41:59 +01:00
Daniel O'Connor
faaf07cad8 Render the full size image, as facebook doesn't like smaller thumbnails 2016-06-03 01:58:34 +09:30
Daniel O'Connor
0e83a230b9 Helps not to render excess info 2016-06-03 01:54:26 +09:30
Daniel O'Connor
c278b36858 Up the various opengraph images to 200x200 2016-06-03 01:45:43 +09:30
pozorvlak
0805f86b86 Merge pull request #961 from cesy/issue476
Issue 476 edited by date on comments and posts
2016-06-02 16:53:44 +01:00
pozorvlak
aad88f1da6 Merge pull request #962 from CloCkWeRX/add_better_opengraph_squashed
Add better opengraph behaviour, fix facebook share thumbnail size
2016-06-02 16:52:13 +01:00
Daniel O'Connor
7550bc860f #816 Add better opengraph behaviour, fix facebook share thumbnail size 2016-06-03 01:01:03 +09:30
Cesy Avon
fc38e1edea Issue #476 test update 2016-06-02 14:58:10 +00:00
Daniel O'Connor
88a66a705b Update devise to 4.1.X and unpin 2016-06-03 00:23:58 +09:30
Daniel O'Connor
f77fd00931 Remove version pin for rspec-rails 2016-06-03 00:19:49 +09:30
Daniel O'Connor
b5c030905a Upgrade to geocoder current (we shouldn't be affected by the deprecations in 1.2.X or 1.3.X) 2016-06-03 00:16:00 +09:30
Daniel O'Connor
2844e13298 Upgrade factory_girl_rails, factory_girl 2016-06-03 00:10:25 +09:30
Cesy Avon
3e4dc1f9e3 Issue #875 typo causing test error 2016-06-02 14:39:56 +00:00
Cesy Avon
259c1e1731 Fix #476 show edited and posted date on posts and comments 2016-06-02 14:37:33 +00:00
Daniel O'Connor
870aa674b0 Upgrade autoprefixer-rails to current 2016-06-03 00:07:28 +09:30
Daniel O'Connor
b1ab319bf7 Update mime-types-data to current 2016-06-03 00:05:46 +09:30
Daniel O'Connor
857422719a Upgrade byebug to current 2016-06-03 00:04:09 +09:30
Daniel O'Connor
235314bc13 Upgrade js-routes to current 2016-06-03 00:03:48 +09:30
Daniel O'Connor
ac1cd88ae1 Upgrade kaminari to current 2016-06-03 00:01:38 +09:30
Daniel O'Connor
f93ea3c0a1 Upgrade httparty to current 2016-06-03 00:00:08 +09:30
Cesy Avon
0075040aab Fix #875 edited date on comments on homepage 2016-06-02 13:56:03 +00:00
Cesy
f9d51e623c Merge pull request #959 from pozorvlak/remove_capfile
Remove the Capistrano configuration file
2016-06-02 14:13:46 +01:00
Miles Gould
dcd36dcd67 Remove the Capistrano configuration file
Finishes work started in 93e468876d.
2016-06-02 13:45:53 +01:00
Cesy
608a921fce Merge pull request #956 from CloCkWeRX/upgrade_devise4
Upgrade to devise 4.0.*
2016-06-02 10:18:29 +01:00
pozorvlak
4bedf1e6ac Merge pull request #955 from CloCkWeRX/upgrade_geocoder
Swap to geocoder 1.1.9
2016-06-02 09:49:04 +01:00
pozorvlak
ac14c310f6 Merge pull request #954 from CloCkWeRX/ruby_231
Bump to Ruby 2.3.1
2016-06-02 09:48:20 +01:00
Daniel O'Connor
f979da315a Explicitly swap from config.email_regexp = /\A[^@\s]+@([^@\s]+\.)+[^@\W]+\z/
to the new default
2016-06-02 13:50:25 +09:30
Daniel O'Connor
a74ef7de6b Upgrade to devise 4.0.3 2016-06-02 13:49:13 +09:30
Daniel O'Connor
10064121a6 #953 Swap to geocoder 1.1.9; which is the release just after what we had previously pinned 2016-06-02 13:30:42 +09:30
Daniel O'Connor
f8a1ef6066 #952 Try ruby 2.3.1 2016-06-02 13:14:10 +09:30
Daniel O'Connor
40d7b11d90 #952 Try ruby 2.3.1 2016-06-02 13:13:52 +09:30
Mackenzie Morgan
1600dd9e0b Merge branch 'dev' of gitmaco:Growstuff/growstuff into add_bootstrap_flashes 2016-06-01 23:37:25 -04:00
pozorvlak
fbf5164eca Merge pull request #937 from dv2/dev
Add test coverage for Seeds Helper
2016-06-01 16:33:38 +01:00
DV Dasari
21d86a8c2d improve the test descriptions to be more readable 2016-06-01 09:46:22 -05:00
DV Dasari
848c7e117b Add test coverage for Seeds Helper 2016-06-01 09:46:22 -05:00
Cesy
369868672b Merge pull request #942 from pozorvlak/fix_coverage_calculations
Fix coverage calculations
2016-06-01 15:41:42 +01:00
Daniel O'Connor
321f3517a7 #920 Deal with .nil quantity of a seed in rendering helper 2016-06-01 23:26:43 +09:30
Miles Gould
6dd7ec9f95 Fix coverage calculations
SimpleCov was reporting 0% coverage for any files loaded before
`SimpleCov.start` was called, even if they were fully tested. This patch
loads the application *after* starting SimpleCov, leading to more
accurate coverage figures.
2016-06-01 14:54:13 +01:00
Cesy
dc00878ff9 Merge pull request #938 from Growstuff/dev
Release 11
2016-06-01 14:13:42 +01:00
Mackenzie Morgan
90f444dc1a Merge branch 'dev' of gitmaco:Growstuff/growstuff into add_bootstrap_flashes 2016-05-31 10:50:56 -04:00
Miles Gould
4fa2e273aa Merge remote-tracking branch 'origin/pr/933' into dev 2016-05-31 15:48:17 +01:00
pozorvlak
df92e0574a Merge pull request #934 from dv2/dev
Align links properly on "Forgot password page", "Resend confirmation" and "Resend unlock" pages
2016-05-31 15:46:27 +01:00
DV Dasari
e2053e2f8b adding me to CONTRIBUTORS.md 2016-05-31 07:33:40 -05:00
Eric Tillberg
31f0052b9d added to contributors list 2016-05-31 06:49:17 -04:00
pozorvlak
b6169778fd Merge pull request #932 from CloCkWeRX/location-not-set
Add a location not set layout (lets try this again!)
2016-05-31 11:41:11 +01:00
Mackenzie Morgan
32b98a7e40 Add support for Bootstrap alert types
* All alerts are currently shoved into either red (error) or green (success)
* Add support for yellow (warning) and blue (info) alert types

Solution from this Stack Overflow: http://stackoverflow.com/questions/31094771/rails-bootstrap-haml-how-to-convert-this-code-to-display-flash-messages-to
2016-05-30 21:48:11 -04:00
Daniel O'Connor
5111c2a96b Add sr-only text 2016-05-31 09:43:53 +09:30
Eric Tillberg
2ac901c891 feature test for issue 910 2016-05-30 09:06:09 -04:00
Mackenzie
ff4466951c Merge pull request #935 from CloCkWeRX/remove_crowdfunding
Remove crowdfunding code
2016-05-29 23:27:22 -04:00
Daniel O'Connor
8f05e254a2 Remove crowdfunding code 2016-05-30 10:06:51 +09:30
DV Dasari
5122903139 align links on "Resend unlock instructions" page 2016-05-29 18:25:01 -05:00
DV Dasari
1344f776e4 align devise shared links properly on "Resend confirmation instructions" page 2016-05-29 18:23:57 -05:00
DV Dasari
f33367ebac align devise shared links properly on "Forgot your password" page 2016-05-29 18:19:15 -05:00
Eric Tillberg
3ac42deae5 crop approval flash alert for wranglers upon sign in 2016-05-29 16:13:21 -04:00
Daniel O'Connor
3d04e7c125 Add list-inline to ensure the sidebar never conflicts with other content 2016-05-28 09:30:54 +09:30
Daniel O'Connor
fa77f11177 Based on MIT licenced icon-globe (http://fontawesome.io/3.2.1/icon/globe/) 2016-05-28 09:26:00 +09:30
pozorvlak
45c8767234 Merge pull request #922 from maco/bug-#848
Swap over to having "(Optional)" (or translation) after optional form…
2016-05-27 17:41:42 +01:00
Mackenzie Morgan
13dc87f368 Optional field improvements
* Added custom matcher `have_optional(field id name goes here)`
* Fix partial
* Add tests
2016-05-27 11:26:36 -04:00
Mackenzie Morgan
fc0116182f Merge branch 'dev' of gitmaco:Growstuff/growstuff into bug-#848 2016-05-27 11:24:37 -04:00
Mackenzie
bbe9f3f1db Merge pull request #927 from pozorvlak/delete_puts_in_spec
Remove warnings and debugging puts from rspec output
2016-05-27 11:21:52 -04:00
Miles Gould
1009570102 Check href attribute of links in planting reminder
To check the target of a link, you need to pass it to `has_link` as an
`href` keyword argument. We were passing it as a positional argument,
which meant that

 - it was ignored, weakening the tests
 - the output of rspec filled up with annoying warnings.

Fixes #928.
2016-05-27 15:46:21 +01:00
Mackenzie Morgan
47f42d0ffa Merge branch 'dev' of gitmaco:Growstuff/growstuff into bug-#848 2016-05-27 10:22:35 -04:00
Miles Gould
23d21be73f Delete debugging puts statement from spec
Fixes the "rspec output includes an HTML page dump" issue noted at
2089866756 (diff-6464240396bc745d7e89a408c200fd3aR15)
2016-05-27 14:04:30 +01:00
pozorvlak
25f8d2ca44 Merge pull request #924 from maco/capybara-tools
Add capybara-screenshot to assist with feature testing
2016-05-27 13:18:26 +01:00
pozorvlak
58d91ec0b0 Merge pull request #923 from maco/bug-#854
Display one line of description in harvest card, then go to ellipsis …
2016-05-27 12:17:10 +01:00
pozorvlak
85cc9868cb Merge pull request #925 from maco/bug-#906
Capture originalText from the button that's been clicked, not from…
2016-05-27 11:24:08 +01:00
Mackenzie Morgan
75631da398 Set filename of screenshot to test name 2016-05-27 00:21:02 -04:00
Mackenzie Morgan
03c74dae03 Capture originalText from the button that's been clicked, not from the array of all possible date-picker buttons.
Fixes #906
2016-05-26 23:55:49 -04:00
Mackenzie Morgan
2089866756 Display one line of description in harvest card, then go to ellipsis and put read more on next line
Fixes #854
2016-05-26 23:08:23 -04:00
Mackenzie Morgan
8d982c7e3e Add capybara-screenshot to assist with feature testing 2016-05-26 22:39:58 -04:00
Mackenzie Morgan
079cecc529 Swap over to having "(Optional)" (or translation) after optional form elements rather than using placeholder text
Fixes #848
2016-05-26 16:53:46 -04:00
pozorvlak
b0d90f6fd5 Merge pull request #921 from maco/bug-#876
Use standardized & translateable strings for the photo show page
2016-05-26 17:50:12 +01:00
Mackenzie Morgan
58f4ae32d0 test update 2016-05-26 12:28:58 -04:00
Mackenzie Morgan
dd0373a3ee Use standardized & translateable strings for the photo show page
Fixes #876
2016-05-26 11:51:46 -04:00
pozorvlak
170dca7086 Merge pull request #918 from maco/bug-#855
Stop hard-coding strings for pagination
2016-05-26 13:00:33 +01:00
pozorvlak
c930f04b5a Merge pull request #905 from maco/photos
refactor photo controller create for readability
2016-05-26 12:57:29 +01:00
Cesy
f41d919ca8 Merge pull request #916 from maco/bug_873
make seed card heading link to seed page and add owner link. Fixes #873
2016-05-26 09:58:37 +01:00
Cesy
8c4583b0d3 Merge pull request #915 from maco/autocomplete_dropdown
set background color on autocomplete dropdown. Fixes #914
2016-05-26 09:57:02 +01:00
Mackenzie Morgan
972518e9fc Stop hard-coding strings for pagination
Use translation template to set singular/other strings
for .model_name

Fixes #855
2016-05-25 23:15:36 -04:00
pozorvlak
5b38fad85e Merge pull request #912 from maco/small_fixes
Fix two small things (including: make tests stop failing)
2016-05-25 23:25:47 +01:00
Mackenzie Morgan
d227601627 Add config/factory_girl.rb so that rspec doesn't fail with a confusing
'Could not find mapping for #<Member...' error
http://blog.thefrontiergroup.com.au/2011/03/reloading-factory-girl-factories-in-the-rails-3-console/
2016-05-25 17:35:57 -04:00
Mackenzie Morgan
736e45aec9 update Gemfile.lock for code climate 2016-05-25 17:35:23 -04:00
Mackenzie Morgan
11e2e86b06 make seed card heading link to seed page and add owner link. Fixes #873 2016-05-25 16:21:17 -04:00
Mackenzie Morgan
58617b5685 set background color on autocomplete dropdown. Fixes #914 2016-05-25 16:07:49 -04:00
Mackenzie Morgan
8c2aa4844f use CW's case statement idea 2016-05-25 15:15:09 -04:00
Mackenzie Morgan
8648db5518 create SimpleShow concern for models where show's json call is simple 2016-05-25 13:37:01 -04:00
Mackenzie Morgan
b5b201b6df bundle 2016-05-25 10:38:06 -04:00
Mackenzie Morgan
b601fe40b3 refactor photo controller create for readability 2016-05-24 16:59:52 -04:00
pozorvlak
d6999b2a8a Merge pull request #879 from Growstuff/code_climate
Add code climate to README
2016-05-23 19:00:26 +01:00
Mackenzie Morgan
76f152aa35 add Code Climate config file 2016-05-23 13:07:18 -04:00
pozorvlak
63f8a2c5c0 Merge pull request #897 from maco/menu_fix
darken navbar item text when it opens (and the background turns light)
2016-05-23 12:25:22 +01:00
pozorvlak
ae482ecab6 Merge pull request #802 from cesy/issue690
Issue 690 Switch on CMS and remove old files
2016-05-23 12:24:49 +01:00
pozorvlak
a8e63ab397 Merge pull request #898 from CloCkWeRX/adjust_plantings_card_ui
Improve the styling of a planting to be more like the other card-layouts
2016-05-23 12:17:47 +01:00
pozorvlak
a2717ad058 Merge pull request #900 from CloCkWeRX/clip_long_text
Clip long text in definition lists within panels
2016-05-23 12:07:32 +01:00
Daniel O'Connor
92cce5910e Improve planting card UI on mobile 2016-05-23 16:35:58 +09:30
Daniel O'Connor
ab897f05f9 Use panel-body and panel-heading more effectively 2016-05-23 16:21:13 +09:30
Daniel O'Connor
cd8ca02322 Merge remote-tracking branch 'upstream/dev' into adjust_plantings_card_ui 2016-05-23 16:17:39 +09:30
Daniel O'Connor
5104225d11 #856 Clip long text in definition lists within panels 2016-05-23 16:13:53 +09:30
Mackenzie
24d6087ea7 Merge pull request #899 from CloCkWeRX/improve_nearby_places_links
Improve nearby places links
2016-05-22 23:39:53 -04:00
Daniel O'Connor
dc9ee18e96 Update stale test expectation 2016-05-23 12:56:37 +09:30
Daniel O'Connor
b4060b7903 Update stale test expectation 2016-05-23 12:55:50 +09:30
Daniel O'Connor
884a3aad2c Check we have a location before linking to it 2016-05-23 11:51:14 +09:30
Daniel O'Connor
80f826421b Add page anchors to put you to the area you are most interested in 2016-05-23 11:41:42 +09:30
Daniel O'Connor
7872bb48e2 Fixes #872 Add more links and explain them better 2016-05-23 11:35:49 +09:30
Daniel O'Connor
7d10101c57 For a place, talk about the community as a vaguer way of explaining 'members, seeds, plantings, etc' 2016-05-23 11:31:29 +09:30
Daniel O'Connor
d9ed21ba53 Styling the show view of a planting more like the card view (though 100% card view looks funny with the crop thumbnail floating to the right) 2016-05-23 11:24:32 +09:30
Daniel O'Connor
5e8211172b Only show a heading for Notes if there are notes 2016-05-23 11:12:42 +09:30
Daniel O'Connor
24956255d7 Fix layout of view all plantings link 2016-05-23 11:03:23 +09:30
Daniel O'Connor
55380dab04 Fix style regression by moving garden content properly into the container 2016-05-23 10:58:09 +09:30
Daniel O'Connor
e7926b6f22 Improve the styling of a planting to be more like the other card-layouts 2016-05-23 10:48:49 +09:30
Mackenzie Morgan
fe7d8f73f3 darken navbar item text when it opens (and the background turns light)
Fixes #896
2016-05-22 20:49:51 -04:00
Mackenzie
47d7f001fe Merge pull request #895 from cesy/precompile
Precompile css and js with sass
2016-05-22 15:10:43 -04:00
Cesy Avon
23a6722ddb Precompile css and js with sass 2016-05-22 16:34:36 +00:00
Cesy
23e2b756fd Merge pull request #886 from pozorvlak/fix_duplicated_class_warning
Fix "duplicated key: :class" warning in HAML code
2016-05-22 17:21:47 +01:00
pozorvlak
8bea05a77b Merge pull request #803 from cesy/issue734bootstrapaccessibility
Bootstrap accessibility
2016-05-22 17:19:55 +01:00
Cesy
d5ac4bac48 Merge pull request #894 from pozorvlak/upgradegibbon
Fix mailchimp newsletter subscriptions
2016-05-22 17:13:59 +01:00
pozorvlak
1af9b2e6db Merge pull request #892 from cesy/databaseconfig
Moving database.yml and adding gitignore
2016-05-22 17:09:35 +01:00
Cesy
daa3c08706 Fixing broken links to pages that are now in CMS 2016-05-22 16:05:07 +00:00
Cesy
29102e3b52 Cleaning up more tests 2016-05-22 16:05:07 +00:00
Cesy
8c0fc54344 Sorting tests related to moving to CMS 2016-05-22 16:04:39 +00:00
Cesy
f5b20c2f32 About is empty, policy won't work without the routes 2016-05-22 16:01:40 +00:00
Cesy
79734ff603 Fix #690 Removing old static files that are now in CMS 2016-05-22 16:01:40 +00:00
twconquest
397bfd8bca Start removing static page references. 2016-05-22 16:01:40 +00:00
Miles Gould
52dc111210 Merge branch 'dev' into upgradegibbon 2016-05-22 16:57:38 +01:00
Cesy Avon
da1375e34d Making database.yml locally editable 2016-05-22 15:50:22 +00:00
Miles Gould
79db3c4c1d Fix "duplicated key: :class" warning in HAML code
The warning was

    app/views/harvests/_form.html.haml:32: warning: duplicated key at line 32 ignored: :class

We were specifying two `:class` attributes on an HTML tag; I've combined
them into one.
2016-05-19 14:40:24 +01:00
Mackenzie
925027f7f0 add code climate test reporter 2016-05-17 14:02:42 -04:00
Mackenzie
1442a9106c add code climate / travis gem 2016-05-17 13:58:55 -04:00
Mackenzie
fafb421a51 Add code climate to README
Our code climate score is *abysmal*, but now that I've been using it in my job for a few months, I have some ideas how to improve it. It's all about clean code (check out the book of that name from your local library) and readability. So let's add the grade to the README, and I'll figure out how to set it up so that Code Climate is run on pull requests automatically (telling us whether things are going to get better or worse with every PR).
2016-05-17 13:47:33 -04:00
twconquest
b2f3755196 Additional config fix to point to correct list id 2015-09-09 19:48:35 +00:00
twconquest
2882e3d1a5 Correct Gibbon list id to point to correct list 2015-08-21 19:29:03 +00:00
Cesy
e8266480e5 Adding bootstrap-accessibility plugin 2015-08-12 14:17:41 +00:00
510 changed files with 1466 additions and 53751 deletions

36
.codeclimate.yml Normal file
View File

@@ -0,0 +1,36 @@
engines:
rubocop:
enabled: true
scss-lint:
enabled: true
shellcheck:
enabled: true
eslint:
enabled: true
coffeelint:
enabled: true
brakeman:
enabled: true
bundler-audit:
enabled: true
duplication:
enabled: true
config:
languages:
- ruby
- javascript
fixme:
enabled: true
ratings:
paths:
- "**.rb"
- "**.js"
- "**.coffee"
- "**.sass"
- "**.haml"
- Gemfile.lock
exclude_paths:
- config/
- db/
- spec/
- public/

2
.gitignore vendored
View File

@@ -8,10 +8,10 @@ coverage
*~
*.DS_Store
config/application.yml
config/database.yml
credentials*.sh
Pathogen:
custom_plan.rb
zeus.json
.bundle
config/application.yml
.idea/**

View File

@@ -1 +1 @@
2.2.4
2.3.1

View File

@@ -8,10 +8,12 @@ env:
global:
secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
rvm:
- 2.2.4
- 2.3.1
before_script:
- psql -c 'create database growstuff_test;' -U postgres
script:
- script/gemfile_check
- bundle exec script/check_contributors_md
- bundle exec rake db:migrate --trace
- bundle exec rspec spec/
services:
@@ -34,4 +36,6 @@ deploy:
- restart
after_deploy:
- bundle exec script/heroku_maintenance.rb off
addons:
code_climate:
repo_token: 462e015bbdaabfb20910fc07f2fea253410ecb131444e00f97dbf32dc6789ca6

View File

@@ -66,3 +66,7 @@ submit the change with your pull request.
- Anthony Atkinson / [sha1sum](https://github.com/sha1sum)
- Terence Conquest / [twconquest](https://github.com/twconquest)
- Daniel O'Connor / [CloCkWeRX](https://github.com/CloCkWeRX)
- DV Dasari / [dv2](https://github.com/dv2)
- Eric Tillberg / [Thrillberg](https://github.com/Thrillberg)
- Lucas Nogueira / [lucasnogueira](https://github.com/lucasnogueira)
- Charley Lewittes / [ctlewitt](https://github.com/ctlewitt)

View File

@@ -1,4 +0,0 @@
load 'deploy'
# Uncomment if you are using Rails' asset pipeline
# load 'deploy/assets'
load 'config/deploy' # remove this line to skip loading any of the default tasks

26
Gemfile
View File

@@ -1,8 +1,8 @@
source 'https://rubygems.org'
ruby '2.2.4'
ruby '2.3.1'
gem 'rails', '~> 4.1.11'
gem 'rails', '~> 4.2.0'
gem 'bundler', '>=1.1.5'
@@ -36,13 +36,8 @@ gem 'comfortable_mexican_sofa', '~> 1.12.0' # content management system
gem 'kaminari' # pagination
gem 'bootstrap-kaminari-views' # bootstrap views for kaminari
# vendored activemerchant for testing- needed for bogus paypal
# gateway monkeypatch
gem 'activemerchant', '1.33.0',
:path => 'vendor/gems/activemerchant-1.33.0',
:require => 'active_merchant'
gem 'active_utils', '1.0.5',
:path => 'vendor/gems/active_utils-1.0.5'
gem 'activemerchant'
gem 'active_utils'
# Markdown formatting for updates etc
gem 'bluecloth'
@@ -51,7 +46,7 @@ gem 'bluecloth'
gem 'will_paginate', '~> 3.0'
# user signup/login/etc
gem 'devise', '~> 3.5.0'
gem 'devise', '>= 4.0.0'
# nicely formatted URLs
gem 'friendly_id', '~> 5.0.4'
@@ -60,9 +55,7 @@ gem 'friendly_id', '~> 5.0.4'
gem 'gravatar-ultimate'
# For geolocation
gem 'geocoder',
:git => 'https://github.com/alexreisner/geocoder.git',
:ref => '104d46'
gem 'geocoder'
# For easy calendar selection
gem 'bootstrap-datepicker-rails'
@@ -103,18 +96,21 @@ end
group :development, :test do
gem 'haml-rails' # HTML templating language
gem 'rspec-rails', '~> 3.4.0' # unit testing framework
gem 'rspec-rails' # unit testing framework
gem 'rspec-activemodel-mocks'
gem 'byebug' # debugging
gem 'database_cleaner', '~> 1.5.0'
gem 'webrat' # provides HTML matchers for view tests
gem 'factory_girl_rails', '~> 4.5.0' # for creating test data
gem 'factory_girl_rails' # for creating test data
gem 'coveralls', require: false # coverage analysis
gem 'capybara' # integration tests
gem 'capybara-email' # integration tests for email
gem 'capybara-screenshot' # for test debugging
gem 'poltergeist', '~> 1.6' # for headless JS testing
gem 'i18n-tasks' # adds tests for finding missing and unused translations
gem 'selenium-webdriver'
gem "codeclimate-test-reporter", group: :test, require: nil
gem "active_merchant-paypal-bogus-gateway"
end
group :travis do

View File

@@ -1,57 +1,57 @@
GIT
remote: https://github.com/alexreisner/geocoder.git
revision: 104d466ba7097b7dce5ba19f8e4091b7f69ccdf6
ref: 104d46
specs:
geocoder (1.1.8)
PATH
remote: vendor/gems/active_utils-1.0.5
specs:
active_utils (1.0.5)
activesupport (>= 2.3.11)
i18n
PATH
remote: vendor/gems/activemerchant-1.33.0
specs:
activemerchant (1.33.0)
GEM
remote: https://rubygems.org/
specs:
actionmailer (4.1.15)
actionpack (= 4.1.15)
actionview (= 4.1.15)
actionmailer (4.2.6)
actionpack (= 4.2.6)
actionview (= 4.2.6)
activejob (= 4.2.6)
mail (~> 2.5, >= 2.5.4)
actionpack (4.1.15)
actionview (= 4.1.15)
activesupport (= 4.1.15)
rack (~> 1.5.2)
rails-dom-testing (~> 1.0, >= 1.0.5)
actionpack (4.2.6)
actionview (= 4.2.6)
activesupport (= 4.2.6)
rack (~> 1.6)
rack-test (~> 0.6.2)
actionview (4.1.15)
activesupport (= 4.1.15)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (4.2.6)
activesupport (= 4.2.6)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
active_link_to (1.0.3)
actionpack
activemodel (4.1.15)
activesupport (= 4.1.15)
active_merchant-paypal-bogus-gateway (0.1.0)
activemerchant
active_utils (3.2.0)
activesupport (>= 3.2)
i18n
activejob (4.2.6)
activesupport (= 4.2.6)
globalid (>= 0.3.0)
activemerchant (1.59.0)
activesupport (>= 3.2.14, < 5.1)
builder (>= 2.1.2, < 4.0.0)
i18n (>= 0.6.9)
nokogiri (~> 1.4)
activemodel (4.2.6)
activesupport (= 4.2.6)
builder (~> 3.1)
activerecord (4.1.15)
activemodel (= 4.1.15)
activesupport (= 4.1.15)
arel (~> 5.0.0)
activesupport (4.1.15)
i18n (~> 0.6, >= 0.6.9)
activerecord (4.2.6)
activemodel (= 4.2.6)
activesupport (= 4.2.6)
arel (~> 6.0)
activesupport (4.2.6)
i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
thread_safe (~> 0.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.4.0)
arel (5.0.1.20140414130214)
ast (2.2.0)
autoprefixer-rails (6.3.6.1)
arel (6.0.3)
ast (2.3.0)
autoprefixer-rails (6.3.6.2)
execjs
bcrypt (3.1.11)
better_errors (2.1.1)
@@ -72,8 +72,8 @@ GEM
sass (>= 3.3.4)
bootstrap_form (2.3.0)
builder (3.2.2)
byebug (9.0.4)
cancancan (1.14.0)
byebug (9.0.5)
cancancan (1.15.0)
capybara (2.7.1)
addressable
mime-types (>= 1.16)
@@ -84,6 +84,9 @@ GEM
capybara-email (2.5.0)
capybara (~> 2.4)
mail
capybara-screenshot (1.0.13)
capybara (>= 1.0, < 3)
launchy
childprocess (0.5.9)
ffi (~> 1.0, >= 1.0.11)
climate_control (0.0.3)
@@ -91,6 +94,8 @@ GEM
cliver (0.3.2)
cocaine (0.5.8)
climate_control (>= 0.0.3, < 1.0)
codeclimate-test-reporter (0.6.0)
simplecov (>= 0.7.1, < 1.0.0)
codemirror-rails (5.11)
railties (>= 3.0, < 5)
coderay (1.1.1)
@@ -128,12 +133,11 @@ GEM
dalli (2.7.6)
database_cleaner (1.5.3)
debug_inspector (0.0.2)
devise (3.5.10)
devise (4.1.1)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 3.2.6, < 5)
railties (>= 4.1.0, < 5.1)
responders
thread_safe (~> 0.1)
warden (~> 1.2.3)
diff-lcs (1.2.5)
docile (1.1.5)
@@ -141,41 +145,44 @@ GEM
json
thread
thread_safe
elasticsearch (1.0.17)
elasticsearch-api (= 1.0.17)
elasticsearch-transport (= 1.0.17)
elasticsearch-api (1.0.17)
elasticsearch (1.0.18)
elasticsearch-api (= 1.0.18)
elasticsearch-transport (= 1.0.18)
elasticsearch-api (1.0.18)
multi_json
elasticsearch-model (0.1.9)
activesupport (> 3)
elasticsearch (> 0.4)
hashie
elasticsearch-rails (0.1.9)
elasticsearch-transport (1.0.17)
elasticsearch-transport (1.0.18)
faraday
multi_json
erubis (2.7.0)
excon (0.49.0)
excon (0.50.1)
execjs (2.7.0)
factory_girl (4.5.0)
factory_girl (4.7.0)
activesupport (>= 3.0.0)
factory_girl_rails (4.5.0)
factory_girl (~> 4.5.0)
factory_girl_rails (4.7.0)
factory_girl (~> 4.7.0)
railties (>= 3.0.0)
faraday (0.9.2)
multipart-post (>= 1.2, < 3)
ffi (1.9.10)
figaro (1.1.1)
thor (~> 0.14)
flickraw (0.9.8)
flickraw (0.9.9)
font-awesome-sass (4.6.2)
sass (>= 3.2)
formatador (0.2.5)
friendly_id (5.0.5)
activerecord (>= 4.0.0)
gibbon (1.2.0)
geocoder (1.3.7)
gibbon (1.2.1)
httparty
multi_json (>= 1.9.0)
globalid (0.3.6)
activesupport (>= 4.1.0)
gravatar-ultimate (2.0.0)
activesupport (>= 2.3.14)
rack
@@ -189,7 +196,7 @@ GEM
shellany (~> 0.0)
thor (>= 0.18.1)
guard-compat (1.2.1)
guard-rspec (4.6.5)
guard-rspec (4.7.2)
guard (~> 2.1)
guard-compat (~> 1.1)
rspec (>= 2.99.0, < 4.0)
@@ -211,7 +218,7 @@ GEM
haml (~> 4.0.0)
nokogiri (~> 1.6.0)
ruby_parser (~> 3.5)
httparty (0.13.3)
httparty (0.13.7)
json (~> 1.8)
multi_xml (>= 0.5.2)
i18n (0.7.0)
@@ -225,16 +232,17 @@ GEM
parser (>= 2.2.3.0)
term-ansicolor (>= 1.3.2)
terminal-table (>= 1.5.1)
jquery-rails (3.1.4)
railties (>= 3.0, < 5.0)
jquery-rails (4.1.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.2.5)
js-routes (1.2.6)
railties (>= 3.2)
sprockets-rails
json (1.8.3)
kaminari (0.16.3)
kaminari (0.17.0)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
kgio (2.10.0)
@@ -250,24 +258,27 @@ GEM
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
loofah (2.0.3)
nokogiri (>= 1.5.9)
lumberjack (1.0.10)
mail (2.6.4)
mime-types (>= 1.16, < 4)
memcachier (0.0.2)
method_source (0.8.2)
mime-types (3.0)
mime-types (3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2016.0221)
mime-types-data (3.2016.0521)
mimemagic (0.3.0)
mini_portile2 (2.0.0)
mini_portile2 (2.1.0)
minitest (5.9.0)
multi_json (1.11.3)
multi_xml (0.5.5)
multipart-post (2.0.0)
nenv (0.3.0)
newrelic_rpm (3.15.2.317)
nokogiri (1.6.7.2)
mini_portile2 (~> 2.0.0.rc2)
newrelic_rpm (3.16.0.318)
nokogiri (1.6.8)
mini_portile2 (~> 2.1.0)
pkg-config (~> 1.1.7)
notiffany (0.1.0)
nenv (~> 0.1)
shellany (~> 0.0)
@@ -291,15 +302,15 @@ GEM
cocaine (~> 0.5.5)
mime-types
mimemagic (= 0.3.0)
parser (2.3.1.0)
parser (2.3.1.2)
ast (~> 2.2)
pg (0.18.4)
pkg-config (1.1.7)
plupload-rails (1.2.1)
rails (>= 3.1)
poltergeist (1.9.0)
poltergeist (1.10.0)
capybara (~> 2.1)
cliver (~> 0.3.1)
multi_json (~> 1.0)
websocket-driver (>= 0.2.0)
pry (0.10.3)
coderay (~> 1.1.0)
@@ -307,19 +318,28 @@ GEM
slop (~> 3.4)
quiet_assets (1.1.0)
railties (>= 3.1, < 5.0)
rack (1.5.5)
rack (1.6.4)
rack-test (0.6.3)
rack (>= 1.0)
rails (4.1.15)
actionmailer (= 4.1.15)
actionpack (= 4.1.15)
actionview (= 4.1.15)
activemodel (= 4.1.15)
activerecord (= 4.1.15)
activesupport (= 4.1.15)
rails (4.2.6)
actionmailer (= 4.2.6)
actionpack (= 4.2.6)
actionview (= 4.2.6)
activejob (= 4.2.6)
activemodel (= 4.2.6)
activerecord (= 4.2.6)
activesupport (= 4.2.6)
bundler (>= 1.3.0, < 2.0)
railties (= 4.1.15)
sprockets-rails (~> 2.0)
railties (= 4.2.6)
sprockets-rails
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
rails-dom-testing (1.0.7)
activesupport (>= 4.2.0.beta, < 5.0)
nokogiri (~> 1.6.0)
rails-deprecated_sanitizer (>= 1.0.1)
rails-html-sanitizer (1.0.3)
loofah (~> 2.0)
rails-i18n (4.0.8)
i18n (~> 0.7)
railties (~> 4.0)
@@ -328,18 +348,18 @@ GEM
rails_stdout_logging
rails_serve_static_assets (0.0.5)
rails_stdout_logging (0.0.5)
railties (4.1.15)
actionpack (= 4.1.15)
activesupport (= 4.1.15)
railties (4.2.6)
actionpack (= 4.2.6)
activesupport (= 4.2.6)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
raindrops (0.16.0)
rake (11.1.2)
rake (11.2.2)
rb-fsevent (0.9.7)
rb-inotify (0.9.7)
ffi (>= 0.5.0)
responders (1.1.2)
railties (>= 3.2, < 4.2)
responders (2.2.0)
railties (>= 4.2.0, < 5.1)
rspec (3.4.0)
rspec-core (~> 3.4.0)
rspec-expectations (~> 3.4.0)
@@ -371,13 +391,13 @@ GEM
sexp_processor (~> 4.1)
rubyzip (1.2.0)
sass (3.4.22)
sass-rails (5.0.4)
railties (>= 4.0.0, < 5.0)
sass-rails (5.0.5)
railties (>= 4.0.0, < 6)
sass (~> 3.1)
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (>= 1.1, < 3)
selenium-webdriver (2.53.0)
selenium-webdriver (2.53.4)
childprocess (~> 0.5)
rubyzip (~> 1.0)
websocket (~> 1.0)
@@ -389,20 +409,20 @@ GEM
simplecov-html (~> 0.10.0)
simplecov-html (0.10.0)
slop (3.6.0)
sprockets (3.6.0)
sprockets (3.6.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (2.3.3)
actionpack (>= 3.0)
activesupport (>= 3.0)
sprockets (>= 2.8, < 4.0)
sprockets-rails (3.1.1)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
term-ansicolor (1.3.2)
tins (~> 1.0)
terminal-table (1.5.2)
terminal-table (1.6.0)
thor (0.19.1)
thread (0.2.2)
thread_safe (0.3.5)
tilt (2.0.4)
tilt (2.0.5)
tins (1.6.0)
tzinfo (1.2.2)
thread_safe (~> 0.1)
@@ -430,8 +450,9 @@ PLATFORMS
ruby
DEPENDENCIES
active_utils (= 1.0.5)!
activemerchant (= 1.33.0)!
active_merchant-paypal-bogus-gateway
active_utils
activemerchant
better_errors
binding_of_caller
bluecloth
@@ -444,21 +465,23 @@ DEPENDENCIES
cancancan (~> 1.9)
capybara
capybara-email
capybara-screenshot
codeclimate-test-reporter
coffee-rails (~> 4.1.0)
comfortable_mexican_sofa (~> 1.12.0)
coveralls
csv_shaper
dalli
database_cleaner (~> 1.5.0)
devise (~> 3.5.0)
devise (>= 4.0.0)
elasticsearch-model
elasticsearch-rails
factory_girl_rails (~> 4.5.0)
factory_girl_rails
figaro
flickraw
font-awesome-sass
friendly_id (~> 5.0.4)
geocoder!
geocoder
gibbon (~> 1.2.0)
gravatar-ultimate
guard
@@ -483,11 +506,11 @@ DEPENDENCIES
poltergeist (~> 1.6)
pry
quiet_assets
rails (~> 4.1.11)
rails (~> 4.2.0)
rails_12factor
rake (>= 10.0.0)
rspec-activemodel-mocks
rspec-rails (~> 3.4.0)
rspec-rails
ruby-units
sass-rails (~> 5.0.4)
selenium-webdriver
@@ -497,7 +520,7 @@ DEPENDENCIES
will_paginate (~> 3.0)
RUBY VERSION
ruby 2.1.8p440
ruby 2.3.1p112
BUNDLED WITH
1.12.4
1.12.5

View File

@@ -2,6 +2,7 @@
[![Build Status](https://travis-ci.org/Growstuff/growstuff.png)](https://travis-ci.org/Growstuff/growstuff)
[![Coverage Status](https://coveralls.io/repos/Growstuff/growstuff/badge.png)](https://coveralls.io/r/Growstuff/growstuff)
[![Code Climate](https://codeclimate.com/github/Growstuff/growstuff/badges/gpa.svg)](https://codeclimate.com/github/Growstuff/growstuff)
Welcome to the Growstuff project.
@@ -18,8 +19,9 @@ encourage participation from people of all backgrounds and skill levels.
* [Issues](http://github.com/Growstuff/growstuff/issues) (features we're
working on, known bugs, etc)
* [Discussion forums](http://wiki.growstuff.org/index.php/Discussion_forums) (mailing lists, IRC, etc)
* [Wiki](http://wiki.growstuff.org/) (general documentation)
* [Discussion forums](http://talk.growstuff.org/) (design ideas, planning releases)
* [IRC](https://webchat.freenode.net/) growstuff channel (general chat, brainstorming and troubleshooting) or [Gitter](https://gitter.im/Growstuff/growstuff)
* [Wiki](https://github.com/Growstuff/growstuff/wiki) (general documentation, etc. Help by migrating from the [old wiki](https://web.archive.org/web/*/wiki.growstuff.org))
## For coders
@@ -27,19 +29,11 @@ Growstuff is built in Ruby on Rails and also uses JavaScript for
frontend features. We welcome contributions -- see
[CONTRIBUTING](CONTRIBUTING.md) for details.
* To set up your development environment, see [Getting started](http://wiki.growstuff.org/index.php/Development/Getting_Started).
* To set up your development environment, see [Getting started](https://github.com/Growstuff/growstuff/wiki/New-contributor-guide).
* We encourage [pair programming](http://wiki.growstuff.org/index.php/Pairing), especially for newer developers. [Find a pair programming partner.](http://talk.growstuff.org/t/find-a-pair-programming-partner/13)
* Drop in to one of our [discussion forums](http://wiki.growstuff.org/index.php/Discussion_forums) to chat to other developers, get help, etc.
* Drop in to our [discussion forums](http://talk.growstuff.org/), IRC or Gitter to chat to other developers, get help, etc.
* You may also be interested in our [API](http://wiki.growstuff.org/index.php/API).
The wiki is down right now, so here's what you need to do on Mac OS X to get set up.
```
gem install bundle
gem install pg -v '0.18.4' -- --with-pg-config=/Applications/Postgres.app/Contents/Versions/latest/bin/pg_config
bundle install
```
## For designers, writers, researchers, data wranglers, and other contributors
There are heaps of ways to get involved and contribute no matter what
@@ -57,6 +51,7 @@ Here on Github, you might find these useful:
* [needs: visual design](https://github.com/Growstuff/growstuff/labels/needs:%20visual design) - tasks requiring visual/graphical design
* [needs: documentation](https://github.com/Growstuff/growstuff/labels/needs:%20documentation)
* [needs: data](https://github.com/Growstuff/growstuff/labels/needs:%20data) - tasks requiring data entry, data design, data import, or similar
* [curated:beginner](https://github.com/Growstuff/growstuff/labels/curated:%20beginner) - tasks that are ideal for beginner programmers or people new to the project
Feel free to comment on any of the issues you find there, or open up a broader conversation on [Growstuff Talk](http://talk.growstuff.org).

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -10,12 +10,11 @@ jQuery ->
href = el.attr('href')
originalText = el.text()
el.click (e) ->
e.stopPropagation()
e.preventDefault()
originalText = $(this).text()
$(this).text('Confirm without date')
$(this).bind('click.confirm', (e) ->

View File

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.btn:focus{outline:dotted 2px #000}div.active:focus{outline:dotted 1px #000}a:focus{outline:dotted 1px #000}.close:hover,.close:focus{outline:dotted 1px #000}.nav>li>a:hover,.nav>li>a:focus{outline:dotted 1px #000}.carousel-inner>.item{position:absolute;top:-999999em;display:block;-moz-transition:ease-in-out 0.6s left;-o-transition:ease-in-out 0.6s left;-webkit-transition:ease-in-out 0.6s left;transition:ease-in-out 0.6s left}.carousel-inner>.active{top:0}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{position:relative}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.alert-success{color:#2d4821}.alert-info{color:#214c62}.alert-warning{color:#6c4a00;background-color:#f9f1c6}.alert-danger{color:#d2322d}.alert-danger:hover{color:#a82824}

View File

@@ -42,7 +42,7 @@ $navbar-default-bg-highlight: $brown
$navbar-default-color: $beige
$navbar-default-link-color: darken($beige, 20%)
$navbar-default-link-hover-color: $beige
$navbar-default-link-active-color: $beige
$navbar-default-link-active-color: darken($beige,80%)
$navbar-default-brand-color: lighten($green, 20%)
// Top nav collapse threshold

View File

@@ -93,12 +93,41 @@ p.stats
padding-left: 1em
width: 15em
.planting
dl.planting-attributes
font-size: 85%
dt
text-align: left
dd
margin-left: auto
@media (min-width: $screen-md-min)
.planting-thumbnail
dl.planting-attributes
font-size: 85%
width: 100%
dt
text-align: left
width: 80px
dd
padding-left: 80px
margin-left: auto
#placesmap, #cropmap
height: 500px
#membermap
height: 250px
.location-not-set
height: 250px
width: 100%
background-image: image-url('location-not-set.en.png')
background-repeat: no-repeat
background-position: center
.member-location
font-size: small
font-style: italic
@@ -222,23 +251,10 @@ html, body
// Autosuggest
.ui-autocomplete
.ui-autocomplete
background: white
z-index: $zindex-tooltip
// Crowdfunding campaign, Sep-Oct 2014
.crowdfunding-banner
text-align: center
font-weight: bold
background-color: lighten($green, 30%)
margin-top: 0px
margin-bottom: 5px
padding: 15px
.crowdfunding-banner a
color: $brown
text-decoration: underline
.alert
a
font-weight: 800
@@ -276,6 +292,11 @@ $state-success-bg: lighten($green, 50%)
.panel-footer
height: 6em
.panel
.dl-horizontal
text-overflow: ellipsis
overflow: hidden
#gardens_panel_body
height: 20em
@@ -288,3 +309,8 @@ $state-success-bg: lighten($green, 50%)
.red
color: red
.truncate
overflow: hidden
text-overflow: ellipsis
white-space: nowrap

View File

@@ -1,2 +0,0 @@
class AboutController < ApplicationController
end

View File

@@ -13,17 +13,6 @@ class AlternateNamesController < ApplicationController
end
end
# GET /alternate_names/1
# GET /alternate_names/1.json
def show
@alternate_name = AlternateName.find(params[:id])
respond_to do |format|
format.html # show.html.haml
format.json { render json: @alternate_name }
end
end
# GET /alternate_names/new
# GET /alternate_names/new.json
def new

View File

@@ -52,7 +52,7 @@ class ApplicationController < ActionController::Base
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) do |member|
devise_parameter_sanitizer.permit(:sign_up) do |member|
member.permit(:login_name, :email, :password, :password_confirmation,
:remember_me, :login,
# terms of service
@@ -64,7 +64,7 @@ class ApplicationController < ActionController::Base
)
end
devise_parameter_sanitizer.for(:account_update) do |member|
devise_parameter_sanitizer.permit(:account_update) do |member|
member.permit(:login_name, :email, :password, :password_confirmation,
:remember_me, :login,
# terms of service

View File

@@ -14,17 +14,6 @@ class CommentsController < ApplicationController
end
end
# GET /comments/1
# GET /comments/1.json
def show
@comment = Comment.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @comment }
end
end
# GET /comments/new
# GET /comments/new.json
def new

View File

@@ -83,8 +83,16 @@ class CropsController < ApplicationController
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: { only: [:id, :login_name, :location, :latitude, :longitude] }}}
plantings: {
include: owner_structure
}
})
end
end
@@ -136,7 +144,7 @@ class CropsController < ApplicationController
end
unless current_member.has_role? :crop_wrangler
Role.crop_wranglers.each do |w|
Notifier.new_crop_request(w, @crop).deliver!
Notifier.new_crop_request(w, @crop).deliver_now!
end
end
@@ -180,8 +188,8 @@ class CropsController < ApplicationController
if previous_status == "pending"
requester = @crop.requester
new_status = @crop.approval_status
Notifier.crop_request_approved(requester, @crop).deliver! if new_status == "approved"
Notifier.crop_request_rejected(requester, @crop).deliver! if new_status == "rejected"
Notifier.crop_request_approved(requester, @crop).deliver_now! if new_status == "approved"
Notifier.crop_request_rejected(requester, @crop).deliver_now! if new_status == "rejected"
end
format.html { redirect_to @crop, notice: 'Crop was successfully updated.' }
format.json { head :no_content }

View File

@@ -27,17 +27,6 @@ class HarvestsController < ApplicationController
end
end
# GET /harvests/1
# GET /harvests/1.json
def show
@harvest = Harvest.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @harvest }
end
end
# GET /harvests/new
# GET /harvests/new.json
def new

View File

@@ -0,0 +1,6 @@
class PagesController < ApplicationController
def letsencrypt
# use your code here, not mine
render text: "y9KNck8wqkoQLnlr2RgA2TVwWtyYb4PeY_hzGNx0Tfs.dlIPqFhMDCLyQEccczY3roHZ1UWu6UqVeyb9mkRxheU"
end
end

View File

@@ -13,17 +13,6 @@ class PhotosController < ApplicationController
end
end
# GET /photos/1
# GET /photos/1.json
def show
@photo = Photo.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @photo }
end
end
# GET /photos/new
# GET /photos/new.json
def new
@@ -63,35 +52,29 @@ class PhotosController < ApplicationController
@photo.owner_id = current_member.id
@photo.set_flickr_metadata
# several models can have photos. we need to know what model and the id
# for the entry to attach the photo to
valid_models = ["planting", "harvest", "garden"]
if params[:type]
if valid_models.include?(params[:type])
if params[:id]
item = params[:type].camelcase.constantize.find_by_id(params[:id])
if item
if item.owner.id == current_member.id
# This syntax is weird, so just know that it means this:
# @photo.harvests << item unless @photo.harvests.include?(item)
# but with the correct many-to-many relationship automatically referenced
(@photo.send "#{params[:type]}s") << item unless (@photo.send "#{params[:type]}s").include?(item)
else
flash[:alert] = "You must own both the #{params[:type]} and the photo."
end
else
flash[:alert] = "Couldn't find #{params[:type]} to connect to photo."
end
else
flash[:alert] = "Missing id parameter"
end
collection = case params[:type]
when 'garden'
@photo.gardens
when 'planting'
@photo.plantings
when 'harvest'
@photo.harvests
else
nil
end
if collection && has_item_id
item = params[:type].camelcase.constantize.find_by_id(params[:id])
if item && member_owns_item(item)
collection << item unless collection.include?(item)
else
flash[:alert] = "Cannot attach photos to #{params[:type]}"
flash[:alert] = "Could not find this item owned by you"
end
else
flash[:alert] = "Missing type parameter"
else
flash[:alert] = "Missing or invalid type or id parameter"
end
respond_to do |format|
if @photo.save
format.html { redirect_to @photo, notice: 'Photo was successfully added.' }
@@ -134,6 +117,14 @@ class PhotosController < ApplicationController
private
def has_item_id
params.key? :id
end
def member_owns_item(item)
item.owner.id == current_member.id
end
def photo_params
params.require(:photo).permit(:flickr_photo_id, :owner_id, :title, :license_name,
:license_url, :thumbnail_url, :fullsize_url, :link_url)

View File

@@ -1,2 +0,0 @@
class PolicyController < ApplicationController
end

View File

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

View File

@@ -1,2 +0,0 @@
class SupportController < ApplicationController
end

View File

@@ -19,10 +19,24 @@ module ApplicationHelper
pid = price_in_dollars(price)
currency = Growstuff::Application.config.currency
link = "http://www.wolframalpha.com/input/?i=#{pid}+#{currency}"
return link_to "(convert)",
link,
target: "_blank"
end
link_to "(convert)", link, target: "_blank"
end
def build_alert_classes(alert_type = :info)
classes = 'alert alert-dismissable '
case alert_type.to_sym
when :alert, :danger, :error, :validation_errors
classes += 'alert-danger'
when :warning, :todo
classes += 'alert-warning'
when :notice, :success
classes += 'alert-success'
when :info
classes += 'alert-info'
end
classes
end
# Produces a cache key for uniquely identifying cached fragments.
def cache_key_for(klass, identifier="all")
@@ -50,5 +64,13 @@ module ApplicationHelper
default: :identicon
})
end
# Returns a string with the quantity and the right pluralization for a
# given collection and model.
def localize_plural(collection, model)
size = collection.size
model_name = model.model_name.human(count: size)
"#{size} #{model_name}"
end
end

View File

@@ -1,17 +1,21 @@
module CropsHelper
def display_seed_availability(member, crop)
total_quantity = 0
member.seeds.each do |seed|
if seed.crop.name == crop.name
total_quantity = total_quantity + seed.quantity
end
seeds = member.seeds.select {|seed| seed.crop.name == crop.name }
seeds.each do |seed|
total_quantity = total_quantity + seed.quantity if seed.quantity
end
if !seeds.any?
return "You don't have any seeds of this crop."
end
if (total_quantity != 0)
"You have #{pluralize(total_quantity, "seed")} of this crop."
"You have #{total_quantity} #{Seed.model_name.human(count: total_quantity)} of this crop."
else
"You don't have any seeds of this crop."
"You have an unknown quantity of seeds of this crop."
end
end
end
end

View File

@@ -41,7 +41,7 @@ module HarvestsHelper
if harvest.description.empty?
"No description provided."
else
truncate(harvest.description, length: 130, separator: ' ', omission: '... ') { link_to "Read more", harvest_path(harvest) }
harvest.description
end
end

View File

@@ -2,12 +2,10 @@ class Notifier < ActionMailer::Base
include NotificationsHelper
default from: "Growstuff <noreply@growstuff.org>"
def verifier()
if ENV['RAILS_SECRET_TOKEN']
return ActiveSupport::MessageVerifier.new(ENV['RAILS_SECRET_TOKEN'])
else
raise "RAILS_SECRET_TOKEN environment variable not set - have you created config/application.yml?"
end
def verifier
raise "RAILS_SECRET_TOKEN environment variable not set - have you created config/application.yml?" unless ENV['RAILS_SECRET_TOKEN']
return ActiveSupport::MessageVerifier.new(ENV['RAILS_SECRET_TOKEN'])
end
def notify(notification)

View File

@@ -206,7 +206,7 @@ class Crop < ActiveRecord::Base
# returns a list of interesting crops, for use on the homepage etc
def Crop.interesting
howmany = 12 # max number to find
interesting_crops = Array.new
interesting_crops = []
Crop.includes(:photos).randomized.each do |c|
break if interesting_crops.size == howmany
next unless c.interesting?

View File

@@ -130,7 +130,7 @@ class Member < ActiveRecord::Base
def is_paid?
if account.account_type.is_permanent_paid
return true
elsif account.account_type.is_paid and account.paid_until >= Time.zone.now
elsif account.account_type.is_paid && account.paid_until >= Time.zone.now
return true
else
return false
@@ -200,7 +200,7 @@ class Member < ActiveRecord::Base
def Member.interesting
howmany = 12 # max number to find
interesting_members = Array.new
interesting_members = []
Member.confirmed.located.recently_signed_in.each do |m|
break if interesting_members.size == howmany
if m.interesting?
@@ -222,7 +222,7 @@ class Member < ActiveRecord::Base
end
def update_newsletter_subscription
if confirmed_at_changed? and newsletter # just signed up
if confirmed_at_changed? && newsletter # just signed up
newsletter_subscribe
elsif confirmed_at # i.e. after member's confirmed their account
if newsletter_changed? # edited member settings
@@ -239,7 +239,7 @@ class Member < ActiveRecord::Base
return true if (Rails.env.test? && !testing)
gb = Gibbon::API.new
res = gb.lists.subscribe({
id: Gibbon::API.api_key,
id: Growstuff::Application.config.newsletter_list_id,
email: { email: email },
merge_vars: { login_name: login_name },
double_optin: false # they already confirmed their email with us
@@ -250,7 +250,7 @@ class Member < ActiveRecord::Base
return true if (Rails.env.test? && !testing)
gb = Gibbon::API.new
res = gb.lists.unsubscribe({
id: ENV['GROWSTUFF_MAILCHIMP_NEWSLETTER_ID'],
id: Growstuff::Application.config.newsletter_list_id,
email: { email: email }
})
end

View File

@@ -23,7 +23,7 @@ class Notification < ActiveRecord::Base
def send_email
if self.recipient.send_notification_email
Notifier.notify(self).deliver
Notifier.notify(self).deliver_now
end
end

View File

@@ -68,7 +68,7 @@ class Planting < ActiveRecord::Base
# check that any finished_at date occurs after planted_at
def finished_must_be_after_planted
return unless planted_at and finished_at # only check if we have both
return unless planted_at && finished_at # only check if we have both
errors.add(:finished_at, "must be after the planting date") unless planted_at < finished_at
end
@@ -97,7 +97,7 @@ class Planting < ActiveRecord::Base
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 and !p.finished_at.nil?
if p.finished && !p.finished_at.nil?
(p.finished_at - p.planted_at).to_i
end
end
@@ -133,7 +133,7 @@ class Planting < ActiveRecord::Base
# we can't do this via a scope (as far as we know) so sadly we have to
# do it this way.
def Planting.interesting(howmany=12, require_photo=true)
interesting_plantings = Array.new
interesting_plantings = []
seen_owners = Hash.new(false) # keep track of which owners we've seen already
Planting.includes(:photos).each do |p|

View File

@@ -11,17 +11,17 @@ class Post < ActiveRecord::Base
# from this direction, so we won't set up an association for now.
after_create do
recipients = Array.new
recipients = []
sender = self.author.id
self.body.scan(Haml::Filters::GrowstuffMarkdown::MEMBER_REGEX) do |m|
# find member case-insensitively and add to list of recipients
member = Member.where('lower(login_name) = ?', $1.downcase).first
recipients << member if member and not recipients.include?(member)
recipients << member if member && !recipients.include?(member)
end
self.body.scan(Haml::Filters::GrowstuffMarkdown::MEMBER_AT_REGEX) do |m|
# find member case-insensitively and add to list of recipients
member = Member.where('lower(login_name) = ?', $1[1..-1].downcase).first
recipients << member if member and not recipients.include?(member)
recipients << member if member && !recipients.include?(member)
end
# don't send notifications to yourself
recipients.map{ |r| r.id }.each do |recipient|
@@ -64,7 +64,7 @@ class Post < ActiveRecord::Base
# return posts sorted by recent activity
def Post.recently_active
Post.all.sort do |a,b|
Post.all.sort do |a, b|
b.recent_activity <=> a.recent_activity
end
end
@@ -77,7 +77,7 @@ class Post < ActiveRecord::Base
# find crop case-insensitively
crop = Crop.where('lower(name) = ?', $1.downcase).first
# create association
self.crops << crop if crop and not self.crops.include?(crop)
self.crops << crop if crop && !self.crops.include?(crop)
end
end
end

View File

@@ -79,7 +79,7 @@ class Seed < ActiveRecord::Base
# returns a list of interesting seeds, for use on the homepage etc
def Seed.interesting
howmany = 12 # max number to find
interesting_seeds = Array.new
interesting_seeds = []
Seed.tradable.each do |s|
break if interesting_seeds.size == howmany

View File

@@ -1,17 +0,0 @@
-content_for :title, 'Contact'
%dl
%dt General contact email
%dd= link_to 'info@growstuff.org', 'mailto:info@growstuff.org'
%dl
%dt
Support and accounts enquiries (not covered by the
=succeed ")" do
=link_to 'FAQ', url_for(:controller => '/support')
%dd= link_to 'support@growstuff.org', 'mailto:support@growstuff.org'
%dl
%dt Media/Press enquiries
%dd= link_to 'media@growstuff.org', 'mailto:media@growstuff.org'
%dl
%dt Twitter
%dd= link_to '@growstufforg', 'http://twitter.com/growstufforg'

View File

@@ -1,3 +1,10 @@
= content_for :title, @alternate_name.name
- content_for :opengraph do
= tag("meta", property: "og:title", content: @alternate_name.name)
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
%p#notice= notice
= render :partial => 'crops/approval_status_message', :locals => { :crop => @alternate_name.crop }

View File

@@ -5,10 +5,13 @@
= render :partial => "members/avatar", :locals => { :member => comment.author }
.col-md-11
.comment-meta
= (comment.created_at == comment.updated_at) ? 'Posted by' : 'Edited by'
Posted by
= link_to comment.author.login_name, member_path(comment.author)
on
= (comment.created_at == comment.updated_at) ? comment.created_at : comment.updated_at
= comment.created_at
- if comment.updated_at > comment.created_at
and edited at
= comment.updated_at
.comment-body
:growstuff_markdown

View File

@@ -1,7 +1,7 @@
= content_for :title, "Recent comments"
%div.pagination
= page_entries_info @comments, :model => "comments"
= page_entries_info @comments
= will_paginate @comments
- @comments.each do |comment|
@@ -11,7 +11,7 @@
= render :partial => "single", :locals => { :comment => comment }
%div.pagination
= page_entries_info @comments, :model => "comments"
= page_entries_info @comments
= will_paginate @comments
%p

View File

@@ -1,4 +1,12 @@
= content_for :title, @comment.post.subject
- content_for :opengraph do
= tag("meta", property: "og:image", content: avatar_uri(@comment.post.author, 200))
= tag("meta", property: "og:image:user_generated", content: "true")
= tag("meta", property: "og:title", content: @comment.post.subject)
= tag("meta", property: "og:description", content: strip_tags(@comment.post.body).split(' ')[0..20].join(' '))
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
= render :partial => "posts/single", :locals => { :post => @comment.post }

View File

@@ -1,5 +1,12 @@
- content_for :title, @crop.name
- content_for :subtitle, @crop.default_scientific_name
- content_for :opengraph do
- @crop.photos.each do |photo|
= tag("meta", property: "og:image", content: photo.fullsize_url)
= tag("meta", property: "og:title", content: @crop.name)
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
= render :partial => 'approval_status_message', :locals => { :crop => @crop }
@@ -54,13 +61,13 @@
= render :partial => "shared/signin_signup", :locals => { :to => "post your tips and experiences growing #{ @crop.name.pluralize }" }
- else
%div.pagination
= page_entries_info @posts, :model => "posts"
= page_entries_info @posts
= will_paginate @posts, :params => {:anchor => "posts"}
- @posts.each do |post|
= render :partial => "posts/single", :locals => { :post => post, :subject => true }
%div.pagination
= page_entries_info @posts, :model => "posts"
= page_entries_info @posts
= will_paginate @posts, :params => {:anchor => "posts"}
.col-md-3

View File

@@ -34,7 +34,7 @@
%div.pagination
= page_entries_info @crops, :model => "crops"
= page_entries_info @crops
= will_paginate @crops
%table{:class => "table table-striped", :id => @approval_status.blank? ? 'recently-added-crops' : "#{@approval_status}-crops"}
@@ -64,7 +64,7 @@
ago.
%div.pagination
= page_entries_info @crops, :model => "crops"
= page_entries_info @crops
= will_paginate @crops

View File

@@ -13,4 +13,6 @@
.form-actions.col-md-offset-2.col-md-8
= f.submit "Resend confirmation instructions", :class => 'btn btn-primary'
= render "devise/shared/links"
.form-group
.col-md-offset-2.col-md-8
= render "devise/shared/links"

View File

@@ -25,7 +25,7 @@
%p
We'd also appreciate it if you'd read our
= succeed "," do
= link_to 'Community Guidelines', url_for(:controller => '/policy', :action => 'community', :only_path => false)
= link_to 'Community Guidelines', "#{root_url}/policy/community"
and make sure you follow them. We want #{site_name} to be a
friendly, welcoming environment for everyone, and we hope you'll
help us keep it that way.

View File

@@ -11,4 +11,6 @@
.form-actions.col-md-offset-2.col-md-8
= f.submit "Send me reset password instructions", :class => 'btn btn-primary'
= render "devise/shared/links"
.form-group
.col-md-offset-2.col-md-8
= render "devise/shared/links"

View File

@@ -31,7 +31,7 @@
= f.check_box :tos_agreement
I agree to the
= succeed "." do
= link_to 'Terms of Service', url_for(:action => 'tos', :controller => '/policy')
= link_to 'Terms of Service', "#{root_url}/policy/tos"
.form-group
.col-md-offset-2.col-md-8.checkbox
%label

View File

@@ -11,4 +11,6 @@
.form-actions.col-md-offset-2.col-md-8
= f.submit "Resend unlock instructions", :class => 'btn btn-primary'
= render "devise/shared/links"
.form-group
.col-md-offset-2.col-md-8
= render "devise/shared/links"

View File

@@ -7,7 +7,7 @@
- @forums.each do |forum|
%h2= forum
%p
= pluralize(forum.posts.size, "post")
= localize_plural(forum.posts, Post)
|
=link_to "Visit forum", forum
|

View File

@@ -1,4 +1,11 @@
- content_for :title, @forum.name
- content_for :opengraph do
- if @forum.description
= tag("meta", property: "og:description", content: strip_tags(@forum.description).split(' ')[0..20].join(' '))
= tag("meta", property: "og:title", content: @forum.name)
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
%p#notice= notice

View File

@@ -16,15 +16,16 @@
.form-group
= f.label :description, :class => 'control-label col-md-2'
.col-md-8
= f.text_area :description, :rows => 6, :class => 'form-control', :placeholder => 'optional'
= f.text_area :description, :rows => 6, :class => 'form-control'
= render :partial => 'shared/form_optional'
.form-group
= f.label :location, :class => 'control-label col-md-2'
.col-md-8
= f.text_field :location, :value => @garden.location || current_member.location, :class => 'form-control', :placeholder => 'optional', :maxlength => 255
= f.text_field :location, :value => @garden.location || current_member.location, :class => 'form-control', :maxlength => 255
= render :partial => 'shared/form_optional'
%span.help-block
If you have a location set in your profile, it will be used when
you create a new garden.
= t('.location_helper')
- if current_member.location.blank?
=link_to "Set your location now.", edit_member_registration_path
- else
@@ -33,7 +34,8 @@
.form-group
= f.label :area, :class => 'control-label col-md-2'
.col-md-2
= f.number_field :area, :class => 'input-small form-control', :placeholder => 'optional'
= f.number_field :area, :class => 'input-small form-control'
= render :partial => 'shared/form_optional'
.col-md-2
= f.select(:area_unit, Garden::AREA_UNITS_VALUES, {:include_blank => false}, :class => 'form-control')

View File

@@ -18,14 +18,14 @@
- if garden.location.blank?
not specified
- else
= link_to garden.location, place_path(garden.location)
= link_to garden.location, place_path(garden.location, anchor: "gardens")
%dt Area :
%dd= garden.area.nil? ? "not specified" : pluralize(garden.area, garden.area_unit)
%dt Active? :
%dd= garden.active ? "Yes" : "No"
.col-md-12
%b
= "#{pluralize(garden.plantings.size, "Planting")} : "
= "#{localize_plural(garden.plantings, Planting)} : "
= display_garden_plantings(garden.plantings.current)
- if garden.plantings.size > 2
%br

View File

@@ -15,7 +15,7 @@
= render :partial => 'shared/signin_signup', :locals => { :to => 'add a new garden' }
%div.pagination
= page_entries_info @gardens, :model => "gardens"
= page_entries_info @gardens
= will_paginate @gardens
.row
@@ -27,6 +27,6 @@
%p There are no gardens to display.
%div.pagination
= page_entries_info @gardens, :model => "gardens"
= page_entries_info @gardens
= will_paginate @gardens

View File

@@ -1,5 +1,13 @@
=content_for :title, "#{@garden.owner}'s #{@garden}"
- content_for :opengraph do
- @garden.photos.each do |photo|
= tag("meta", property: "og:image", content: photo.fullsize_url)
- if @garden.description
= tag("meta", property: "og:description", content: @garden.description)
= tag("meta", property: "og:title", content: "#{@garden.owner}'s #{@garden}")
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
.row
.col-md-9
- if can? :edit, @garden or can? :delete, @garden
@@ -39,7 +47,7 @@
- if @garden.photos.size > 0 or (can? :edit, @garden and can? :create, Photo)
.row-fluid
%h3 Photos
%p= pluralize(@garden.photos.length, "photo")
%p= localize_plural(@garden.photos, Photo)
.row-fluid
%ul.thumbnails
- @garden.photos.each do |p|

View File

@@ -19,9 +19,10 @@
= link_to "Request new crops.", new_crop_path
.form-group
= f.label :harvested_at, 'When?', :class => 'control-label col-md-2', :placeholder => 'optional'
= f.label :harvested_at, 'When?', :class => 'control-label col-md-2'
.col-md-2
= f.text_field :harvested_at, :value => @harvest.harvested_at ? @harvest.harvested_at.to_s(:ymd) : '', :class => 'add-datepicker form-control'
= render :partial => 'shared/form_optional'
.form-group
= f.label :quantity, 'How many?', :class => 'control-label col-md-2'
@@ -29,20 +30,23 @@
-# Some browsers (eg Firefox for Android) assume "number" means
-# "integer" unless you specify step="any":
-# http://blog.isotoma.com/2012/03/html5-input-typenumber-and-decimalsfloats-in-chrome/
= f.number_field :quantity, :class => 'input-small', :step => 'any', :class => 'form-control', :placeholder => 'optional'
= f.number_field :quantity, :class => 'input-small form-control', :step => 'any'
= render :partial => 'shared/form_optional'
.col-md-2
= f.select(:unit, Harvest::UNITS_VALUES, {:include_blank => false}, :class => 'input-medium form-control')
.form-group
= f.label :weight_quantity, 'Weighing (in total):', :class => 'control-label col-md-2'
.col-md-2
= f.number_field :weight_quantity, :class => 'input-small form-control', :step => 'any', :placeholder => 'optional'
= f.number_field :weight_quantity, :class => 'input-small form-control', :step => 'any'
= render :partial => 'shared/form_optional'
.col-md-2
= f.select(:weight_unit, Harvest::WEIGHT_UNITS_VALUES, {:include_blank => false}, :class => 'form-control')
.form-group
= f.label :description, 'Notes', :class => 'control-label col-md-2'
.col-md-8
= f.text_area :description, :rows => 6, :class => 'form-control', :placeholder => 'optional'
= f.text_area :description, :rows => 6, :class => 'form-control'
= render :partial => 'shared/form_optional'
.form-group
.form-actions.col-md-offset-2.col-md-8

View File

@@ -21,5 +21,7 @@
%dd= harvest.harvested_at
.panel-footer
%dt Description
%dd
%dd.truncate
= display_harvest_description(harvest)
= if not harvest.description.empty?
- link_to "Read more", harvest_path(harvest)

View File

@@ -21,7 +21,7 @@
= render :partial => 'shared/signin_signup', :locals => { :to => 'track your harvests' }
%div.pagination
= page_entries_info @harvests, :model => "harvests"
= page_entries_info @harvests
= will_paginate @harvests
.row
- if @harvests.size > 0
@@ -30,7 +30,7 @@
=render :partial => 'harvests/thumbnail', :locals => {:harvest => harvest}
%div.pagination
= page_entries_info @harvests, :model => "harvests"
= page_entries_info @harvests
= will_paginate @harvests
%ul.list-inline

View File

@@ -1,4 +1,12 @@
=content_for :title, "#{@harvest.crop} harvested by #{@harvest.owner}"
- content_for :opengraph do
- @harvest.photos.each do |photo|
= tag("meta", property: "og:image", content: photo.fullsize_url)
= tag("meta", property: "og:image:user_generated", content: "true")
= tag("meta", property: "og:title", content: "#{@harvest.crop} harvested by #{@harvest.owner}")
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
.row
.col-md-6

View File

@@ -1,7 +0,0 @@
- daysleft = Date.new(2014, 10, 22) - Date.today # end of campaign is the 21st, this gives a number that matches what IGG uses
- if daysleft > 0
.crowdfunding-banner
Help us share free growing information with the world.
= link_to "Support our crowdfunding campaign.", "https://www.indiegogo.com/projects/growstuff/x/6079859"
There are only #{daysleft.to_i} days left.

View File

@@ -1,11 +1,14 @@
%head
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta property="og:image" content="#{image_url 'growstuff-apple-touch-icon-precomposed.png'}"/>
<meta property="og:title" content="#{content_for?(:title) ? yield(:title) + " - #{ ENV['GROWSTUFF_SITE_NAME']} " : ENV['GROWSTUFF_SITE_NAME']}" />
<meta property="og:type" content="website" />
<meta property="og:url" content="#{root_url}" />
<meta property="og:site_name" content="#{ENV['GROWSTUFF_SITE_NAME']}" />
- if content_for?(:opengraph)
= yield(:opengraph)
- else
= tag("meta", property: "og:image", content: image_url('facebook-thumbnail.png'))
= tag("meta", property: "og:title", content: "#{content_for?(:title) ? yield(:title) + " - #{ ENV['GROWSTUFF_SITE_NAME']} " : ENV['GROWSTUFF_SITE_NAME']}")
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: root_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
- if (content_for?(:member_rss_login_name) && content_for(:member_rss_slug))
= auto_discovery_link_tag(:rss, { :controller => "/members", :action => 'show', :format => "rss", :id => yield(:member_rss_slug) }, { :title => "#{ ENV['GROWSTUFF_SITE_NAME'] }- #{yield(:member_rss_login_name)}'s posts" })

View File

@@ -3,7 +3,6 @@
= render :partial => "layouts/meta"
%body
= render :partial => "layouts/header"
= render :partial => "layouts/crowdfunding"
#maincontainer.container
.row
@@ -18,12 +17,7 @@
%p
.btn-group
= yield(:buttonbar)
- if notice
.alert.alert-success
= notice
- if alert
.alert.alert-warning
= alert
= render :partial => "shared/flash_messages", flash: flash
= yield
%footer

View File

@@ -33,7 +33,7 @@
- if g.photos.size > 0 or (can? :edit, g and can? :create, Photo)
.row
%h3 Photos
%p= pluralize(g.photos.length, "photo")
%p= localize_plural(g.photos, Photo)
.row
%ul.thumbnails
- g.photos.each do |p|
@@ -44,12 +44,12 @@
%p
= link_to "Add photo", new_photo_path(:type => "garden", :id => g.id), :class => 'btn btn-primary'
%h3 What's planted here?
.row
- if g.featured_plantings.size > 0
- g.featured_plantings.each.with_index do |planting|
.col-xs-12.col-lg-6
= render partial: "plantings/thumbnail", locals: {:planting => planting}
%h3 What's planted here?
.row
- if g.featured_plantings.size > 0
- g.featured_plantings.each.with_index do |planting|
.col-xs-12.col-lg-6
= render partial: "plantings/thumbnail", locals: {:planting => planting}
%p
= link_to "More about this garden...", url_for(g)
%p
= link_to "More about this garden...", url_for(g)

View File

@@ -2,4 +2,4 @@
- if member.location.blank?
unknown location
- else
= link_to member.location, place_path(:place => member.location)
= link_to member.location, place_path(:place => member.location, anchor: "members")

View File

@@ -1,5 +1,9 @@
- if member.latitude and member.longitude
%div#membermap
%p
See other members near
= link_to member.location, place_path(member.location)
See other members, plantings, seeds and more near
= link_to member.location, place_path(member.location, anchor: "members")
- else
%div.location-not-set
%div.sr-only Location not known
%div.sr-only We can't show you what's nearby

View File

@@ -1,30 +1,30 @@
%h3 Activity
%ul
%ul.list-inline
%li
- if member.plantings.size > 0
= link_to pluralize(member.plantings.size, "planting"), plantings_by_owner_path(:owner => member)
= link_to localize_plural(member.plantings, Planting), plantings_by_owner_path(owner: member)
- else
0 plantings
%li
- if member.harvests.size > 0
= link_to pluralize(member.harvests.size, "harvest"), harvests_by_owner_path(:owner => member)
= link_to localize_plural(member.harvests, Harvest), harvests_by_owner_path(owner: member)
- else
0 harvests
%li
- if member.seeds.size > 0
= link_to pluralize(member.seeds.size, "seeds"), seeds_by_owner_path(:owner => member)
= link_to localize_plural(member.seeds, Seed), seeds_by_owner_path(owner: member)
- else
0 seeds
%li
- if member.posts.size > 0
= link_to pluralize(member.posts.size, "post"), posts_by_author_path(:author => member)
= link_to localize_plural(member.posts, Post), posts_by_author_path(author: member)
- else
0 posts
%li
- if member.followed.size > 0
= link_to pluralize(member.followed.size, "follow"), member_follows_path(member)
= link_to localize_plural(member.followed, Follow), member_follows_path(member)
- else
0 following

View File

@@ -21,4 +21,4 @@
ago.
%p
%small
= [pluralize(member.gardens.size, "garden"), pluralize(member.plantings.size, "planting"), pluralize(member.seeds.size, "seed")].join(", ")
= [localize_plural(member.gardens, Garden), localize_plural(member.plantings, Planting), localize_plural(member.seeds, Seed)].join(", ")

View File

@@ -7,7 +7,7 @@
= submit_tag "Show", :class => 'btn btn-primary'
%div.pagination
= page_entries_info @members, :model => "members"
= page_entries_info @members
= will_paginate @members
.member-cards
@@ -15,5 +15,5 @@
= render :partial => "members/thumbnail", :locals => { :member => m }
%div.pagination
= page_entries_info @members, :model => "members"
= page_entries_info @members
= will_paginate @members

View File

@@ -1,5 +1,12 @@
- content_for :title, @member.login_name
- content_for :subtitle, @member.location
- content_for :opengraph do
= tag("meta", property: "og:image", content: avatar_uri(@member, 200))
= tag("meta", property: "og:image:user_generated", content: "true")
= tag("meta", property: "og:title", content: @member.login_name)
= tag("meta", property: "og:type", content: "profile")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
- content_for :buttonbar do
- if can? :update, @member
= link_to 'Edit profile', edit_member_registration_path, :class => 'btn btn-default'

View File

@@ -1,7 +1,7 @@
- content_for :title, "#{@member.login_name}'s followers"
%div.pagination
= page_entries_info @followers, :model => "members"
= page_entries_info @followers
= will_paginate @followers
.row
@@ -12,5 +12,5 @@
= render :partial => "members/thumbnail", :locals => { :member => f }
%div.pagination
= page_entries_info @followers, :model => "members"
= will_paginate @followers
= page_entries_info @followers
= will_paginate @followers

View File

@@ -1,7 +1,7 @@
- content_for :title, "#{@member.login_name}'s follows"
%div.pagination
= page_entries_info @follows, :model => "members"
= page_entries_info @follows
= will_paginate @follows
.row
@@ -12,5 +12,5 @@
= render :partial => "members/thumbnail", :locals => { :member => f }
%div.pagination
= page_entries_info @follows, :model => "members"
= will_paginate @follows
= page_entries_info @follows
= will_paginate @follows

View File

@@ -3,7 +3,7 @@
%p Most recent photos added to #{ENV['GROWSTUFF_SITE_NAME']}.
%div.pagination
= page_entries_info @photos, :model => "photos"
= page_entries_info @photos
= will_paginate @photos
.row
@@ -17,7 +17,7 @@
= link_to p.owner, p.owner
%div.pagination
= page_entries_info @photos, :model => "photos"
= page_entries_info @photos
= will_paginate @photos

View File

@@ -20,7 +20,7 @@
= submit_tag "Search", :class => 'btn btn-primary'
%div.pagination
= page_entries_info @photos, :model => "photos"
= page_entries_info @photos
= will_paginate @photos
.row

View File

@@ -1,4 +1,11 @@
-content_for :title, @photo.title
- content_for :title, @photo.title
- content_for :opengraph do
= tag("meta", property: "og:title", content: @photo.title)
= tag("meta", property: "og:image", content: @photo.fullsize_url)
= tag("meta", property: "og:image:user_generated", content: "true")
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
.row
.col-md-6
@@ -24,13 +31,13 @@
%ul
- if @photo.plantings.size > 0
- @photo.plantings.each do |p|
%li= link_to p, p
%li= link_to t('.thing_by', thing: Planting.model_name.singular, owner: p.owner), p
- if @photo.harvests.size > 0
- @photo.harvests.each do |h|
%li= link_to h, h
%li= link_to t('.thing_by', thing: Harvest.model_name.singular, owner: h.owner), h
- if @photo.gardens.size > 0
- @photo.gardens.each do |g|
%li= link_to g, g
%li= link_to t('.thing_by', thing: Garden.model_name.singular, owner: g.owner), g
.row

View File

@@ -1,10 +1,15 @@
-content_for :title, "#{ENV['GROWSTUFF_SITE_NAME']} members near #{@place}"
-content_for :title, "#{ENV['GROWSTUFF_SITE_NAME']} community near #{@place}"
- content_for :opengraph do
= tag("meta", property: "og:title", content: "#{ENV['GROWSTUFF_SITE_NAME']} community near #{@place}")
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
= render partial: 'search_form'
%div#placesmap{ :style => "height:300px"}
%h3= "Nearby members"
%h3#members= "Nearby members"
- if !@nearby_members.empty?
.row
@@ -13,7 +18,7 @@
= render :partial => "members/thumbnail", :locals => { :member => member }
= link_to "View all members >>", members_path
%h3= "Seeds available for trade near #{@place}"
%h3#seeds= "Seeds available for trade near #{@place}"
- crop_id = []
- @nearby_members.first(10).each do |member|
- member.seeds.first(5).each do |seed|
@@ -27,19 +32,23 @@
- else
%p No nearby seeds found
#plantings
%h3= "Recent plantings near #{@place}"
.row
- plantings = []
- @nearby_members.first(10).each do |member|
- member.plantings.first(5).each do |planting|
- plantings << planting
- if !plantings.blank?
- plantings = []
- @nearby_members.first(10).each do |member|
- member.plantings.first(5).each do |planting|
- plantings << planting
- if !plantings.blank?
.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
- else
- else
.row
%p No nearby plantings found
- else
%p No results found

View File

@@ -1,4 +1,9 @@
- content_for :title, @plant_part.name.titlecase
- content_for :opengraph do
= tag("meta", property: "og:title", content: @plant_part.name.titlecase)
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
- if @plant_part.crops.empty?
%p No crops are harvested for this plant part (yet).

View File

@@ -23,32 +23,42 @@
= link_to "Add a garden.", new_garden_path
.form-group
= f.label :planted_at, 'When?', :class => 'control-label col-md-2'
.col-md-2= f.text_field :planted_at, :value => @planting.planted_at ? @planting.planted_at.to_s(:ymd) : '', :class => 'add-datepicker form-control', :placeholder => 'optional'
.col-md-2
= f.text_field :planted_at, :value => @planting.planted_at ? @planting.planted_at.to_s(:ymd) : '', :class => 'add-datepicker form-control'
= render :partial => 'shared/form_optional'
.form-group
= f.label :quantity, 'How many?', :class => 'control-label col-md-2'
.col-md-2
= f.number_field :quantity, :class => 'form-control', :placeholder => 'optional'
= f.number_field :quantity, :class => 'form-control'
= render :partial => 'shared/form_optional'
.form-group
= f.label :planted_from, 'Planted from:', :class => 'control-label col-md-2'
.col-md-8
= f.select(:planted_from, Planting::PLANTED_FROM_VALUES, {:include_blank => 'optional'}, :class => 'form-control')
= f.select(:planted_from, Planting::PLANTED_FROM_VALUES, {:include_blank => ''}, :class => 'form-control')
= render :partial => 'shared/form_optional'
.form-group
= f.label :sunniness, 'Sun or shade?', :class => 'control-label col-md-2'
.col-md-8
= f.select(:sunniness, Planting::SUNNINESS_VALUES, {:include_blank => 'optional'}, :class => 'form-control')
= f.select(:sunniness, Planting::SUNNINESS_VALUES, {:include_blank => ''}, :class => 'form-control')
= render :partial => 'shared/form_optional'
.form-group
= f.label :description, 'Tell us more about it', :class => 'control-label col-md-2'
.col-md-8= f.text_area :description, :rows => 6, :class => 'form-control', :placeholder => 'optional'
.col-md-8
= f.text_area :description, :rows => 6, :class => 'form-control'
= render :partial => 'shared/form_optional'
.form-group
= f.label :finished, 'Mark as finished', :class => 'control-label col-md-2'
.col-md-8
= f.check_box :finished
= render :partial => 'shared/form_optional'
%span.help-block
A planting is finished when you've harvested all of the crop, or it dies, or it's otherwise no longer growing in your garden.
= t('.finish_helper')
.form-group
= f.label :finished_at, 'Finished date', { :class => 'control-label col-md-2', :placeholder => 'optional' }
= f.label :finished_at, 'Finished date', { :class => 'control-label col-md-2' }
.col-md-2
= f.text_field :finished_at, :value => @planting.finished_at ? @planting.finished_at.to_s(:ymd) : '', :class => 'add-datepicker form-control', :placeholder => 'optional'
= render :partial => 'shared/form_optional'
.form-group
.form-actions.col-md-offset-2.col-md-8
= f.submit 'Save', :class => 'btn btn-primary'

View File

@@ -1,41 +1,44 @@
.row
.col-xs-4.col-md-2
= link_to image_tag((planting.default_photo ? planting.default_photo.thumbnail_url : 'placeholder_150.png'), :alt => planting.crop_id, :class => 'img'), planting
.col-xs-4.col-md-6
%dl.dl-horizontal
%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-4.col-md-4
%ul{:style => "list-style-type:none"}
%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 ! 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-3.col-md-4
%dl
%dt Crop name:
%dd= link_to planting.crop.name, planting.crop
%dt Days until maturity:
%dd= "#{display_days_before_maturity(planting)}"
.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 ! 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'
.col-xs-9.col-md-8
= render partial: 'plantings/planting_progress', locals: {planting: planting}
.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}

View File

@@ -17,7 +17,7 @@
= render :partial => 'shared/signin_signup', :locals => { :to => "track what you've planted" }
%div.pagination
= page_entries_info @plantings, :model => "plantings"
= page_entries_info @plantings
= will_paginate @plantings
.row
@@ -27,7 +27,7 @@
= render partial: "plantings/thumbnail", locals: {:planting => planting}
%div.pagination
= page_entries_info @plantings, :model => "plantings"
= page_entries_info @plantings
= will_paginate @plantings
%ul.list-inline

View File

@@ -1,51 +1,55 @@
=content_for :title, "#{@planting.crop} in #{@planting.location}"
- content_for :opengraph do
- @planting.crop.photos.each do |photo|
= tag("meta", property: "og:image", content: photo.fullsize_url)
= tag("meta", property: "og:title", content: "#{@planting.crop} in #{@planting.location}")
- if @planting.description
= tag("meta", property: "og:description", content: @planting.description)
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
.row
.row.planting
.col-md-6
%p
%b Owner:
= link_to @planting.owner, @planting.owner
&mdash;
= link_to "view all #{@planting.owner}'s plantings", plantings_by_owner_path(:owner => @planting.owner.slug)
%p
%b Planted on:
= @planting.planted_at ? @planting.planted_at : "not specified"
%dl.dl-horizontal.planting-attributes
%dt Owner:
%dd
= link_to @planting.owner, @planting.owner
&mdash;
= link_to "view all #{@planting.owner}'s plantings", plantings_by_owner_path(:owner => @planting.owner.slug)
%p
%b Where:
=link_to "#{@planting.owner}'s", @planting.owner
=link_to @planting.garden, @planting.garden
- if ! @planting.owner.location.blank?
= "(#{@planting.owner.location})"
%p
%b
= "Quantity: "
= "#{display_planting_quantity(@planting)}"
%dt Planted on:
%dd= @planting.planted_at ? @planting.planted_at : "not specified"
%dt Where:
%dd
=link_to "#{@planting.owner}'s", @planting.owner
=link_to @planting.garden, @planting.garden
- if ! @planting.owner.location.blank?
= "(#{@planting.owner.location})"
%dt Quantity:
%dd
="#{display_planting_quantity(@planting)}"
- if !@planting.planted_from.blank?
%p
%b
= "Planted from: "
= "#{display_planted_from(@planting)}"
- if !@planting.planted_from.blank?
%dt Planted from:
%dd= "#{display_planted_from(@planting)}"
%p
%b
= "Sun or shade?: "
- sunniness = @planting.sunniness.blank? ? "not specified" : @planting.sunniness
= image_tag("sunniness_#{sunniness}.png", :size => "25x25", :alt => "#{sunniness}", :title => "#{sunniness}")
= " (#{sunniness})"
%dt Sun or shade?
%dd
- sunniness = @planting.sunniness.blank? ? "not specified" : @planting.sunniness
= image_tag("sunniness_#{sunniness}.png", :size => "25x25", :alt => "#{sunniness}", :title => "#{sunniness}")
= " (#{sunniness})"
%dt Days until maturity:
%dd= "#{display_days_before_maturity(@planting)}"
%dt Finished:
%dd= "#{display_finished(@planting)}"
%p
%b
= "Days until maturity: "
= "#{display_days_before_maturity(@planting)}"
%p
%b
= "Finished: "
= "#{display_finished(@planting)}"
%p
%b= render 'planting_progress', planting: @planting
= render 'planting_progress', planting: @planting
- if can? :edit, @planting or can? :destroy, @planting
%p
@@ -58,11 +62,16 @@
.col-md-6
= render :partial => "crops/index_card", :locals => { :crop => @planting.crop}
- if @planting.owner.location
%p
%small
View other plantings, members and more near
= link_to @planting.owner.location, place_path(@planting.owner.location, anchor: "plantings")
- if @planting.description
%h2 Notes
%h2 Notes
:growstuff_markdown
#{ @planting.description != "" ? @planting.description : "No description given." }
:growstuff_markdown
#{ @planting.description != "" ? @planting.description : "No description given." }
- if @planting.photos.size > 0 or (can? :edit, @planting and can? :create, Photo)
%h2 Pictures

View File

@@ -1,45 +0,0 @@
-content_for :title, 'API and Data Use Policy'
:markdown
We hate legalese, so we've tried to make this policy readable. If you've got any questions, feel free to [ask us](mailto:support@growstuff.org), and we'll do our best to answer.
This API and Data Use Policy covers all websites (such as [growstuff.org](http://growstuff.org)) owned and operated by Growstuff Pty Ltd ("Growstuff", "we", "us", "our") and all associated services, collectively referred to as the Service.
In particular, this policy covers any access to the Service via any Application Programming Interface, feeds, spidering, scraping, or any other automated or programmatic access to the Structured Data or Content available via the Service (collectively, the "API"). This policy applies to anyone who uses the API ("you", "developer").
## 1. API Provided As-Is, and Subject to Change
Growstuff provides its API on an as-is basis, as described under "Disclaimer of Warranties" in our [Terms of Service](http://growstuff.org/policy/tos).
Growstuff's API is subject to change. We will make reasonable efforts to notify developers of changes and of the release status of any API features. You should take reasonable efforts to keep up with Growstuff technical news via our forums, mailing lists, or other channels.
## 2. Don't overload our servers
You agree to limit your access to the API in such a way as to prevent excessive load on the Service. Growstuff reserves the right to restrict or rate-limit access to the API if necessary to maintain the performance of the Service.
## 3. Use of Growstuff Data and Content
You agree to observe the terms of the [Creative Commons Attribution-ShareAlike (CC-BY-SA) 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/deed.en_US) under which our Structured Data is made available. You agree to to observe the copyright and intellectual property rights of Growstuff's members with regard to their Content posted on the Service, including but not limited to posts, comments, images, etc.
You agree to respect any privacy settings which pertain to the Structured Data or Content you access via the API. You agree not to republish any Structured Data or Content with more permissive access than was originally intended by the member who posted it.
Growstuff acknowledges that Structured Data and Content made available under the API may be cached or retained by third parties for any length of time. However, we request that if you are building an application using current Structured Data and Content, you will take reasonable efforts to regularly update it, including removing any Structured Data or Content that is deleted from the Service, and reflecting any changes in privacy settings that pertain to it.
## 4. Authentication
Growstuff reserves the right to require authentication and/or app registration as a condition of use of the API and Data.
If you provide users with the ability to login to Growstuff, you must do so via OAuth. You may not require users to provide their Growstuff login name and password.
## 5. Penalties
If you violate the terms of this Policy, Growstuff may restrict your access to the API.
## 6. Changes
We may change our API and Data Use Policy from time to time. A history of changes to this Policy is available via our public source code repository at [https://github.com/Growstuff/policy](https://github.com/Growstuff/policy). We will take reasonable steps to notify you of any substantial changes to this Policy; however, it is your responsibility to check this Policy periodically for changes. Your continued use of this site after any change in this Privacy Policy will constitute your acceptance of such change.
## 7. Creative Commons License
This API and Data Use Policy is licensed under a [Creative Commons Attribution-ShareAlike (CC-BY-SA) 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/deed.en_US).

View File

@@ -1,31 +0,0 @@
-content_for :title, 'Growstuff Community Guidelines'
:markdown
Growstuff is a community by and for food-gardeners. Together, we are building a website where we can share our experience, knowledge, and the products of our harvest. The most important thing about Growstuff is the people. For Growstuff to thrive, we need people to add their crops, share their knowledge, and help build the site itself.
Whatever your interest in Growstuff you are welcome here, and will be treated with respect. In particular:
- We welcome people of any age, gender identity or expression, ethnicity, nationality, religion or absence thereof, political opinion, sexual orientation, marital status, family structure, ability or disability, appearance, subculture, or other identity or self-identification.
- Although Growstuff is primarily focused on food gardening, we welcome all kinds of gardeners, including organic and conventional growers; those who grow their crops in fields or on balconies or in hydroponic systems; those who garden commercially or non-commercially; those who subsist on their crops and those who garden for other reasons.
- We welcome people of all skill and experience levels, and we don't believe in being dismissive or commenting rudely just because you are new or learning.
- Every role in our community is important, including gardeners who contribute skills, knowledge, and information to our site; coders, designers and other techies who help build it; moderators and others who help our community thrive; or any other form of participation. We believe in working together, and prioritise communication and mutual understanding.
If you want to participate in the Growstuff community (which includes our website and any auxiliary forums such as our mailing list(s), IRC channel, etc), you need to agree to our general commitment to inclusiveness and mutual respect, as well as to the following specific policies:
- Harassment of any Growstuff community member is forbidden. Harassment includes slurs directed at individuals or groups; unwanted sexual remarks directed at any person or group; sexually explicit comments or imagery in public spaces; stalking or other repeated, unwanted contact; or any repeated or sustained behaviour which disrupts someone else's enjoyment of the Growstuff site or community.
- The privacy of our community members is very important. You may not disclose any member's personal details (including names by which they are known outside of Growstuff, their location, employment details, family details, outside-of-Growstuff contact details, or any other identifying or personal information) without their explicit consent.
- Although we let you choose your own name on our site, and don't insist that you use the same name on our website as you have on the cards in your wallet, you're not allowed to create or use a pseudonymous account to mislead people, evade accountability, or otherwise cause trouble. (This is commonly known as a "sockpuppet" account.)
If you experience or witness behaviour that goes against these community guidelines, you can report it to support@growstuff.org. We will listen carefully and take your report seriously. Once we've looked into the situation, we may take any action we deem necessary. For instance, we may issue a warning, or in serious cases we may suspend or ban people from our community. If this happens, we will always tell the person affected the reason for our action, with reference to our policy documents.
We don't want to make these guidelines too long or legalistic, so we'll leave it there, except for one final guideline. As Bill and Ted said: *be excellent to each other*. And grow stuff.
## Creative Commons License
These Community Guidelines are licensed under a [Creative Commons Attribution-ShareAlike (CC-BY-SA) 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/deed.en_US).

View File

@@ -1,91 +0,0 @@
-content_for :title, 'Copyright Infringement Policy'
:markdown
We hate legalese, so we've tried to make this policy readable. If you've got any questions, feel free to [ask us](mailto:support@growstuff.org), and we'll do our best to answer.
This Copyright Infringement Policy covers all websites (such as [growstuff.org](http://growstuff.org)) owned and operated by Growstuff Pty Ltd ("Growstuff", "we", "us", "our") and all associated services, collectively referred to as "the Service". It describes how you may report a violation of copyright on the Service.
Growstuff respects the intellectual property of others, and we ask our users to do the same. Growstuff members are required by the [Terms of Service](http://growstuff.org/policy/tos) to ensure that they have the legal right to post content to the Service.
Growstuff is based in Melbourne, Australia and is not subject to the provisions of the United States Digital Millennium Copyright Act (DMCA). However, we have established policy and procedures which are similar to those required by the DMCA, as we believe they constitute best practice for web services operating in Australia.
## 1. Notifying us of an infringement
If you believe that a Growstuff member has infringed your intellectual property rights by posting Content to the service, you may follow these steps to notify us and ask for the removal of the Content.
Notifications may be submitted by email to [support@growstuff.org](mailto:support@growstuff.org) or by physical mail to:
Growstuff
Level 3, 673 Bourke Street
Melbourne VIC 3000
AUSTRALIA
We prefer to receive notifications by email.
Copyright infringement notifications sent through any other mechanism or forum will not be acted upon.
You must provide the following information:
* Sufficient information to identify the copyrighted work being infringed. For instance, if the work is a published book, provide the title, author, and ISBN; if the work is a magazine article, provide the title, author, magazine name, and magazine issue; if the work is available on the Internet, provide the URL of the work.
* The URL of the specific page on Growstuff where your work was reproduced without permission. General descriptions or non-specific links (such as to Growstuff's homepage) cannot be acted upon.
* Your postal address, telephone number, and email address.
* A statement by you that the above information is accurate and that you are the copyright or intellectual property owner or authorized to act on the copyright or intellectual property owner's behalf.
* A physical signature or digital signature in a recognized industry-standard format such as PGP, of the copyright or intellectual property owner or the person authorized to act on their behalf. Unsigned notifications will not be processed.
## 2. Responding to notifications
We will respond to copyright infringement notifications within two business days.
If we are not provided with enough information to act on the notification, including all the items listed in the section above, we will reject the notification and notify the submitter that it cannot be acted upon.
If the Content is not hosted on our servers (for instance, if the notification concerns an image hosted on another site which is merely displayed on or linked from our site) we will respond, notifying the submitter that the Content is not hosted by us and referring them to the hosting site.
Provided we are able to act upon the notification, we will contact the member who posted the Content and inform them of the notification and claim of intellectual property rights.
The member will have two business days to respond. They may respond as follows:
* Admit that they have posted something to which they do not hold intellectual property rights. In this case, the member may delete the Content from the Service, or we may render it inaccessible.
* Submit a counter-notification, stating that they have the right to post the Content, and that they are prepared to uphold this claim in court. The process for this is outlined below.
* Respond saying that they do not believe they have infringed any intellectual property rights, but that they do not wish to formally submit a counter-notification. In this case, the member may delete the Content from the Service, or we may render the Content inaccessible.
* If the member fails to respond, we will render the Content inaccessible.
When Content is deleted or rendered inaccessible, we will take reasonable efforts to ensure it cannot be accessed via the Service. However, caching or external references may mean that Content remains accessible for some time, including on third-party sites or applications. Third party sites and applications are not under Growstuff's control. If infringing Content has been removed or rendered inaccessible via the Service but is still available via third-party sites and applications, the copyright or intellectual property holder may contact the operators of those sites/applications to notify them of the infringement.
## 3. Counter-notification and restoration process
A counter-notification is a statement that you do not believe your content infringes on another person's rights, or that your use of another person's copyrighted material falls into a protected category under law.
By filing a counter-notification, you are indicating that you are willing to defend your use of the material in court, if the copyright owner chooses to bring a lawsuit against you for your use of the material. This may involve civil and/or criminal penalties. We strongly suggest you contact an intellectual property lawyer licensed to practice law in your jurisdiction before you do this, so that you are aware of your rights and obligations under the law.
A counter-notification must contain the following items:
* Your signature. Signatures may be a physical signature or a digital signature in a recognized industry-standard format such as PGP.
* The URL of the Content that has been called into question (this will have been provided in the original notification).
* A statement that you have a good faith belief that the copyright infringement notification was sent as a result of mistake or misidentification of the material. This should include any reasons why you believe your use of the material is not infringing.
* Your name, address, and telephone number.
We will forward your counter-notification, in full, to the submitter of the original notification. They will then have 14 days to initiate legal action and notify us that they have done so.
In the meantime, we will render the Content inaccessible.
If, after 14 days, we have not been informed that legal proceedings have been initiated, we will restore the Content.
If you have filed a counter-notification, you may not re-post the allegedly-infringing material until we notify you that the waiting period has expired.
## 4. Repeat offenses
Members who receive three or more valid copyright infringement notices will have their accounts terminated.
If a counter-notification is filed, or if the member has stated that they do not accept the allegation of copyright infringement but do not wish to formally file a counter-notification, the notification will not be counted toward termination.
We also reserve the right to terminate the accounts of those who, in our opinion, misuse or abuse the copyright infringement notification process against other members.
## 5. Changes
We may change our Copyright Infringement Policy from time to time. A history of changes to this Policy is available via our public source code repository at [https://github.com/Growstuff/policy](https://github.com/Growstuff/policy). We will take reasonable steps to notify you of any substantial changes to this Policy; however, it is your responsibility to check this Policy periodically for changes. Your continued use of this site after any change in this Privacy Policy will constitute your acceptance of such change.
## 6. Creative Commons license
This Terms of Service document is based on one developed by Dreamwidth ([http://www.dreamwidth.org/legal/dmca](http://www.dreamwidth.org/legal/dmca)) and is licensed under a [Creative Commons Attribution-ShareAlike 2.5 License](http://creativecommons.org/licenses/by-sa/2.5/).

View File

@@ -1,107 +0,0 @@
-content_for :title, 'Privacy Policy'
:markdown
We hate legalese, so we've tried to make this policy readable. If you've got any questions, feel free to [ask us](mailto:support@growstuff.org), and we'll do our best to answer.
This privacy statement ("Privacy Policy") covers all websites (such as [growstuff.org](http://growstuff.org/)) owned and operated by Growstuff Pty Ltd ("Growstuff", "we", "us", "our") and all associated services, collectively referred to as "the Service".
We use information you share with us for our internal business purposes. We do not sell your information. This notice tells you what information we collect, how we use it, and steps we take to protect and secure it.
## 1. Information we collect
### 1.1 Non-Personal Data
Like most website operators, we collect Non-Personal Data such as browser type, language preference, referring site, and the date and time of each visitor request.
We collect this to understand how our visitors and members use our service, and use it to make decisions about how to change and adapt the service.
From time to time, we may release Non-Personal Data in aggregate form (for instance, by publishing trends in site usage) to explain our reasoning in making decisions. We will not release individual information, only aggregate information.
### 1.2 Personal Data
Personal Data is anything which can be used to identify or contact you, such as your legal name, email address, IP address, or physical location.
#### 1.2.1 Automatically collected Personal Data
We automatically collect some Personal Data, such as IP address, provided by your browser and your computer whenever you visit our website.
We collect this information for several purposes:
* To diagnose and repair network issues with your use of the site;
* To estimate the number of users accessing the service from specific geographic regions;
* To help prevent fraud and abuse.
#### 1.2.2 Email address
In order to register for the service, you must give us your email address. We will use your email address to send confirmation of certain actions, such as when you change your password. We will contact you when it's necessary to complete a transaction that you've initiated, or if there's a critical or administrative issue affecting your use of the service.
Once you have created your account, you can choose to subscribe to certain events and have notifications of those events sent to you via email. You will be able to change your mind and opt out of receiving notifications via email at any time.
We will never sell or provide your email address to any third party for marketing purposes, or for any other reason except as set out below.
#### 1.2.3 Optional Personal Data you provide to us
As you use the service, you have the option to provide more Personal Data, through your profile and other activity on the site. Providing this information is strictly optional.
You have the option to provide us with your location. You may provide this at whatever level of detail you wish, for instance you may provide your street address or your country of residence or nothing at all. We use this location to provide you with relevant content.
Many of your activities on the Service may allow you to post Personal Data or to directly or indirectly disclose Personal Data about yourself. For instance, you may disclose Personal Data in a post or comment on the site, by uploading a picture, by linking to another website you use, or by recording your gardening activity in detail. All of these activities are optional. You should use due caution when disclosing Personal Data through your activity on the Service.
We will show the information you provide, including any Personal Data it may contain, to others viewing the site, in accordance with the privacy options you've selected.
The information you provide is also made available to third parties via our API and feeds, in accordance with the privacy options you've selected and subject to the terms of our API and Data Use Policy which is available at [http://growstuff.org/policy/api](http://growstuff.org/policy/api).
Some of the information you provide is categorised as Structured Data, which is defined more fully in our [Terms of Service]([http://growstuff.org/policy/tos). We make Structured Data freely available under a Creative Commons Attribution ShareAlike (CC-BY-SA) 3.0 Unported license for use by third parties, in accordance with the privacy options you've selected.
We may also use any Personal Data you provide, in aggregate, to make decisions about how to change and adapt the service. From time to time, we may release information in aggregate form (for instance, by publishing trends in site usage) to explain our reasoning in making decisions. We will not release individual information, only aggregate information.
#### 1.2.4 Financial information and transactions
You can engage in financial transactions with Growstuff to purchase a paid account. These transactions are optional. If you choose to purchase a paid account, you will be asked to provide financial information to complete the transaction.
Credit cards: If you pay by credit card, we need you to provide your credit card number, your full name as it appears on the card, your address as it appears on the card statement, and the CVN or Card Verification Number. This information is required so we can authorize and charge your credit card. Your financial information is protected by industry-standard encryption methods. It is never stored on our servers: we pass it immediately along to our processor for the sole purpose of completing the authorized transaction.
In all cases, Growstuff collects this personal and financial information only as necessary or appropriate for the completion of the single requested transaction. Any additional non-financial Personal Data you disclose during these transactions will be governed by the "Disclosure of Personal Data" provisions below.
## 2. Disclosure of Personal Data
We disclose Personal Data, including optional personal information you have provided but which is not normally available to other site users, only to those of our employees, contractors, and volunteers who (i) need to know that information in order to operate the service and (ii) have agreed not to disclose it to others. Circumstances in which this is necessary include, but are not limited to: troubleshooting and diagnosing technical problems, investigating possible Terms of Service violations, and legal compliance issues.
We contract with third-party vendors to provide some site features. We will only share personal information with third-party vendors to the extent that is necessary for them to provide these site features. We require our third-party vendors to provide the same level of privacy protection that we do, and they do not have the right to share or use personal information for any purpose other than for an authorized transaction.
We may disclose Personal Data or potentially personally-identifying data when that release is required by law or by court order, or when we believe in good faith that disclosure is reasonably necessary to protect the safety or rights of us, third parties, or the public at large.
We reserve the right to transfer your Personal Data to a third party in the event of a sale, merger, liquidation, receivership or transfer of all or substantially all of the assets of our company provided that the third party agrees to adhere to the terms of the Growstuff Privacy Policy and provided that the third party only uses your Personal Data for the purposes that you provided it to us. You will be notified in the event of any such transfer and you will be afforded an opportunity to opt-out.
## 3. Cookies
A cookie is a string of information that a website stores on a visitor's computer, and that the visitor's browser provides to the website each time the visitor returns. We use cookies to help us identify and track visitors, their usage of the website, and their website access preferences. We also use cookies to govern logging into your account.
Visitors who do not wish to have cookies placed on their computers should set their browsers to refuse cookies before using the site, with the drawback that certain features of the site may not function properly without the aid of cookies.
## 4. Confidentiality and security
No data transmisson over the Internet can ever be guaranteed to be 100% secure. You use this service at your own risk. However, we will take all reasonable steps (including appropriate technical and organisational measures) to protect your Personal Data.
Your account information is password-protected. We recommend that you choose a strong and secure password. We use industry-standard encryption to protect your password on our servers.
If we learn of a system security breach, we will notify you electronically so you can take appropriate steps to protect yourself.
## 5. Deleting your information
You can change or delete any optional information that you've provided us at any time. If you change or delete any optional information you've provided, the change will take place immediately on the Service. However, caching or references to the data, including in third party applications based on the Service, may mean that formerly available data remains available for some time.
As part of the day to day operation of the Service, we will make regular copies of the data contained in the databases for backup purposes. These backups can potentially contain deleted data for several weeks or months. These backups will also be governed by the rules for Disclosure of Personal Data.
## 6. Changes
We may change our Privacy Policy from time to time. A history of changes to this Policy is available via our public source code repository at [https://github.com/Growstuff/policy](https://github.com/Growstuff/policy). We will take reasonable steps to notify you of any substantial changes to this Policy; however, it is your responsibility to check this Policy periodically for changes. Your continued use of this site after any change in this Privacy Policy will constitute your acceptance of such change.
## 7. Contacting us
If you have questions about this policy, you can contact us at [support@growstuff.org](mailto:support@growstuff.org).
## 8. Creative Commons
This privacy policy is based on one developed by Automattic ([http://automattic.com/privacy/](http://automattic.com/privacy/)) and amended by Dreamwidth ([http://dreamwidth.org/legal/privacy](http://dreamwidth.org/legal/privacy)) and is licensed under a [Creative Commons Attribution-ShareAlike 2.5 License](http://creativecommons.org/licenses/by-sa/2.5/).

View File

@@ -1,156 +0,0 @@
-content_for :title, 'Growstuff Terms of Service'
:markdown
We hate legalese, so we've tried to make our Terms of Service readable. If you've got any questions, feel free to [ask us](mailto:support@growstuff.org), and we'll do our best to answer.
Growstuff Pty Ltd ("we", "us", "our", "Growstuff") present the following terms and conditions, which govern your use of the Growstuff website at [growstuff.org](http://growstuff.org), and all content, services and products available at or through the website, which we collectively refer to as "the Service".
To use the Service, you need to agree to these Terms of Service, along with all other policies we publish (including, but not limited to, Growstuff's Privacy Policy, API and Data Use Policy, Copyright Infringement Policy and Community Guidelines). We refer to this as "the Agreement".
Please read this Agreement carefully before accessing or using the Service. By accessing or using any part of the Service, you agree that you are bound by the terms and conditions of this Agreement. If you do not agree to all the terms and conditions of this Agreement, then you may not access the Service.
## 1. Your Account
If you create an account on the Service, you are responsible for maintaining the security of your account. You are responsible for all activities that occur under the account. You must take reasonable steps to guard the security of your account. We will not be liable for anything that happens if your account security is breached as a result of your failure to protect it.
## 2. Account Structure
Growstuff currently has three types of accounts:
* Free Accounts are available free of charge. Free accounts can access basic site functions, but do not receive access to premium features.
* Paid Accounts are available for term-based fee and receive access to a number of premium features. When your Paid Account expires, it will revert to a Free Account until you pay for it again.
* Permanent Accounts are reserved for those who have contributed significantly to the Growstuff project, at our discretion. They receive all features available to paid accounts, for as long as Growstuff continues to operate, without need for future payment.
Payments to Growstuff, for account services or for any other purpose, are refundable or transferable solely at Growstuff's discretion.
By using this Service, you agree to this account structure, and to Growstuff's right to change, modify, or discontinue any type of account or the features available to it at any time.
## 3. Content policy
Our content policy relates to any material you may post on the Growstuff website or through the Service, which we call "Content". This includes profile information, posts and comments, information about your food growing activity, and any other material, whether text, graphics, or any other format, which you may post on Growstuff itself or link to from Growstuff.
All Content posted to the Service in any way is the responsibility of the owner. If Content is deemed illegal by any law having jurisdiction over you, you agree that we may submit any necessary information to the proper authorities.
We claim no ownership or control over any Content that you post to the Service. You retain any intellectual property rights to the Content you post, in accordance with applicable law. By posting Content, you represent that you have the rights to reproduce that Content (and the right to allow us to serve such Content) without violation of the rights of any third party. You agree that you will bear any liability resulting from the posting of any Content that you do not have the rights to post.
You grant us a world-wide, royalty-free, and non-exclusive license to reproduce, modify, adapt and publish the Content, solely for the purpose of displaying, distributing and promoting the contents of your account, through any part of the Service including through our API, feeds, and external clients.
If you delete Content, we will use reasonable efforts to remove it from the Service, but you acknowledge that caching or references to the Content may not be made immediately unavailable.
### 3.1 Structured Data
There is a subset of Content which we refer to as "Structured Data". Structured Data is Content which represents simple facts, rather than creative effort. For instance, locations, dates, or the type and number of crops you have planted are Structured Data. Structured Data may be created explicitly by you or implicitly by the Website in response to your activity.
By using the Service, you acknowledge that Structured Data will be gathered and stored by Growstuff, and that any Structured Data pertaining to you or your activity may be made available for use by third parties under a Creative Commons Attribution ShareAlike (CC-BY-SA) license. You also agree that attribution for the Structured Data under the terms of the Creative Commons license will be given to Growstuff.
### 3.2 Content Posted on Other Websites
We have not reviewed, and cannot review, all of the material, including computer software, made available through the websites and webpages to which we, any user, or any provider of Content links, or that link to us. We do not have any control over those websites and webpages, and are not responsible for their contents or their use. By linking to an external website or webpage, we do not represent or imply that we endorse such website or webpage. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. We disclaim any responsibility for any harm resulting from your use of external websites and webpages, whether that link is provided by us or by any provider of Content on the Service.
### 3.3 How we deal with problem Content
You agree that by using the Service, you may be exposed to Content you find offensive or objectionable.
We do not pre-screen Content. However, you acknowledge that we have the right (but not the obligation), in our sole discretion, to remove or refuse to remove any Content from the Service. If such Content is reported to us, it will be our sole discretion as to what action, if any, should be taken.
If any Content you have submitted is reported to us as violating this Agreement, you agree that we may call upon you to change, modify, or remove that Content, within a reasonable amount of time, as defined by us. If you do not follow this directive, we may terminate your account.
## 4. Member Conduct
You agree that you will not use the Service to:
1. Upload, post, or otherwise transmit any Content that is harmful, threatening, abusive, hateful, invasive to the privacy and publicity rights of any person, or that violates any applicable local, state, national, or international law, including any regulation having the force of law;
1. Upload, post, or otherwise transmit any Content that is spam, or contains unethical or unwanted commercial content designed to drive traffic to third party sites or boost the search engine rankings of third party sites, or to further unlawful acts (such as phishing) or mislead recipients as to the source of the material (such as spoofing);
1. Maliciously impersonate any real person or entity, including but not limited to a Growstuff staff member or volunteer, or to otherwise misrepresent your affiliation with any person or entity;
1. Upload, post or otherwise transmit any Content that you do not have a right to transmit under any law or under contractual or fiduciary relationships (such as inside information, proprietary and confidential information learned or disclosed as part of employment relationships or under nondisclosure agreements);
1. Upload, post or otherwise transmit any Content that infringes any patent, trademark, trade secret, copyright, or other proprietary rights of any party;
1. Interfere with or disrupt the Service or servers or networks connected to the Service, or disobey any requirements, procedures, policies or regulations of networks connected to the Service;
1. Solicit passwords or personal identifying information for unintended, commercial or unlawful purposes from other users;
1. Upload, post or otherwise transmit any Content that contains viruses, worms, malware, Trojan horses or other harmful or destructive content;
1. Allow usage by others in such a way as to violate this Agreement;
1. Make excessive or otherwise harmful automated use of the Service;
1. Access any other person's account, or exceed the scope of the Service that you have signed up for; for example, accessing and using features you don't have a right to use.
You agree that you will abide by the Community Guidelines, which are currently available at [http://growstuff.org/policy/community](http://growstuff.org/policy/community).
## 5. Volunteers
We appreciate the service of volunteers in many aspects of Growstuff's operations. Volunteer activities include but are not limited to developing software, providing technical support, writing documentation, performing site administration duties, providing expert advice, research, technical writing, reviewing, categorizing, and other duties as necessary to support the operation of the Service.
All volunteers are expected to be of legal age, or volunteering with the consent of a legal parent or guardian.
By volunteering, you agree that any work created as a result of your volunteer activities shall be licensed to Growstuff on a perpetual, irrevocable, and world-wide basis, to the extent permitted by law. You agree that Growstuff may determine the basis upon which your volunteer work shall be licensed to others, including under Open Source or Creative Commons licenses that may permit the further alteration or dissemination of your work. If laws prevent such licensing, you agree never to sue Growstuff for the use of said work.
By volunteering, you agree that you are providing your work with no expectation of pay or future consideration by Growstuff. You also agree that you have taken reasonable diligence to ensure that the work is correct, accurate, and free of defect. You agree that you will not disclose or share any proprietary or confidential information you are provided with in the course of your volunteer work.
No user is required to volunteer, and users who do not volunteer will receive equal care, support, and attention.
## 6. Privacy Policy
Your use of the Website is governed by the Privacy Policy, currently located at [http://growstuff.org/policy/privacy](http://growstuff.org/policy/privacy).
## 7. API and Data Use Policy
Your use of our API and/or data is governed by our API and Data Use Policy, currently located at [http://growstuff.org/policy/api](http://growstuff.org/policy/api).
## 8. Copyright Infringement
If you believe that material located on the Website violates your copyright, you may notify us in accordance with our Copyright Policy, currently located at [http://growstuff.org/policy/copyright](http://growstuff.org/policy/copyright).
## 9. Resale of Services
You agree not to reproduce, duplicate, copy, sell, resell, or exploit any portion of the Service, use of the Service, or access to the Service, except as is permitted under our API and Data Use Policy, open source license pertaining to the Service's source code, or Creative Commons licenses pertaining to Content or other material posted on the Service.
## 10. Indemnity
You agree to indemnify and hold harmless Growstuff Pty Ltd, its contractors, its licensors, and their respective directors, officers, employees and agents from and against any and all claims and expenses, including attorneys' fees, arising out of your use of the Service, including but not limited to out of your violation of this Agreement.
## 11. Termination
Growstuff may terminate your account or otherwise restrict your use of the Service at any time if we believe you have violated this Agreement. If this occurs, you will be notified by email, and we will tell you which part of the Agreement we believe you violated. We may, at our discretion, choose to issue a warning rather than terminate your account, in which case you will also be notified by email and told which part of the Agreement we believe you violated. We will also provide you with a contact address where you may appeal our decision, however, we do not guarantee that we will change our minds.
You agree that any termination of your access to the Service may involve removing or discarding any content you have provided.
Paid accounts that are terminated for violations of this Agreement will only be refunded at our discretion, and only if such termination should come under our established criteria for issuing refunds.
We may, at our sole discretion, discontinue providing the Service at any time, with or without notice.
If you wish to terminate this Agreement, you may delete your account and cease using the Service. You agree that, upon deletion of your account, we may, but are not required to, remove any Content you have provided, at any time past the deletion of your account.
All provisions of this Agreement which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability.
## 12. Changes
We reserve the right, at our sole discretion, to modify or replace any part of this Agreement at any time. A history of changes to this Agreement is available via our public source code repository at [https://github.com/Growstuff/policy](https://github.com/Growstuff/policy). We will take reasonable steps to notify you of any substantial changes to this Agreement; however, it is your responsibility to check this Agreement periodically for changes. Your continued use of the Service following the posting of any changes to this Agreement constitutes acceptance of those changes.
We may also, in the future, offer new features or services through the Service. Such new features and/or services shall be subject to the terms and conditions of this Agreement.
## 13. Disclaimer of Warranties
This Service is provided "as is". Growstuff Pty Ltd and its suppliers and licensors hereby disclaim all warranties of any kind, express or implied, including, without limitation, the warranties of merchantability, fitness for a particular purpose and non-infringement. Neither Growstuff Pty Ltd nor its suppliers and licensors, makes any warranty that the Service will be error free or that access to the Service will be continuous or uninterrupted. You agree that any interruptions to the service will not qualify for reimbursement or compensation. You understand that you download from, or otherwise obtain content or services through, the Service at your own discretion and risk.
No advice or information, whether oral or written, obtained by you in any fashion shall create any warranty not expressly stated in this Agreement.
## 14. Limitation of Liability
You expressly understand and agree that in no event will Growstuff Pty Ltd or its suppliers or licensors, be liable with respect to any subject matter of this agreement under any contract, negligence, strict liability or other legal or equitable theory for: (i) any special, incidental or consequential damages; (ii) the cost of procurement or substitute products or services; (iii) interruption of use or loss or corruption of data; (iv) any statements or conduct of any third party on the service; or (v) any unauthorized access to or alterations of your Content. We shall have no liability for any failure or delay due to matters beyond our reasonable control.
The foregoing shall not apply to the extent prohibited by applicable law.
## 15. General Information
This Agreement constitutes the entire agreement between us and you concerning your use of the Service. This Agreement may only be modified by a written amendment signed by an authorized representative of Growstuff Pty Ltd, or by the posting of a revised version to this location. Except to the extent that applicable law (if any) provides otherwise, any dispute arising between you and Growstuff Pty Ltd regarding these Terms of Service and/or your use or access of the Service will be governed by the laws of the state of Victoria and the federal laws of Australia, excluding any conflict of law provisions. You agree to submit to the jurisdiction of the state and federal courts located in Melbourne, Australia for any disputes arising out of or relating to your use of the Service or your acceptance of this Agreement.
If any part of this Agreement is held invalid or unenforceable, that part will be construed to reflect the parties' original intent, and the remaining portions will remain in full force and effect. A waiver by either party of any term or condition of this Agreement or any breach thereof, in any one instance, will not waive such term or condition or any subsequent breach thereof.
The section titles in this Agreement are for convenience only and have no legal or contractual effect.
## 16. Reporting Violations
To report a violation of this agreement, please email [support@growstuff.org](support@growstuff.org).
## 17. Creative Commons
This Terms of Service document is based on one developed by Automattic ([http://wordpress.com/tos/](http://wordpress.com/tos/)) with amendments by Dreamwidth ([http://www.dreamwidth.org/legal/tos](http://www.dreamwidth.org/legal/tos)) and is licensed under a [Creative Commons Attribution-ShareAlike 2.5 License](http://creativecommons.org/licenses/by-sa/2.5/).

View File

@@ -1,7 +1,7 @@
%a{:name => "comments"}
- if post.comments
%h2
=pluralize(post.comments.size, "comment")
=localize_plural(post.comments, Comment)
- post.comments.post_order.each do |c|
= render :partial => "comments/single", :locals => { :comment => c }

View File

@@ -9,13 +9,16 @@
.post-meta
%p
= (post.created_at == post.updated_at) ? 'Posted by' : 'Edited by'
Posted by
= link_to post.author.login_name, member_path(post.author)
- if post.forum
in
= link_to post.forum, post.forum
on
= (post.created_at == post.updated_at) ? post.created_at : post.updated_at
= post.created_at
- if post.updated_at > post.created_at
and edited at
= post.updated_at
.post-body
:growstuff_markdown
@@ -24,7 +27,7 @@
- unless defined?(hide_comments)
.post-comments
%ul.list-inline
%li.first= link_to pluralize(post.comments.size, "comment"),
%li.first= link_to localize_plural(post.comments, Comment),
post_path(post, :anchor => 'comments')
-if can? :create, Comment
%li= link_to "Reply", new_comment_path(:post_id => post.id)

View File

@@ -15,7 +15,10 @@
%td.hidden-xs
=link_to post.author, post.author
%td
= post.recent_activity.to_date.to_formatted_s(:short)
- if post.updated_at > post.recent_activity
= post.updated_at.to_date.to_formatted_s(:short)
- else
= post.recent_activity.to_date.to_formatted_s(:short)
// once the site gets more active, can change this to include time as well
// can't make it relative (distance_of_time_in_words) as it's cached
%td.hidden-xs

View File

@@ -15,7 +15,7 @@
= render :partial => 'shared/signin_signup', :locals => { :to => 'write a post' }
%div.pagination
= page_entries_info @posts, :model => "posts"
= page_entries_info @posts
= will_paginate @posts
- unless @posts.empty?
@@ -23,7 +23,7 @@
= render :partial => "single", :locals => { :post => post, :subject => true }
%div.pagination
= page_entries_info @posts, :model => "posts"
= page_entries_info @posts
= will_paginate @posts
%p

View File

@@ -1,4 +1,11 @@
= content_for :title, @post.subject
- content_for :opengraph do
= tag("meta", property: "og:image", content: avatar_uri(@post.author, 200))
= tag("meta", property: "og:description", content: "#{strip_tags(@post.body).split(' ')[0..20].join(' ')}...")
= tag("meta", property: "og:title", content: @post.subject)
= tag("meta", property: "og:type", content: "article")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
- unless current_member
.alert.alert-info

View File

@@ -1,3 +1,12 @@
- content_for :opengraph do
- @scientific_name.crop.photos.each do |photo|
= tag("meta", property: "og:image", content: photo.fullsize_url)
= tag("meta", property: "og:title", content: @scientific_name.scientific_name)
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
%p#notice= notice
= render :partial => 'crops/approval_status_message', :locals => { :crop => @scientific_name.crop }

View File

@@ -16,24 +16,29 @@
Can't find what you're looking for?
= link_to "Request new crops.", new_crop_path
.form-group
= f.label :quantity, 'Quantity:', :class => 'control-label col-md-2', :placeholder => 'optional'
= f.label :quantity, 'Quantity:', :class => 'control-label col-md-2'
.col-md-2
= f.number_field :quantity, :class => 'form-control', placeholder: 'optional'
= f.number_field :quantity, :class => 'form-control'
= render :partial => 'shared/form_optional'
.form-group
= f.label :plant_before, 'Plant before:', :class => 'control-label col-md-2'
.col-md-2
= f.text_field :plant_before, :class => 'add-datepicker form-control', :value => @seed.plant_before ? @seed.plant_before.to_s(:ymd) : '', placeholder: 'optional'
= f.text_field :plant_before, :class => 'add-datepicker form-control', :value => @seed.plant_before ? @seed.plant_before.to_s(:ymd) : ''
= render :partial => 'shared/form_optional'
.form-group
= f.label :days_until_maturity_min, 'Days until maturity:', :class => 'control-label col-md-2', :placeholder => 'optional'
= f.label :days_until_maturity_min, 'Days until maturity:', :class => 'control-label col-md-2'
%fieldset
.col-md-2
= f.number_field :days_until_maturity_min, :class => 'form-control', placeholder: 'optional'
= f.number_field :days_until_maturity_min, :class => 'form-control'
= render :partial => 'shared/form_optional'
.col-md-1
= f.label :days_until_maturity_max, 'to', :class => 'control-label'
.col-md-2
= f.number_field :days_until_maturity_max, :class => 'form-control', placeholder: 'optional'
= f.number_field :days_until_maturity_max, :class => 'form-control'
= render :partial => 'shared/form_optional'
.col-md-1
= f.label :dummy, 'days', :class => 'control-label'
.form-group.required
= f.label :organic, 'Organic?', :class => 'control-label col-md-2'
.col-md-8
@@ -49,15 +54,12 @@
.form-group
= f.label :description, 'Description:', :class => 'control-label col-md-2'
.col-md-8
= f.text_area :description, :rows => 6, :class => 'form-control', :placeholder => 'optional'
= f.text_area :description, :rows => 6, :class => 'form-control'
= render :partial => 'shared/form_optional'
.form-group
.col-md-offset-2.col-md-8
%span.help-block
Are you interested in trading or swapping seeds with other
#{ENV['GROWSTUFF_SITE_NAME']} members? If you
list your seeds as available for trade, other members can
contact you to request seeds. You can list any conditions or
other information in the description, above.
= t('.trade_help', :site_name => ENV['GROWSTUFF_SITE_NAME'])
.form-group.required
= f.label :tradable_to, 'Will trade:', :class => 'control-label col-md-2'
.col-md-8

View File

@@ -1,7 +1,7 @@
.panel.panel-success
.panel-heading
%h3.panel-title
= link_to "#{seed.owner.login_name}'s seed", seed.owner
= link_to "#{seed.owner.login_name}'s seed", seed
- if can? :edit, seed
%a.pull-right{:href => edit_seed_path(seed), :role => "button", :id => "edit_seed_glyphicon"}
%span.glyphicon.glyphicon-pencil{:title => "Edit"}
@@ -21,6 +21,8 @@
%dd= seed.tradable_to
%dt From location :
%dd= seed.owner.location
%dt Owner :
%dd= link_to seed.owner.login_name, seed.owner
.panel-footer
%dt Description
%dd

View File

@@ -21,7 +21,7 @@
= render :partial => 'shared/signin_signup', :locals => { :to => 'add seeds to your stash' }
%div.pagination
= page_entries_info @seeds, :model => "seeds"
= page_entries_info @seeds
= will_paginate @seeds
.row
- if @seeds.size > 0
@@ -30,7 +30,7 @@
=render :partial => 'seeds/thumbnail', :locals => {:seed => seed}
%div.pagination
= page_entries_info @seeds, :model => "seeds"
= page_entries_info @seeds
= will_paginate @seeds
%ul.list-inline

View File

@@ -1,4 +1,13 @@
- content_for :title, "#{@seed.owner}'s #{@seed.crop} seeds"
- content_for :opengraph do
- @seed.crop.photos.each do |photo|
= tag("meta", property: "og:image", content: photo.fullsize_url)
- if @seed.description
= tag("meta", property: "og:description", content: @seed.description)
= tag("meta", property: "og:image", content: "#{@seed.owner}'s #{@seed.crop} seeds")
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
.row
.col-md-6
@@ -35,7 +44,7 @@
- else
(from
= succeed ")" do
= link_to @seed.owner.location, place_path(@seed.owner.location)
= link_to @seed.owner.location, place_path(@seed.owner.location, anchor: "seeds")
%p
%b Description:
@@ -57,3 +66,8 @@
.col-md-6
= render :partial => "crops/index_card", :locals => { :crop => @seed.crop }
- if @seed.owner.location
%p
%small
View other seeds, members and more near
= link_to @seed.owner.location, place_path(@seed.owner.location, anchor: "seeds")

View File

@@ -0,0 +1,6 @@
- flash.each do |type, content|
%div{ class: build_alert_classes(type), role: "alert" }
%button.close{ type: "button", "data-dismiss" => "alert" }
%span{ "aria-hidden" => true } &times;
%span.sr-only Close
= content

View File

@@ -0,0 +1,2 @@
%span.help-block.optional
= I18n.t 'optional', :scope => 'forms'

View File

@@ -1,211 +0,0 @@
-content_for :title, 'Support - Frequently Asked Questions'
:markdown
## About Growstuff
### Who runs Growstuff?
Growstuff is run by Alex Bayley ([Skud](/members/skud)) an open source
software developer and keen veggie gardener from Melbourne, Australia.
### How did Growstuff get started?
The idea of Growstuff came out of a discussion at an open source conference in Spain in 2012. We wanted a free, open source of information about planting and growing crops, and realised the best way to do this would be to crowdsource it from gardeners around the world.
We first set up Growstuff as an open source project in August 2012, and quietly launched it in March 2013. We are planning to have a full public launch in May 2013.
### Is Growstuff a non-profit?
No, Growstuff is a for-profit business (Growstuff Pty Ltd), incorporated in Australia. The business helps provide hosting and support for the Growstuff website. However, we make our best efforts to operate as an ethical, transparent, and community-minded company. You should also know that software and aggregated data about crops and who's growing them are freely available under open licenses. You might like to read [Why Growstuff is Open Source](http://blog.growstuff.org/2013/02/20/why-growstuff-is-open-source/) to understand some of the reasoning behind that.
### How does Growstuff make money?
We will offer paid subscriptions/memberships, which give you access to special features and a warm glow of knowing you're supporting a sustainable, community-focused project.
### Can I advertise on Growstuff?
Sorry, we're 100% ad-free!
If you're a member, you can post things to trade or sell in our trading post area, but we don't have and will never have banner ads or the like. We believe that supporting a website through outside advertising makes for a less pleasant experience for our members and visitors, and is not a sustainable business model.
### What's the status of Growstuff? Is it in beta?
We don't much like the word "beta" or the idea it represents.
Growstuff is in a constant state of change and improvement, and we
hope we will always be adding new features and making things better
for our members.
If you find any bugs or problems, please let us know via our support
forum. If a feature you want isn't available yet, check back soon!
## Membership and payments
### Can I use Growstuff for free?
Absolutely! You can sign up right now for a no-cost membership and use it for as long as you want, perhaps forever.
### Can I get a membership for my family, school, or community group?
Yup! Feel free to sign up as "JonesFamily" or "SmithfieldCommunity" or whatever floats your boat.
Just keep in mind that you are responsible for anything that happens under that account, so be careful who you allow to use it. In due course, we are hoping to develop features to help community gardens share with their members/gardeners, so that they can track what's planted in the community garden without having to login as the community garden account. We'll publicise this widely when it's ready, so keep an ear to the ground.
### What other types of accounts are there?
You can purchase a paid account which will give you access to special
features, and a warm glow of knowing you're supporting a
community-focused, open source project. You can see the current list
of paid account options in our [shop](/shop).
## Profile, settings, and privacy
### How do I add a picture to my profile?
Profile pictures are provided [Gravatar](http://gravatar.com Gravatar), a service that provides "Globally Recognised Avatars", run by the people who operate the Wordpress blogging platform.
If you have ever signed up for Gravatar in the past, using the same address as you signed up for Growstuff, you will already have a picture for your profile.
If you have signed up for Growstuff with a different email address than your Gravatar address, you will need to add it on Gravatar.
If you have never signed up for Gravatar before, you can create an account and upload a picture, which will appear not only on Growstuff, but on any other site which supports Gravatars and where you use the same email address.
### Do I have to fill in all this personal stuff?
Your profile asks several questions about you, which you can choose to answer (or not) as you see fit. We don't require personal information like your legal name, gender, or age for tracking or demographic purposes -- one of the benefits of not having ads on our site!
When it comes to location, it really helps if you can provide that to Growstuff because we use it to suggest things to grow. However, you can do it at whatever level of detail you're comfortable with: perhaps the name of your town, or your state or province, or even your country if the country is small enough and has a fairly consistent climate. Just choose something that is close enough to give you accurate growing advice, and vague enough to feel safe.
You can read more about the privacy of your information in our [Privacy Policy](http://growstuff.org/policy/privacy).
## Crops, gardens, and planting
### How can I add a new crop?
For now, please drop a note in [Requests for new crops](http://www.growstuff.org/posts/skud-20130319-requests-for-new-crops) on our [Feedback & Support forum](http://www.growstuff.org/forums/growstuff-feedback-support).
### Will you add non-edible plants?
We do not currently have plans to add plants which are not edible or which are not "useful" in a food-growing or sustainability context -- these might include companions plants, green manure crops, plants used to manage pests or diseases, and the like. If you're thinking of purely ornamental plants, we probably won't be adding them anytime soon.
However, we are hoping, in future, to support the ability for any member to plant "unofficial" plants that aren't in our crop database.
## Posting, commenting, and forums
### What formatting can I use in posts and comments?
We use [Markdown](http://daringfireball.net/projects/markdown/syntax/) syntax, which offers a pretty wide range of options from simple emphasis (bold and italics) to links, pictures, and more. We're hoping to install a toolbar to help you generate the right syntax, but in the meantime I'm afraid all we can offer is the rather technical documentation linked above.
## Forthcoming features
### Where can I see what features are planned?
Our software developers use a tracking tool called Pivotal Tracker, and you can see ours at [http://tracker.growstuff.org/](http://tracker.growstuff.org). This tells you what features we are currently working on and plan to work on soon.
Pivotal Tracker's interface shows three columns of information:
* the "Current" section shows the features (called "stories") that we're working on at the moment
* "Backlog" shows you stories that we're planning to work on in the nearish future
* "Icebox" contains stories that we've identified as things we'd like to do, but which don't have a timeframe set yet.
### Where can I suggest a feature I'd like to see?
We suggest checking the [tracker](http://tracker.growstuff.org/) first (see above) to see if it's something we're already planning or talking about. Once you've done that, if it's not already planned or you have some other comments to make, you can post your suggestion in the [Feedback & Support forum](http://www.growstuff.org/forums/growstuff-feedback-support].
## Developers and API
### Is there a Growstuff API?
At present there is no official API, as our site is still changing so
rapidly. However, we do expose some of our data via JSON and/or RSS
feeds, and you're welcome to play with it, on the understanding that
it may change under you. You can find [API docs on our wiki](http://wiki.growstuff.org/index.php/API).
Use of our API and data is subject to the [API and Data Use Policy](http://www.growstuff.org/policy/api).
### What license is your data under?
Growstuff's data is licensed under the [Creative Commons Attribution Share-Alike license (CC-BY-SA) 3.0 Unported license](http://creativecommons.org/licenses/by-sa/3.0/). This means you can re-use it as long as you attribute it to Growstuff (by linking back to our site), and as long as your own app/site/project shares its own content or data under CC-BY-SA.
See our [API and Data Use Policy](http://growstuff.org/policy/api) for more information.
## Volunteering and jobs
### Are you hiring?
Sadly, no. We're a self-funded/bootstrapped company, and at present we're not even paying ourselves.
When we are ready to hire, we will most likely look first to people we know from our community. If you want to get involved, see below.
### How can I volunteer to help Growstuff?
First and foremost, by being an active member of the site -- growing crops, tracking your harvests, posting in our forums, getting to know other members -- you help build our database and our community, without which Growstuff would be completely pointless. So, thanks for that!
Secondly, we'd love it if you could spread the word about Growstuff to your friends who grow their own food or who might like to try. You can see some tips on how to do that below.
Growstuff's software is built with the help of volunteer developers, too. If you're a coder or would like to learn how to code, you can join us in that. All are welcome, regardless of experience.
We also have volunteer crop wranglers, who manage our crops database, and moderators, who help keep the forums running smoothly. These are usually chosen from among our most active and helpful members.
### How can I get involved as a coder?
Start by checking out our [wiki](http://wiki.growstuff.org/), code on [Github](http://github.com/Growstuff/growstuff), and [tracker](http://tracker.growstuff.org) to get an idea of how we work.
If you want to get involved, you should join our [discussion mailing list](http://lists.growstuff.org/mailman/listinfo/discuss) and/or come hang out on our [IRC channel](http://wiki.growstuff.org/index.php/IRC), #growstuff on irc.freenode.net.
### My coding skills are rusty or non-existent. Can I still get involved?
Sure! We love to mentor new coders, people who haven't coded in a while, or people who are just learning our platform (Ruby on Rails) for the first time. We work by pair programming, and can get you started on easy stories, starting with something as simple as fixing a typo or HTML tag (check the "easy" tag in our [tracker](http://tracker.growstuff.org) for some examples).
### How can I help spread the word about Growstuff?
First and foremost, by telling your friends and inviting them to join and be part of it. We don't want to be spammy about it, so we'll never ask to scrape your address book or automatically post Facebook updates or tweet on your behalf. But we would really love it if you'd tell people in your own words.
Places to spread the word online: Facebook, Twitter, and other social media; your own blog or website; gardening or sustainability forums you participate in.
Or offline: tell friends, family and neighbours; spread the word through your local community gardens, farmers markets, or produce swaps; contact your local sustainability or Transition group; or any other place where you think food-growers might be.
## Terms of service, copyright, and other abuse
### Where can I report a violation of the Terms of Service or Community Guidelines?
You can post in our [Feedback & Support forum](http://www.growstuff.org/forums/growstuff-feedback-support) or send email to [support@growstuff.org](mailto:support@growstuff.org).
### What do you consider spam, and how can I report it?
There are many kinds of spam. The most obvious is repeated, unwanted commercial advertising. Many spammers also post irrelevant, nonsensical, or low-value content to forums to try and get you to click on a link, or just to see what they can get away with.
Please report all these kinds of spam!
For now, because we're so new, we don't have a good spam reporting mechanism set up. However, you can drop a link in our [Feedback & Support forum](http://www.growstuff.org/forums/growstuff-feedback-support) and we'll do what we can.
### Someone posted something I believe is copyright. Where can I report it?
If you are the copyright owner, you can submit a complaint by following the procedure outlined in our [Copyright Infringement Policy](http://growstuff.org/policy/copyright).
### Is Growstuff safe for kids to use?
As a website that's focused on growing food, we expect Growstuff to be a pretty safe and friendly environment. However, some parts of the site (such as posts made by members) may contain mature concepts, coarse language, and the like. If you don't want your kids exposed to these, we strongly suggest you supervise their use of Growstuff. We also suggest you be careful about what personal information your kids share on Growstuff.
## Further support
### Where can I find a list of known issues with the site?
In the [Known Issues](http://www.growstuff.org/posts/skud-20130319-known-issues) post on our [Feedback & Support forum](http://www.growstuff.org/forums/growstuff-feedback-support).
### My question's not answered here. Where can I ask for further support?
On our [Feedback & Support forum](http://www.growstuff.org/forums/growstuff-feedback-support). Please check the list of known issues before posting.
### Where can I post feedback/kudos?
We love feedback! Drop us a note in our [Feedback & Support forum](http://www.growstuff.org/forums/growstuff-feedback-support). (Is there an echo in here?)
### How else can I contact you?
If you need help with something that hasn't been covered here, then you can send an email to [support@growstuff.org](mailto:support@growstuff.org).
Media/press enquiries can go to [media@growstuff.org](mailto:media@growstuff.org).
If you have an enquiry about the site in general (eg. businessy stuff, or just want to get in touch with someone official in a non-support-like way), you can send an email to [info@growstuff.org](mailto:info@growstuff.org).

View File

@@ -82,12 +82,6 @@ module Growstuff
g.javascripts false
end
config.action_mailer.delivery_method = :sendmail
config.action_mailer.sendmail_settings = {
location: '/usr/sbin/sendmail',
arguments: '-i -t',
openssl_verify_mode: 'none'
}
# Growstuff-specific configuration variables
config.currency = 'AUD'
@@ -112,5 +106,6 @@ module Growstuff
# didn't work for us.
config.cloudmade_key = '29a2d9e3cb3d429490a8f338b2388b1d'
config.active_record.raise_in_transactional_callbacks = true
end
end
end

View File

@@ -0,0 +1,31 @@
development:
adapter: postgresql
database: growstuff_dev
host: localhost
user: postgres
password: postgres
test:
adapter: postgresql
database: growstuff_test
host: localhost
user: postgres
password: postgres
production:
adapter: postgresql
database: growstuff_prod
pool: 5
timeout: 5000
username: growstuff
host: localhost
password: thisisnottherealpassword
staging:
adapter: postgresql
database: growstuff_prod
pool: 5
timeout: 5000
username: growstuff
host: localhost
password: thisisnottherealpassword

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