Compare commits

...

896 Commits

Author SHA1 Message Date
Skud
1a7fc57f66 Merge pull request #643 from Growstuff/dev
Production push: release 7
2015-01-16 22:24:08 +11:00
Skud
175996ce90 Merge pull request #637 from pozorvlak/update_contributors
Update CONTRIBUTORS.md with the current committers
2015-01-16 22:09:42 +11:00
pozorvlak
f70f82014f Merge pull request #642 from Skud/release7_tweaks
Release7 tweaks
2015-01-16 11:02:31 +00:00
Skud
8756808444 Show members on homepage 3-across (not 2-across) 2015-01-16 21:47:24 +11:00
Skud
bb6e798bce Fix stylesheets for various thumbnail displays 2015-01-16 21:46:44 +11:00
Skud
a5c226d128 Tweaked homepage crop display to match resized columns
- made columns 8/4 rather than 6/6
- show 8 interesting crops, not 12
- show 6 recent plantings, not 4
- use crop thumbnail with visible name/info/etc, rather than popup
version
- tweaked aforementioned thumbnail to have no border, and centre-align
the text
2015-01-16 21:37:15 +11:00
Miles Gould
c7bcbf6323 Update CONTRIBUTORS.md with the current committers 2015-01-15 14:49:12 +00:00
pozorvlak
f3302a9e30 Merge pull request #636 from rocky-jaiswal/upgrade/update_rails_4_1_9
Upgrade/update rails 4 1 9
2015-01-15 14:42:31 +00:00
Rocky Jaiswal
1e331fc19d adding rocky jaiswal in contributors. 2015-01-15 15:25:42 +01:00
Rocky Jaiswal
31a7011260 update to latest patch on rails 4.1 2015-01-15 15:25:21 +01:00
pozorvlak
181c36cdc9 Merge pull request #635 from tygriffin/fix-cache-key
Fix cache key
2015-01-15 11:37:24 +00:00
Taylor Griffin
36ac0b75e7 decoy commit to test if travis / phantomjs error was spurious 2015-01-15 22:23:27 +11:00
Taylor Griffin
d5aef16860 add comment 2015-01-15 21:35:10 +11:00
Taylor Griffin
55ba535353 pass in additional parameters to make a more uniquely identifying cache key 2015-01-15 21:21:40 +11:00
Taylor Griffin
a510489570 Merge pull request #631 from Skud/newfooter
New footer
2015-01-14 22:45:41 +11:00
Taylor Griffin
fcbc6002d1 Merge pull request #623 from pozorvlak/seo_crop_detail_page
Add SEO-friendly language to the crop detail page
2015-01-14 22:40:25 +11:00
Skud
eeb48e2ad6 Removed sidebar from homepage.
Also removed extraneous view tests for things we no longer have.
2015-01-13 20:13:33 +11:00
Skud
b114ed2414 Improved sitewide footer (fixes #526) 2015-01-13 20:07:59 +11:00
Skud
1064f39020 Merge pull request #626 from pozorvlak/authentications_page_die_die_die
Remove authentications page and extraneous routes
2015-01-13 10:39:06 +11:00
Skud
b5a460a1b7 Merge pull request #624 from pozorvlak/inflections
Add inflections for irregular plural crop names
2015-01-13 10:38:58 +11:00
pozorvlak
9a961b80e5 Merge pull request #627 from tygriffin/seed-by-env
don't load test and admin users in staging
2015-01-12 13:55:37 +00:00
Taylor Griffin
7bc05fa118 typo 2015-01-12 22:16:42 +11:00
Taylor Griffin
f7af7e649d update comment to reflect code changes 2015-01-12 20:13:00 +11:00
Taylor Griffin
4efb93ea45 don't load test and admin users in staging 2015-01-12 07:48:48 +11:00
Miles Gould
a5edb6497c Display lack-of-posts nicely on crop page. 2015-01-11 12:08:57 +00:00
Miles Gould
d6314ea9a1 SEO: add crop name everywhere 2015-01-11 12:08:57 +00:00
Miles Gould
c244ca672f Add tests for SEO of crop detail page 2015-01-11 12:08:57 +00:00
Miles Gould
401777cc4c Add some irregular plurals. 2015-01-11 12:02:02 +00:00
Miles Gould
7ef8afb1ba Tests for crop inflections 2015-01-11 12:02:02 +00:00
Miles Gould
e25bb5578a Remove extraneous authentication routes. 2015-01-11 11:57:13 +00:00
Miles Gould
401f3e176e Remove the authentications index page 2015-01-11 11:57:13 +00:00
Taylor Griffin
10ae117914 Merge pull request #451 from tygriffin/rails4-upgrade
Rails4 upgrade
2015-01-11 21:12:44 +11:00
Taylor Griffin
86cea2ad9f add current_password to permitted params 2015-01-11 14:55:12 +11:00
Taylor Griffin
ccef46a5cf add more permitted parameters to member update 2015-01-11 14:32:19 +11:00
Taylor Griffin
c803da3dfa fix planted_at on planting create bug 2015-01-11 14:00:51 +11:00
Taylor Griffin
02ff45f705 broaden seeding for staging env 2015-01-11 09:41:04 +11:00
Taylor Griffin
8a05a959c3 remove depricated method 2015-01-10 15:46:36 +11:00
Taylor Griffin
e5d407b1ce replace depricated method 2015-01-10 15:35:54 +11:00
Taylor Griffin
5cd53be5be change post route to get per omniauth docs 2015-01-10 14:59:04 +11:00
Taylor Griffin
c6cc8ee6bb configure devise account update for strong parameters 2014-12-31 18:32:37 +11:00
Taylor Griffin
eaf4ea04ac Merge branch 'dev' of https://github.com/Growstuff/growstuff into rails4-upgrade 2014-12-20 20:45:13 +11:00
Taylor Griffin
007f7112a7 replaced caching using observers with a key-based (and simplified) caching system 2014-12-19 21:17:43 +11:00
Skud
9d49a83918 Merge branch 'dev' of https://github.com/Growstuff/growstuff into dev 2014-12-17 17:34:42 +11:00
Skud
901fed7d35 Added non-code contribution tips 2014-12-17 17:34:18 +11:00
Skud
6deb0c659a Removed references to PT 2014-12-17 17:34:06 +11:00
Taylor Griffin
f62fd8484a get rid of annoying warning about doubly loaded files when running tests 2014-12-15 21:13:22 +11:00
Taylor Griffin
849bdac81b include module that holds expire_fragment method 2014-12-15 21:02:44 +11:00
Taylor Griffin
c1d2f2c9cc resolve conflicts 2014-12-15 07:17:11 +11:00
Taylor Griffin
d92d22d99c include ActionController::Caching in Sweeper class 2014-12-14 21:03:10 +11:00
Taylor Griffin
8829acba3f removed depricated method 2014-12-14 15:54:43 +11:00
Taylor Griffin
66c4a19ad6 revert to previous smtp settings 2014-12-14 15:41:29 +11:00
Taylor Griffin
a65b78084f change staging smtp settings 2014-12-14 15:36:56 +11:00
Taylor Griffin
cdaa9c03a2 Merge branch 'rails4-upgrade' 2014-12-14 14:51:36 +11:00
Taylor Griffin
a35a573b2b update follow member code to be rails 4 compatible 2014-12-14 14:51:18 +11:00
Taylor Griffin
0afd9dfbe2 Merge pull request #608 from pozorvlak/libv8_fix
Fix problems installing libv8 on OS X.
2014-12-14 12:08:01 +11:00
Miles Gould
c446ea9232 Upgrade libv8 to v3.16.14.7.
The old version was breaking `bundle install` on OS X.
2014-12-13 11:56:18 +00:00
Miles Gould
43c241219d Update .ruby-version to match Gemfile. 2014-12-13 11:56:18 +00:00
Skud
77e424c412 Merge branch 'juzham-facebook_button' into dev 2014-12-13 08:26:22 +11:00
Skud
82b70cf893 Merge branch 'facebook_button' of https://github.com/juzham/growstuff into juzham-facebook_button
Conflicts:
	CONTRIBUTORS.md
2014-12-13 08:26:07 +11:00
Justin Hamman
6b0a298fd1 modified order and text for Facebook 2014-12-12 23:33:53 +11:00
Justin Hamman
78c6220262 updated the homepage to include a facebook icon. Updated all 'keep in touch' icons to be clickable and open new browser windows 2014-12-12 22:56:50 +11:00
Justin Hamman
6f2fa1b72b add facebook test 2014-12-12 22:27:52 +11:00
Taylor Griffin
314cdc687a precompiled assets 2014-12-12 22:00:30 +11:00
Taylor Griffin
df3b300967 remove '/assets' from references to assets 2014-12-12 21:31:22 +11:00
Skud
b520f9e78b Update CONTRIBUTORS.md
Removed duplicate contributor
2014-12-12 18:43:42 +11:00
Skud
b7d9924fa7 Merge pull request #462 from kevieyang/upgrade_ruby_version
Modified ruby from 2.1.2 to 2.1.5
2014-12-10 08:49:15 +11:00
Skud
ea41021ae8 Merge pull request #463 from yoongkang/cancanredirect
Fix for redirect sign-in not working for all models
2014-12-10 08:48:31 +11:00
Kevin Yang
7f88157696 removed whitespace 2014-12-09 14:11:29 +00:00
Yoong Kang Lim
a69210ae6b Explicitly add spec for notification 2014-12-09 22:07:41 +11:00
Yoong Kang Lim
de26dd3708 to_s not needed 2014-12-09 21:42:17 +11:00
Yoong Kang Lim
2fc6bfb77f Merge remote-tracking branch 'upstream/dev' into cancanredirect 2014-12-09 21:32:01 +11:00
Yoong Kang Lim
837121265a Reversed order of authorization and authentication. Also added tests 2014-12-09 21:27:16 +11:00
Kevin Yang
5e2a3db8c2 Added myself to Contributors.md 2014-12-09 20:44:46 +11:00
kevieyang
969c530193 Update .travis.yml
upgrading ruby 2.1.2 to 2.1.5
2014-12-09 20:32:47 +11:00
Kevin Yang
e9e238016b Merge branch 'dev' of https://github.com/Growstuff/growstuff into upgrade_ruby_version 2014-12-09 20:28:54 +11:00
Kevin Yang
899d3c3dbe Modified ruby from 2.1.2 to 2.1.5 2014-12-09 20:25:45 +11:00
Skud
7227c1f330 Merge pull request #455 from yoongkang/cancanredirect
Redirect to sign-in page for any action that requires authentication
2014-12-09 20:17:58 +11:00
Skud
609f3a46b2 Merge pull request #461 from emmawinston/more_semantic_markup
Made crop thumbnail markup more semantic
2014-12-09 19:09:45 +11:00
emmawinston
58728f6a61 Made crop thumbnail markup more semantic 2014-12-05 02:45:39 +00:00
Skud
94df504840 Merge pull request #459 from Skud/brassicafix
Fix parent crop for B. oleracea Acephela group
2014-12-03 14:59:17 +11:00
Skud
c1bcbd2e7d Fix parent crop for B. oleracea Acephela group 2014-12-03 14:58:46 +11:00
Skud
e5d71df294 Merge pull request #458 from Skud/brassicafix
Fixed ordering and capitalisation in brassica import
2014-12-03 14:51:07 +11:00
Skud
a47328eed4 Fixed ordering and capitalisation in brassica import 2014-12-03 14:50:25 +11:00
Skud
0c30f2198c Merge pull request #437 from pozorvlak/load_alternate_names
Load alternate names for crops
2014-12-01 22:22:24 +11:00
Miles Gould
9f54641e95 Find crops by name when loading altnames
Crop IDs are not guaranteed to be the same on staging and production.
2014-12-01 11:03:27 +00:00
Miles Gould
4b90f6385b Merge branch 'dev' into load_alternate_names
Conflicts:
	Gemfile.lock
	script/deploy-tasks.sh
2014-12-01 10:47:10 +00:00
pozorvlak
751a66b49b Merge pull request #457 from Skud/multiple_scinames
Multiple scientific and alternate names
2014-12-01 10:33:46 +00:00
Skud
6f3e430840 Add deploy tasks for new crops 2014-12-01 21:23:15 +11:00
Skud
d0b61c259d Added squashes and new crops from London working bee 2014-12-01 21:20:44 +11:00
Skud
30c91eb23f Tidy up sidebar on crop detail page 2014-12-01 21:14:44 +11:00
Skud
82a5379a25 Added mint family and brassica crops (seed files) 2014-12-01 20:53:17 +11:00
Skud
593a20c0c5 Load alternate names from CSV 2014-11-30 16:06:43 +11:00
Taylor Griffin
d174f25d03 order messages to be most recent 2014-11-30 16:06:06 +11:00
Taylor Griffin
e7bb285b8e Merge pull request #448 from yoongkang/followerdev
Allow members to follow other members
2014-11-30 16:04:35 +11:00
Yoong Kang Lim
b06d48091e Indentation problem 2014-11-30 15:50:13 +11:00
Skud
844791ead9 Allow multiple comma-separated scientific names 2014-11-30 15:48:58 +11:00
Yoong Kang Lim
73d6b5065b Use factorygirl aliases 2014-11-30 15:25:48 +11:00
Yoong Kang Lim
7ddaca6e11 Use .size instead of .count 2014-11-30 15:19:50 +11:00
Yoong Kang Lim
2036a0f2e9 Used environment variable for site name instead 2014-11-30 15:18:13 +11:00
Yoong Kang Lim
27ad791f67 Merge remote-tracking branch 'upstream/dev' into followerdev 2014-11-30 15:16:48 +11:00
Yoong Kang Lim
13c98eac89 Wrapped tests around context blocks to clarify the purpose of the tests. 2014-11-30 15:14:56 +11:00
Justin Hamman
6d2d6a51d5 Merge branch 'dev' of https://github.com/Growstuff/growstuff into dev 2014-11-30 15:02:20 +11:00
Skud
4e19da56a0 Rearrange fields in crop uploads (sci names last) 2014-11-30 14:51:33 +11:00
Taylor Griffin
cf7ead3d84 Merge branch 'dev' of https://github.com/Growstuff/growstuff into rails4-upgrade 2014-11-30 14:36:10 +11:00
Yoong Kang Lim
969f7e7c23 Merge remote-tracking branch 'upstream/dev' into cancanredirect 2014-11-30 14:25:08 +11:00
Taylor Griffin
14e8c367e1 Merge pull request #456 from Skud/paidaccountbug
Fixed a bug which only occurs in the few months before February
2014-11-30 14:23:19 +11:00
Skud
924efe6af5 Fixed a bug which only occurs in the few months before February
This is the fundamental problem:

    2.1.2 :005 > Time.zone.now + 3.months
    => Sat, 28 Feb 2015 03:17:24 UTC +00:00
    2.1.2 :006 > Time.zone.now + 3.months + 3.months
    => Thu, 28 May 2015 03:17:32 UTC +00:00
    2.1.2 :007 > Time.zone.now + 6.months
    => Sat, 30 May 2015 03:17:37 UTC +00:00

I changed the test to use the "3.months + 3.months" formulation and it
now passes.
2014-11-30 14:19:55 +11:00
Justin Hamman
23f524a236 Merge branch 'master' of https://github.com/Growstuff/growstuff into dev 2014-11-30 14:06:48 +11:00
Skud
39b47b0d08 Merge pull request #454 from krio/rearrange-rss-titles
Rearrange titles on RSS feeds
2014-11-30 13:37:30 +11:00
Taylor Griffin
18c40809a6 Merge branch 'dev' of https://github.com/Growstuff/growstuff into rails4-upgrade 2014-11-29 22:20:58 +11:00
Yoong Kang Lim
81d1189203 Added a before_filter for any action that requires authentication. Will redirect to login page if not logged in 2014-11-24 22:12:42 +11:00
Kevin Rio
2111cddaef RSS feed tests 2014-11-23 21:02:56 -05:00
Kevin Rio
eb4fae463f Comments RSS tests 2014-11-23 11:47:48 -05:00
Yoong Kang Lim
8c55a6101d Formatting problem 2014-11-21 01:14:12 +11:00
Yoong Kang Lim
2ca42bbae3 Slight modification to the notification wording. 2014-11-21 01:05:23 +11:00
Yoong Kang Lim
5de6759917 Moved number of follows/followers under activity and added pagination. 2014-11-21 00:29:45 +11:00
Yoong Kang Lim
aeb7192f48 Break up tests into different scenarios. Defined cancan ability for follows and updated member profile view 2014-11-20 23:46:15 +11:00
Yoong Kang Lim
0ba6562d79 Added more model tests for following behaviour 2014-11-20 01:46:04 +11:00
Yoong Kang Lim
996043d8fb Renamed get_follow_id to get_follow as it does not return id. Also added unit tests for the new methods in the member model. 2014-11-20 01:10:28 +11:00
Yoong Kang Lim
0eb5ae58aa Renamed member_id column in Follow table to follower_id. Made necessary modifications to models and tests. 2014-11-20 00:42:46 +11:00
Skud
6aea16028e Merge pull request #452 from wsmoak/negative-area
Prevent the creation of a garden with a negative number for the area.
2014-11-19 17:18:09 +11:00
Skud
5f2ca6bc9d Merge pull request #450 from Skud/login_timeout
Login timeout
2014-11-19 17:18:02 +11:00
Skud
9861f8cf51 Merge pull request #447 from krio/add-edit-button-seeds-index
Add edit button to seeds index page
2014-11-19 17:17:52 +11:00
Skud
284c28ce9a Merge pull request #441 from yoongkang/editprofile
Removed "Edit Profile" button from home page
2014-11-19 17:17:27 +11:00
Skud
c674f30eb8 Merge pull request #453 from Growstuff/dev
Production push: planting reminders, crop details, harvest photos, finished plantings, etc
2014-11-19 16:53:55 +11:00
Wendy Smoak
02994bd5cc Added a test for the validator to show it doesn't accept negative numbers for garden area. 2014-11-18 20:58:00 -05:00
Wendy Smoak
53d782bc83 Prevent the creation of a garden with a negative number for the area. If entered, the area must be greater than or equal to zero. 2014-11-18 20:33:44 -05:00
Taylor Griffin
c83b01bbb7 catch up with dev 2014-11-18 22:59:43 +11:00
Taylor Griffin
fb595de457 edited configuration and dependencies 2014-11-18 22:24:58 +11:00
Taylor Griffin
acbd3f9a9e implement strong parameters instead of protected attributes 2014-11-18 20:08:54 +11:00
Taylor Griffin
98c1680138 handle misc deprications 2014-11-17 07:16:02 +11:00
Taylor Griffin
0ffe9adc86 tests are green 2014-11-16 21:40:43 +11:00
Taylor Griffin
56b4f8a221 mimick old FriendlyId behavior when calling find on a model - therefore, Model.find not Model.friendly.find (this probably needs review) 2014-11-16 20:21:34 +11:00
Taylor Griffin
f1945151c7 update RSpec true / false matchers 2014-11-16 14:40:50 +11:00
Taylor Griffin
cc31e864d5 update webrat and webrat matchers 2014-11-16 14:31:33 +11:00
Taylor Griffin
868e5c2079 upgrade jquery-ui-rails gem and config 2014-11-16 12:41:57 +11:00
Taylor Griffin
70185156aa use lambda instead of just relation in names scope 2014-11-16 12:11:56 +11:00
Taylor Griffin
7fc886f43c implement custom Sweeper class as stop gap against errors when running specs 2014-11-16 12:01:27 +11:00
Skud
93e468876d Remove old capistrano stuff, as we don't use it anymore 2014-11-16 10:17:22 +11:00
Skud
52cfa9f676 Changed staging environment hostname to staging.growstuff.org 2014-11-16 10:16:34 +11:00
Taylor Griffin
8e79199766 wip: upgrading rspec 2014-11-15 22:55:37 +11:00
Taylor Griffin
40a88b5b09 tests run but fail like whoa 2014-11-15 21:44:55 +11:00
Kevin Rio
65706f560b Add test to new edit seed link 2014-11-14 16:37:55 -05:00
Taylor Griffin
7d27251be3 Merge pull request #449 from Skud/login_timeout
Increase devise timeout to 30 days
2014-11-13 22:14:29 +11:00
Yoong Kang Lim
bd8be01ec7 Merge branch 'dev' into editprofile
Conflicts:
	CONTRIBUTORS.md
2014-11-13 21:38:05 +11:00
Yoong Kang Lim
3dbb585467 Removed edit profile button from home page
Added yoongkang to the contributors list

Feature test for edit profile button on homepage
2014-11-13 21:28:15 +11:00
Skud
bfce66a8f7 Increase devise timeout to 30 days 2014-11-13 11:28:14 +11:00
Skud
f56c184033 Merge branch 'tygriffin-finish-plantings-javascript' into dev 2014-11-13 10:58:06 +11:00
Skud
68dfdbeba1 Merge branch 'finish-plantings-javascript' of github.com:tygriffin/growstuff into tygriffin-finish-plantings-javascript
Conflicts:
	Gemfile
	Gemfile.lock
2014-11-13 10:57:55 +11:00
Skud
0ffa3a6d0f Merge pull request #438 from tygriffin/byebug
replace debugger with byebug
2014-11-13 10:51:53 +11:00
Taylor Griffin
c6f56a23d6 Adds binstubs for rails and rake 2014-11-13 07:26:10 +11:00
Kevin Rio
8d74fd52db Rearrange titles on RSS feeds
https://www.pivotaltracker.com/n/projects/646869/stories/50492161
2014-11-12 13:54:01 -05:00
Yoong Kang Lim
77f40a3dc2 Fixed comment + code style 2014-11-13 02:10:54 +11:00
Kevin Rio
43fa356670 Add edit button to seeds index page
https://www.pivotaltracker.com/n/projects/646869/stories/53958137
2014-11-12 09:56:05 -05:00
Yoong Kang Lim
03fea2a785 Remove dependent detroy as this wipes out both users. Woops. 2014-11-13 01:52:43 +11:00
Yoong Kang Lim
e687bd43dc Added model tests for follows 2014-11-13 01:22:28 +11:00
Yoong Kang Lim
b5e1b6bc22 Delete unused views, add feature tests 2014-11-13 00:46:34 +11:00
Skud
1749bc52f8 Merge pull request #446 from krio/switch-activity-contact
Switch "activity" and "contact" on member profile page
2014-11-12 17:59:37 +11:00
Kevin Rio
b6d2a078b1 Adding to contributors list 2014-11-11 23:28:22 -05:00
Kevin Rio
7023b4969b Update position of activity on member details page
Switched activity and contact.
2014-11-11 22:42:01 -05:00
pozorvlak
f233d502f7 Merge pull request #445 from yoongkang/plantingsfix
Plantings index should display finished at date instead of planted at under the finished column
2014-11-11 20:55:23 +00:00
Yoong Kang Lim
3c3eb1fd78 Fixed/improved method in member model 2014-11-12 01:53:47 +11:00
Yoong Kang Lim
cacc002a01 Added follow/unfollow buttons 2014-11-12 01:47:26 +11:00
Yoong Kang Lim
a9fdab5d7c Basic follower relationship 2014-11-12 00:23:01 +11:00
Yoong Kang Lim
caad748d08 Plantings index should display finished at date instead of planted at under the finished column.
Added feature test for plantings index page.
2014-11-11 22:41:29 +11:00
Taylor Griffin
5b13e8c797 Merge pull request #444 from Skud/plantingreminder
cweek not cw_week
2014-11-11 20:55:37 +11:00
Skud
267c671259 cweek not cw_week 2014-11-11 20:55:04 +11:00
Taylor Griffin
f8df8803ab catch up with upstream dev 2014-11-11 19:57:16 +11:00
Taylor Griffin
1d071c197a Merge branch 'dev' of https://github.com/Growstuff/growstuff into finish-plantings-javascript 2014-11-11 19:53:00 +11:00
Taylor Griffin
50b8acc67c put finished at bottom of list to make it more obvious when marking a planting finished 2014-11-11 19:52:31 +11:00
Taylor Griffin
3f23dd194d Merge pull request #443 from Skud/plantingreminder
Planting reminder - only send to confirmed accounts
2014-11-11 19:48:10 +11:00
Skud
98c07ff3f1 Merge branch 'dev' of https://github.com/Growstuff/growstuff into plantingreminder 2014-11-11 19:45:51 +11:00
Skud
eb98910bea Only send planting reminders to confirmed accounts 2014-11-11 19:45:07 +11:00
Taylor Griffin
954d5b8427 Merge pull request #442 from Skud/destroy_photo_destroyer
Fixed bug in deleting unused photos
2014-11-11 19:42:22 +11:00
Skud
2426c51951 Fixed bug in deleting unused photos
... and wow, my tests were really not testing what I thought they were
testing :-/
2014-11-11 19:29:32 +11:00
Taylor Griffin
af9aa690ba Merge branch 'dev' of https://github.com/Growstuff/growstuff into finish-plantings-javascript 2014-11-11 18:37:30 +11:00
pozorvlak
24d276da37 Merge pull request #420 from Skud/plantingreminder
Planting reminder
2014-11-07 14:31:43 +00:00
Skud
7b80db9596 Merge pull request #5 from pozorvlak/plantingreminder
Fix broken Capybara tests
2014-11-07 09:28:46 +11:00
Miles Gould
b989168887 Fix "shared example group previously defined" warning
We were getting the warning

```
WARNING: Shared example group 'crop suggest' has been previously defined
at:
  /Users/miles/src/growstuff/spec/features/shared_examples/crop_suggest_spec.rb:3
...and you are now defining it at:
  /Users/miles/src/growstuff/spec/features/shared_examples/crop_suggest_spec.rb:3
The new definition will overwrite the original one.
```

Following the suggestion at
https://github.com/rspec/rspec-core/issues/828#issuecomment-38789977,
I've renamed crop_suggest_spec.rb to crop_suggest.rb, which made the
error go away without reducing the number of tests run. RSpec must
have thought it was a spec file and loaded it directly, then loaded it
again when it was first required by an actual spec file.
2014-11-02 22:57:29 +00:00
Miles Gould
6921119301 Make Capybara actually hit the server.
Background:
http://talk.growstuff.org/t/mysteriously-broken-feature-tests/120

@oshiho3's suggested fix didn't work, so I tried all the suggestions at
http://stackoverflow.com/questions/6536503/capybara-with-subdomains-default-host
until I found one that fixed the problem.
2014-11-02 22:21:32 +00:00
Taylor Griffin
0ccd6e843a implement confirm without date functionality on appty on append date js 2014-10-23 22:43:38 +11:00
Taylor Griffin
9b10a7c3ce write shared example group for append date 2014-10-23 22:18:52 +11:00
Taylor Griffin
36e827b445 Merge branch 'dev' of https://github.com/Growstuff/growstuff into finish-plantings-javascript 2014-10-23 19:01:58 +11:00
Taylor Griffin
f62ce257da catch up with upstream dev 2014-10-23 19:00:55 +11:00
Skud
0d893470de Merge pull request #439 from tygriffin/I18n
I18n
2014-10-23 10:06:33 +11:00
Taylor Griffin
e9d1d11535 add append date functionality for planting finished on garden show page and planting list page 2014-10-21 19:43:51 +11:00
Taylor Griffin
c244da8b73 make English fallback language 2014-10-21 07:24:08 +11:00
Taylor Griffin
48875dacb3 remove pry because it's redundant with byebug 2014-10-21 06:53:21 +11:00
Taylor Griffin
a6508b5c9f replace debugger with byebug 2014-10-20 22:47:13 +11:00
Taylor Griffin
0e11f20910 Merge branch 'dev' of https://github.com/Growstuff/growstuff into I18n 2014-10-20 21:27:59 +11:00
Taylor Griffin
ab449a65f8 remove 'to be translated' message from ja locale file 2014-10-20 21:27:39 +11:00
Miles Gould
f795918e17 Remove alternate names for crops without IDs. 2014-10-19 22:49:18 +01:00
Miles Gould
badb0c4fe7 Make load altnames task idempotent. 2014-10-19 22:21:29 +01:00
Miles Gould
7c3059fcae Fix typo in altname CSV 2014-10-19 22:21:10 +01:00
Miles Gould
06a4fcab71 Remove superfluous* error-checks from load_altnames
* /me crosses fingers...
2014-10-19 22:19:41 +01:00
Miles Gould
36be5e9533 Hardcode alternate-name CSV file path. 2014-10-19 21:54:46 +01:00
pozorvlak
4a8297360c Merge pull request #434 from Skud/memberprofile
Member profile
2014-10-19 17:32:27 +01:00
Miles Gould
0aea1721d8 Add altname data and include load in deploy-tasks. 2014-10-19 17:24:18 +01:00
Miles Gould
3d10553373 Add Rake task to load altnames. 2014-10-19 17:24:18 +01:00
Miles Gould
af87c9db47 Remove debugger gem
It wouldn't install under Ruby 2.1.2, and we weren't using it anyway.
2014-10-19 17:24:18 +01:00
Skud
e8daba750d Merge pull request #433 from pozorvlak/feature_tests_for_scinames
Feature tests for scientific names
2014-10-19 16:54:31 +01:00
Skud
a79a8dc927 Merge branch 'dev' of https://github.com/Growstuff/growstuff into memberprofile
Conflicts:
	app/views/scientific_names/index.html.haml
2014-10-19 16:54:10 +01:00
Skud
a25eb2d631 Deleted old view tests for crops 2014-10-19 16:52:45 +01:00
Skud
58f1bca683 removed spurious console.log calls 2014-10-19 16:51:08 +01:00
Miles Gould
b17aaf262d Test HTTP statuses in sciname feature tests
This makes it easier to tell the difference between "test failed because
the expected content isn't there" and "test failed because the whole
page is broken". It also guards against "test passed incorrectly because
the expected content was part of the error message".
2014-10-19 16:36:10 +01:00
Miles Gould
56b7d89d9e Link scinames to crops, don't show numeric crop IDs 2014-10-19 16:36:10 +01:00
Miles Gould
6de2112c4d Display note on successful sciname deletion. 2014-10-19 16:36:10 +01:00
Miles Gould
2aabcce70d Feature tests for scientific names. 2014-10-19 16:36:10 +01:00
Skud
7595d75d20 Merge pull request #432 from pozorvlak/alternate_crop_names
Model and CRUD for alternate crop names
2014-10-19 16:34:44 +01:00
Skud
de6d3589d1 Merge pull request #436 from pozorvlak/ruby212
Upgrade Ruby to v2.1.2
2014-10-19 16:18:33 +01:00
pozorvlak
9e9aa82099 Merge pull request #435 from emmawinston/album
Changed set to album on photo page
2014-10-19 15:24:24 +01:00
Miles Gould
ef8d552301 Update Ruby to 2.1.2 in .travis.yml 2014-10-19 15:06:34 +01:00
emmawinston
e5cd14cd45 Added myself to the contributors file 2014-10-19 14:56:44 +01:00
emmawinston
1daee9612c Changed set to album on photo page 2014-10-19 14:52:10 +01:00
Skud
dc1afb8913 Added seeds_by_crop_path routes and stuff 2014-10-19 14:25:47 +01:00
Skud
496c070efd Tweaked layout of crop page sidebar 2014-10-19 14:14:24 +01:00
Skud
f468a8b77b Changed all h1 to content_for :title 2014-10-19 14:04:55 +01:00
Skud
16677a3b86 Removed underline on header area 2014-10-19 14:04:32 +01:00
Skud
41566d39f3 Added map to member profile page 2014-10-19 13:50:43 +01:00
Miles Gould
e613907506 Check status codes on page visits. 2014-10-19 13:21:30 +01:00
Skud
82a61387a3 Improved layout of member profile page
In doing this, I added some content areas for all pages on the site:

1) subtitle
2) buttonbar

These are intended to help standardise the layout of all pages.  On the
member page, the subtitle is the location, and the buttonbar has links
like "edit profile", "upgrade account", etc (or if looking at someone
else's page, then "send message" etc).

I also implemented subtitle/buttonbar on the crop detail page (the
subtitle is the default scientific name).

The rest is just refactoring and tests.  I've removed some view tests
and put them in feature tests instead.
2014-10-19 12:23:19 +01:00
Miles Gould
29d53a8f8b Test for notices in altname CRUD features. 2014-10-19 12:02:31 +01:00
Miles Gould
d0f7169c59 Put alternate name features in their own file. 2014-10-19 11:50:21 +01:00
Miles Gould
3a797d4434 Use content_for :title in scientific names index. 2014-10-19 11:42:49 +01:00
Miles Gould
1d3c24ae27 Use content_for :title on altname index page. 2014-10-19 11:28:51 +01:00
Miles Gould
006bc54f3f Oops, add the altname index HAML file. 2014-10-18 18:13:04 +01:00
Miles Gould
792062e0d2 Make add-altname test more featurey. 2014-10-18 18:02:59 +01:00
Miles Gould
52fd2b86d6 Test altname deletion end-to-end. 2014-10-18 18:01:54 +01:00
Miles Gould
110ae99d83 Fix and test altname index page. 2014-10-18 17:55:56 +01:00
Miles Gould
c447c1cb3a Make edit-altname test more featurey. 2014-10-18 17:49:13 +01:00
Miles Gould
0ae68737c3 Use login_as helper method in altname feature tests. 2014-10-18 17:43:59 +01:00
Miles Gould
96d2fa1cb6 Put alternate names controller in standard order. 2014-10-18 17:41:52 +01:00
Miles Gould
8a97aa1a9b Delete redundant old-style test. 2014-10-18 17:34:33 +01:00
Miles Gould
dc2cf5275c Fix model tests for alternate names. 2014-10-18 17:30:22 +01:00
Miles Gould
c7c85aaa66 Creation and deletion of alternate names 2014-10-18 17:03:54 +01:00
Cesy Avon
edf2f36bcd Upgrading to ruby 2.1.2 2014-10-18 16:58:23 +01:00
Miles Gould
b009603581 Fix link to crop on alternate name page 2014-10-18 16:54:02 +01:00
Miles Gould
eacfadae20 Make editing alternate names actually do something. 2014-10-18 16:51:43 +01:00
Miles Gould
37eb2a0e34 Show alternate names on their own page. 2014-10-18 16:49:27 +01:00
Miles Gould
10f6214c6c Views for adding/editing alternate names. 2014-10-18 16:34:38 +01:00
Skud
29a5fe07c2 use rails paths when visiting pages 2014-10-18 16:01:00 +01:00
Miles Gould
77d1d067fa Crop wranglers can add alternate names 2014-10-18 15:35:57 +01:00
Miles Gould
cdf6d4b09a Delete alternate name button on crops page. 2014-10-18 15:29:21 +01:00
Miles Gould
7e4b51d1cb Add "Edit" link for alternate names on crops page. 2014-10-18 15:18:23 +01:00
Skud
864ce95f11 Merge pull request #430 from Skud/tomatoes
Added some additional hierarchy around cherry tomatoes
2014-10-18 14:40:02 +01:00
Skud
ae27a0a5b5 Added some additional hierarchy around cherry tomatoes 2014-10-18 14:38:00 +01:00
Miles Gould
627587ee1b Show alternate names on crop page 2014-10-18 14:34:53 +01:00
Skud
9ededef54d Added tests for content of planting reminder email 2014-10-18 14:00:22 +01:00
Miles Gould
83fa291060 Fetch alternate names for a crop. 2014-10-18 13:50:28 +01:00
Miles Gould
e85cb4598d Add alternate name model. 2014-10-18 12:38:44 +01:00
Skud
f18feaa131 Merge branch 'dev' of https://github.com/Growstuff/growstuff into plantingreminder 2014-10-18 11:23:30 +01:00
pozorvlak
41d63f8f92 Merge pull request #417 from tygriffin/I18n
I18n
2014-10-18 11:11:25 +01:00
pozorvlak
7c783ecda3 Merge pull request #428 from tygriffin/finish-plantings-javascript
Finish plantings javascript
2014-10-18 10:54:50 +01:00
pozorvlak
26e592db88 Merge pull request #429 from Skud/tomatoes
Tomatoes - scientific name upload bugfix
2014-10-18 10:35:50 +01:00
Taylor Griffin
2515d34277 add teardown to reset locale to default en 2014-10-16 08:09:20 +11:00
Taylor Griffin
8994bcf28c ok, we'll just remove all references to environment 2014-10-16 07:14:03 +11:00
Taylor Griffin
d627d8394e forgot which env I was in 2014-10-16 06:56:39 +11:00
Taylor Griffin
a4e7f93421 Merge branch 'dev' of https://github.com/Growstuff/growstuff into I18n 2014-10-16 06:39:10 +11:00
Taylor Griffin
0f75a96944 write spec to test that setting a different locale fundamentally works 2014-10-16 06:37:50 +11:00
Taylor Griffin
6a7c935d43 try setting locale from query parameter first 2014-10-16 06:37:02 +11:00
Skud
a3e02a3e61 Actually delete Crop.random, don't just comment it out 2014-10-15 16:47:43 +01:00
Skud
8e6a57c442 Attempt at writing tests for planting reminder email
(Test are broken)

OK, so I decided to use the capybara_email gem to write these tests.
It's basically working but there's a problem with the has_link matcher.
Basically the emails sent by ActionMailer have URLs like
http://localhost:8080... whereas the tests asking for planting_url() or
similar are looking for http://example.com...

I don't understand AT ALL why there is this discrepancy, but it looks
like ActionMailer is using the settings from the development
environment, instead of the testing environment.

WHYYYYYY???

I'm pushing this up so that maybe someone else can figure it out,
because I'm stumped.
2014-10-15 15:52:13 +01:00
Skud
e4cf636bef Merge branch 'dev' of https://github.com/Growstuff/growstuff into plantingreminder
Conflicts:
	app/models/harvest.rb
	db/schema.rb
	spec/models/harvest_spec.rb
2014-10-15 14:20:16 +01:00
Skud
75e076cef5 Merge branch 'dev' of https://github.com/Growstuff/growstuff into tomatoes
Conflicts:
	spec/models/crop_spec.rb
2014-10-15 14:07:03 +01:00
Skud
1d81064ced removed unused Crop.random method 2014-10-15 14:03:00 +01:00
Skud
25cb3fd469 Fixed scientific name upload bug and wrote tests
Wrote unit tests and refactored Crop.create_from_csv

The actual bug (now fixed) is that if you didn't specify a SN in the
CSV, it would try and pick it up from the parent crop, but then the
testing for "is this a dup?" was based on what was in the CSV and didn't
take that parent SN into account.  This is now fixed.
2014-10-15 13:58:21 +01:00
Skud
694bc56f68 Merge pull request #427 from oshiho3/PT60321968_corps_posts
Added crops-posts association as well as updated GUI for crop show
2014-10-15 12:18:54 +01:00
Taylor Griffin
6bcb9dae4a trigger datepicker when planting finished checkbox is ticked 2014-10-15 06:41:28 +11:00
Taylor Griffin
3a46a5bd18 add comments to javascripts 2014-10-13 06:48:46 +11:00
Taylor Griffin
c405639f22 write test for marking a planting finished from show page 2014-10-13 06:42:57 +11:00
Taylor Griffin
aaf08469e6 add date when planting is marked finished from planting show page 2014-10-12 23:14:02 +11:00
Taylor Griffin
d1e0bdb534 toggling planting finished clears the finished at field or populates it with a cached value 2014-10-12 09:53:09 +11:00
Skud
ff61739716 s/boring_planting/no_photo_planting for clarity 2014-10-08 18:59:10 +01:00
Shiho Takagi
cf07ecfa4a improved test spec, crop page and added rake task 2014-10-05 23:16:46 +11:00
Shiho Takagi
6e02f40e0a merging from dev 2014-10-05 13:47:12 +11:00
Shiho Takagi
14d039ee01 Added crops-posts association as well as updated GUI for crop show 2014-10-05 13:32:08 +11:00
pozorvlak
14cf82f1d2 Merge pull request #426 from maco/dev
Put back oshiho3's fix, modified for new parameters
2014-10-02 17:04:03 +01:00
Mackenzie Morgan
a2f2508f0d don't lose the thing we're attaching the photo to when we change sets. This is a modification of oshiho3's previous fix. 2014-10-02 09:38:02 -04:00
pozorvlak
494a600766 Merge pull request #423 from Skud/removebrokentest
Removing tests for migrations
2014-10-02 13:42:07 +01:00
Skud
45d34f7f79 Merge pull request #424 from wsmoak/testing
Rename Sign in tests and add Sign up tests.
2014-10-02 17:53:22 +10:00
Skud
9b43bdd29b Merge pull request #425 from Skud/removeunusephotos
added deploy task to remove unused photos
2014-10-02 17:48:44 +10:00
Skud
e002cb2d35 added deploy task to remove unused photos 2014-10-02 17:48:19 +10:00
Skud
a5b856b506 Merge pull request #410 from maco/dev
Harvest photos
2014-10-02 17:45:59 +10:00
Mackenzie Morgan
48ad561b76 convert tabs to spaces 2014-10-01 23:58:54 -04:00
Mackenzie Morgan
fcda8742d8 go back to the nested error handling in the photos controller and add a migration for indexing harvests_photos 2014-10-01 22:52:52 -04:00
Mackenzie Morgan
57abfa04b3 fix whitespace 2014-10-01 21:46:15 -04:00
Wendy Smoak
557d07d2f1 Rename Sign in tests and add Sign up tests. 2014-10-01 20:24:15 -04:00
Mackenzie Morgan
51d8b2d475 Merge branch 'dev' of github.com:maco/growstuff into dev 2014-10-01 20:17:23 -04:00
Mackenzie Morgan
a29d11a07c refactor error handling on photo upload to be easier to read 2014-10-01 20:17:11 -04:00
Mackenzie Morgan
0ad217c9a2 add index to harvest_photo 2014-10-01 20:16:53 -04:00
Mackenzie
271d178cc8 Merge pull request #1 from Skud/maco-harvestphotos
Delete unused photos
2014-10-01 20:14:23 -04:00
Skud
9a9eeecb46 Removing tests for migrations
These were never run anyway (they don't have _spec.rb in their names)
and were obviously written when we had no idea what we were doing.
They're full of syntax errors and all sorts of stuff that just won't
work.  The best thing is to remove them so they don't confuse people!
2014-10-02 10:09:21 +10:00
pozorvlak
41a4de7e74 Merge pull request #422 from Skud/crophierarchycache
Clear crop hierarchy view cache after uploading crops
2014-09-30 17:43:06 +01:00
Skud
8497782847 Clear crop hierarchy view cache after uploading crops
The crop_sweeper only acts in response to things that happen in the
controller.  Since this works directly with the model, we need to clear
the cache fragment manually.
2014-09-30 23:02:09 +10:00
Skud
97699e5e6a Removed feature test that doesn't really test anything featurelike 2014-09-30 22:38:24 +10:00
Skud
98da785d8a Removed spurious debugging puts 2014-09-30 22:37:58 +10:00
Skud
e2571e9261 Replaced ENV vars with site_name 2014-09-30 22:37:19 +10:00
Skud
65c46c334b Delete unused photos
Make sure the models are setup so that if a photo is not used for
anything, it's removed from the system.

Also wrote a rake task (which should be run on deploy) to remove older
unused photos.
2014-09-29 09:18:28 +10:00
pozorvlak
dbfa080609 Merge pull request #421 from tygriffin/customize-generators
stop generating helpers, constroller specs, view specs, and javascripts
2014-09-28 23:06:41 +01:00
Taylor Griffin
aebd9e1d4e remove a file that accidentally found its way in from another unrelated branch 2014-09-28 22:03:50 +10:00
Taylor Griffin
87b6780220 stop generating helpers, constroller specs, view specs, and javascripts 2014-09-28 21:57:05 +10:00
Taylor Griffin
a7da4b9ce4 no longer necessary to pass locale quuery param in every url 2014-09-28 21:38:28 +10:00
Taylor Griffin
f9dc17c587 no longer raise exception on missing g translation in dev / test envs 2014-09-28 21:34:26 +10:00
Taylor Griffin
d10a62d336 set locale from subdomain 2014-09-28 21:32:15 +10:00
pozorvlak
a34a54d995 Merge pull request #419 from Skud/tomatoes
Upload tomato varieties to crop database
2014-09-28 11:22:44 +01:00
Skud
baeb5d3525 Remove old planting reminder sending stuff 2014-09-28 16:03:58 +10:00
Skud
05400a081f tiny bit of whitespace cleanup 2014-09-28 16:02:02 +10:00
Skud
d8b75eaa66 Fixed up db migration and tests for planting reminders 2014-09-28 15:55:55 +10:00
Skud
4a62add88e Merge branch 'dev' of https://github.com/Growstuff/growstuff into plantingreminder
Conflicts:
	spec/models/planting_spec.rb
2014-09-28 15:32:53 +10:00
Skud
529c98f5dc Move actual sending of planting reminder to rake task 2014-09-28 15:28:53 +10:00
Skud
e011b54cba Nicer phrasing for the no-plantings use case 2014-09-28 14:35:54 +10:00
Skud
1b1f1d33e0 Add planting reminder checkbox to email settings 2014-09-28 14:35:32 +10:00
Skud
25abcdc923 Upload tomato varieties to crop database 2014-09-28 13:50:55 +10:00
pozorvlak
126cb1d191 Merge pull request #418 from wsmoak/dev
Renamed gardens.rb to gardens_spec.rb so that these tests will run.
2014-09-26 20:12:39 +01:00
Wendy Smoak
8ab4f885f1 Renamed gardens.rb to gardens_spec.rb so that these tests will run. 2014-09-26 10:32:06 -04:00
Taylor Griffin
984503480f remove necessity to add locale to url if current locale is English 2014-09-25 07:00:11 +10:00
Taylor Griffin
5e48c4392a move site name into localization 2014-09-24 18:29:59 +10:00
Taylor Griffin
d462254021 add missing translation 2014-09-21 10:26:30 +10:00
Taylor Griffin
1acba65a8b clean up haml a bit 2014-09-21 10:22:46 +10:00
Taylor Griffin
8f14ffe560 catch up with dev 2014-09-20 23:01:35 +10:00
Taylor Griffin
93cd067fff add two contributors 2014-09-20 21:59:05 +10:00
Taylor Griffin
e3a6742574 add sample japanese locale file to test changing languages 2014-09-20 21:56:14 +10:00
Taylor Griffin
659a68cf39 remove missing translations spec in favor of running dedicated task 2014-09-20 21:49:30 +10:00
Taylor Griffin
e3f590ede5 abstract strings in home views into locale file 2014-09-20 21:47:18 +10:00
pozorvlak
6efeb04449 Merge pull request #416 from oshiho3/bugfix_markdown
updated regex for crop in markdown
2014-09-19 23:45:16 +01:00
pozorvlak
52b4e27d8c Merge pull request #415 from oshiho3/bugfix_plantphoto
added planting_id param to Flickr set search (new_photo_path form).
2014-09-19 16:42:49 +01:00
Shiho Takagi
60354264d6 Included PT bug# to its test description. Test using the case from the bug 2014-09-19 16:00:25 +10:00
Shiho Takagi
87643c3d1a Merge branch 'bugfix_plantphoto' of https://github.com/oshiho3/growstuff into bugfix_plantphoto 2014-09-19 15:33:35 +10:00
Shiho Takagi
aa028db2dc added planting_id param to Flickr set search (new_photo_path form). 2014-09-19 15:29:12 +10:00
Taylor Griffin
983fa8ede0 abstract strings out of blurb partial 2014-09-19 07:29:04 +10:00
Taylor Griffin
16f4d2f80e fix spec to check href with newly added locale query param 2014-09-19 07:17:08 +10:00
Shiho Takagi
dd75f2aef9 updated regex for crop in markdown 2014-09-18 14:18:18 +10:00
Taylor Griffin
f8ee9d0589 don't scope routes to locale to make url prettier because it breaks tests like whoa 2014-09-18 07:14:35 +10:00
Taylor Griffin
87df8661c7 raise exception on missing translations in test and dev environment 2014-09-18 06:24:59 +10:00
Taylor Griffin
f355c393f0 basic setup 2014-09-18 06:15:59 +10:00
Shiho Takagi
eeb2bf9938 added planting_id param to Flickr set search (new_photo_path form). 2014-09-17 21:38:43 +10:00
Skud
3cf2a50a34 modified Planting.interesting to have some options re: howmany and photos 2014-09-12 13:20:41 +10:00
Skud
09bef3f9d8 Added options for if you didn't plant/harvest anything 2014-09-12 12:30:27 +10:00
Skud
2bbccfc44d Added tests for planting reminder email 2014-09-12 12:30:04 +10:00
Skud
00f58511ac Merge pull request #414 from Growstuff/dev
Production push: finished plantings, crowdfunding banner, etc
2014-09-12 10:13:44 +10:00
Skud
374c17c928 Merge pull request #413 from Skud/talklinks
Fixed mailing list link to point to Talk instead
2014-09-12 09:10:42 +10:00
Skud
46eaf37437 Fixed mailing list link to point to Talk instead 2014-09-12 09:10:13 +10:00
Skud
9bd4160102 Merge branch 'Skud-finished2' into dev 2014-09-12 08:41:46 +10:00
Skud
29d43f4e5b Merge branch 'finished' of github.com:Skud/growstuff into Skud-finished2 2014-09-12 08:40:57 +10:00
Skud
aefbce3b1f Merge pull request #411 from Skud/crowdfunding
added sitewide crowdfunding banner
2014-09-12 08:39:27 +10:00
Skud
374987488f Fixed broken tests. 2014-09-12 08:30:44 +10:00
Skud
fa9c029493 added sitewide crowdfunding banner 2014-09-12 08:10:58 +10:00
Skud
85b5ac12ca added validation for finished_at (must be after planted_at) 2014-09-12 07:50:25 +10:00
Skud
03235f3952 Add warning about plantings being marked as finished 2014-09-12 07:43:41 +10:00
Mackenzie Morgan
550f3c5326 removing unneeded photo-related files 2014-09-09 22:18:43 -04:00
Mackenzie Morgan
ed537e583b whitespace fixes and um oops no there shouldn't be a secret key in that config file 2014-09-09 20:31:14 -04:00
Mackenzie Morgan
2b7b5bad63 including all the new files needed for harvest photos, this time 2014-09-09 20:21:16 -04:00
Mackenzie Morgan
512ccdbaa2 merging the schema changes from finished plantings and making the timestamp newer, then making the styling on harvest photos match the new styling (no li) on planting photos 2014-09-09 20:19:25 -04:00
Mackenzie Morgan
7d54ab347f Adding photo functionality to harvests 2014-09-09 19:55:40 -04:00
Skud
51d9bfe97e Merge branch 'Skud-finished' into dev 2014-09-10 09:12:44 +10:00
Skud
9d5c15a7da Merge branch 'finished' of github.com:Skud/growstuff into Skud-finished
Conflicts:
	spec/features/plantings/planting_a_crop_spec.rb
2014-09-10 09:12:27 +10:00
Skud
e0485ade1d Added test to make sure the wrong plantings aren't finished 2014-09-10 08:06:07 +10:00
Skud
fb91c78933 Merge pull request #409 from tygriffin/prefill-crop-bug
Prefill crop bug
2014-09-09 22:05:15 +10:00
Taylor Griffin
138904bd82 write regression test for creating plantings, harvests and seeds form crop page 2014-09-09 21:52:50 +10:00
Taylor Griffin
00b24890f4 accept a default value in options hash of autosuggest helper 2014-09-09 21:27:21 +10:00
Skud
0c944357c0 Merge pull request #408 from catfriend/dev
Added placeholder text for crop auto suggest
2014-09-06 15:15:17 +10:00
catfriend
885ffab012 added contributor info 2014-09-05 20:36:58 -07:00
catfriend
b0ee83bc3e added test for adding placeholder text 2014-09-05 16:23:33 -07:00
catfriend
4caf7b9b28 added placeholder text per 78178814 2014-09-05 15:30:34 -07:00
Skud
1c33ab280f Merge pull request #407 from Growstuff/dev
Production push: branding, crop and photo display bugfixes
2014-09-05 11:11:58 +10:00
Skud
56eaea9c06 Merge pull request #405 from Skud/cropmess
Crop and photo bugfixes
2014-09-04 21:23:31 +10:00
Skud
3c968ea6be Merge pull request #406 from Skud/branding2
Branding
2014-09-04 20:02:16 +10:00
Skud
a3213a99e8 Added apple icon for iOS users 2014-09-04 19:03:07 +10:00
Skud
495f4194e7 Fixed test for branding in navbar 2014-09-04 19:02:38 +10:00
Skud
7543221f73 Added 'skip navigation menu' link for screenreaders 2014-09-04 18:40:51 +10:00
Skud
7184b04397 Added favicon 2014-09-04 18:37:27 +10:00
Skud
0e0a13bbd1 Made sure all headings are sans-serif 2014-09-04 18:31:13 +10:00
Skud
4f4aad7626 Added pear logo to top nav 2014-09-04 18:14:49 +10:00
Skud
baf8b91a4e Removed fairly pointless test for markup 2014-09-04 18:05:10 +10:00
Skud
579f79760b remove bullet points from new photo page 2014-09-04 17:51:13 +10:00
Skud
cdbc4611c9 Fix up crop photo wrapping mess 2014-09-04 17:48:00 +10:00
Skud
823dfe8000 Merge pull request #404 from Growstuff/dev
Production push: crop popularity, crop suggest, harvest improvements, wrangler improvements, bootstrap 3, and more
2014-09-03 15:54:26 +10:00
Skud
ea9597ba75 Merge pull request #403 from Skud/readmeupdate
Readme update
2014-09-03 09:09:03 +10:00
Skud
591b8e03d6 we don't always work in pairs, just often 2014-09-03 09:08:18 +10:00
Skud
35470acb86 updated CONTRIBUTING.md with more up to date info 2014-09-03 09:06:59 +10:00
Skud
326248797e Updated readme and contributors 2014-09-03 09:00:55 +10:00
Skud
6704b97542 Merge pull request #399 from tygriffin/fix-layout
Fix layout
2014-09-03 08:32:43 +10:00
Taylor Griffin
982572d2bd slight change to width of index card 2014-09-03 08:02:53 +10:00
Taylor Griffin
1fc100eca4 update gem and finesse signup widget 2014-09-03 07:52:45 +10:00
Taylor Griffin
1224bd0ebb import original variables into custom 2014-09-03 07:28:27 +10:00
Taylor Griffin
c95619117b Merge branch 'dev' of https://github.com/Growstuff/growstuff into fix-layout 2014-09-02 06:34:38 +10:00
Skud
919cc45d13 Merge pull request #401 from Skud/moreb3
Quick and dirty fix for layout of settings tabs
2014-09-01 23:06:55 +10:00
Skud
0687625049 Quick and dirty fix for layout of settings tabs 2014-09-01 22:30:08 +10:00
Skud
551e4cbe6f Merge pull request #400 from tygriffin/fix-styles
Fix styles
2014-09-01 21:08:52 +10:00
Taylor Griffin
7518fbec1c add styles for alerts 2014-09-01 20:58:48 +10:00
Taylor Griffin
703de07647 add crop image class to prevent smooshing again neighboring div 2014-09-01 20:55:54 +10:00
Taylor Griffin
c9cd82d7fd increase z-index of autosuggest dropdown 2014-09-01 20:53:48 +10:00
Taylor Griffin
0af550b6e7 make top nav collapse threshold larger to prevent it from becoming too big at some browser sizes 2014-09-01 20:45:45 +10:00
Taylor Griffin
c4bd4c178d add a little offset on crop index card to prevent info from smooshing against pic 2014-09-01 20:40:16 +10:00
Skud
b242e0fb99 Merge pull request #398 from Skud/devisetoken
Additional fixes for devise login stuff
2014-08-31 18:37:34 +10:00
Skud
a8a34d8dc8 s/user/member/g in crop wrangler tests
We don't use the term "user" in Growstuff -- this should ideally have
been caught in code review but I missed it :-/
2014-08-31 18:28:50 +10:00
Skud
965a3bf2a1 Modernise redirection after signup to use devise's stored_location_for 2014-08-31 18:28:26 +10:00
Skud
07fcdf9bb7 Merge pull request #397 from Skud/devisetoken
Updated devise tokens in emails for devise 3.2
2014-08-31 17:56:15 +10:00
Skud
474b56cf6b Updated devise tokens in emails for devise 3.2 2014-08-31 17:54:07 +10:00
Skud
99ffa3775e Remove puts used for debugging 2014-08-30 18:38:16 +10:00
Skud
ecbeb986c3 Merge pull request #396 from Skud/moreb3
b3ify 'sort by' dropdown on crops page
2014-08-30 18:19:51 +10:00
Skud
e7d9ebe37a b3ify 'sort by' dropdown on crops page 2014-08-30 18:05:11 +10:00
Skud
db7729920b Merge pull request #386 from Skud/coverage
Coverage
2014-08-30 17:50:49 +10:00
Skud
2be199abbc Merge branch 'dev' of https://github.com/Growstuff/growstuff into plantingreminder
Conflicts:
	Gemfile
	Gemfile.lock
	app/views/devise/registrations/edit.html.haml
2014-08-30 17:45:19 +10:00
Skud
597e878413 Removed spurious seeds tests (moved to subdir) 2014-08-30 17:40:16 +10:00
Skud
29f83b8c18 Merge branch 'coverage' of github.com:Skud/growstuff into coverage
Conflicts:
	Gemfile.lock
	app/views/gardens/_form.html.haml
	spec/spec_helper.rb
2014-08-30 17:32:50 +10:00
Skud
b0378fab69 Cleaned up tests a little bit 2014-08-30 17:30:24 +10:00
Skud
d35639d7cb Add page content test suggested by tygriffin 2014-08-30 17:10:36 +10:00
Skud
d991765edb Fixed up label with link to field it relates to 2014-08-30 17:10:36 +10:00
Skud
d55d2c6409 Ongoing coverage improvements 2014-08-30 17:09:47 +10:00
Skud
082663c885 Show coverage locally and send to coveralls 2014-08-30 17:09:47 +10:00
Skud
0c89413f92 Merge pull request #395 from tygriffin/crop-suggest
Fix edit bug
2014-08-30 17:04:59 +10:00
Taylor Griffin
1cd2fd9b07 Merge branch 'dev' of https://github.com/Growstuff/growstuff into crop-suggest 2014-08-30 12:15:02 +10:00
Taylor Griffin
3fbae6a5ee write regression spec for resource id bug when editing resource 2014-08-30 12:14:36 +10:00
Skud
fbeafd4299 Improving test coverage for gardens 2014-08-30 11:28:52 +10:00
Skud
4ebc184188 Add finished planting data (and buttons) to plantings index
I also removed description from the table as it was getting way too full
2014-08-30 11:11:19 +10:00
Skud
46e20f0562 Add finished planting data (and buttons) to plantings index 2014-08-30 11:04:31 +10:00
Skud
af2d0e22ee Automatically set plantings to finished when a garden is marked inactive 2014-08-30 10:51:33 +10:00
Skud
170d6b474e Updated garden page with "finished" plantings
Also added a similar "mark as inactive" button for the garden itself
and rearranged some things on the page.
2014-08-30 10:42:16 +10:00
Taylor Griffin
480e67bf2f add default id to hidden input in auto suggest view helper to make edit work 2014-08-30 10:20:29 +10:00
Skud
facba15154 Added a button on the planting details page to mark as finished 2014-08-30 10:14:11 +10:00
Skud
9f9ef10b6a Added finished fields to planting form and display 2014-08-30 09:52:26 +10:00
Skud
e7dd50c3f1 Added scopes for finished and current plantings 2014-08-30 09:28:02 +10:00
Skud
b07d9d8db0 Added finished fields for plantings 2014-08-30 09:27:41 +10:00
Skud
40c7124769 Merge pull request #379 from tygriffin/crop-suggest
Crop suggest
2014-08-29 11:35:25 +10:00
Skud
19a0a914c5 Merge pull request #393 from Skud/moreb3
A few bootstrap3 tweaks
2014-08-29 10:44:55 +10:00
Skud
8a5d1f2e5e Fixed crop wrangler tests to not be order dependent 2014-08-29 10:38:35 +10:00
Skud
30d436cb5d Fixed inline form on places page to make it b3-ish 2014-08-29 10:19:37 +10:00
Skud
e3627f6dcd Fixed devise forms to make them b3ish and pretty 2014-08-29 10:02:56 +10:00
Taylor Griffin
3beae6f500 add request crop link to seeds 2014-08-29 08:43:02 +10:00
Taylor Griffin
83d3c369c2 style noscript warning 2014-08-29 08:42:43 +10:00
Taylor Griffin
7fa05d81e9 fix tests to match new implementation of of auto_suggest 2014-08-29 07:38:55 +10:00
Taylor Griffin
d8c7aba725 pass options hash into auto_suggest helper to allow setting class 2014-08-29 07:31:32 +10:00
Taylor Griffin
6bb74039a7 fix slug bug 2014-08-29 07:31:02 +10:00
Taylor Griffin
2c50c3b703 merge in a bunch of (mostly bootstrap 3) changes 2014-08-29 07:14:44 +10:00
Taylor Griffin
550cb4b265 put validation in the correct place this time 2014-08-29 06:56:02 +10:00
Taylor Griffin
62e1c3bb93 add server side validation 2014-08-29 06:45:37 +10:00
Taylor Griffin
cd6fc7e804 add noscript tag 2014-08-29 06:45:11 +10:00
Taylor Griffin
4e0d62b28d remove client side validation 2014-08-29 06:44:48 +10:00
Skud
028e1194e5 Merge pull request #392 from Skud/moreb3
changed layout of planting list on homepage
2014-08-28 12:10:42 +10:00
Skud
55c2fceffb changed layout of planting list on homepage
... as b3 seems to have more gutter space between columns
2014-08-28 12:09:43 +10:00
Skud
698a13ef70 Merge pull request #391 from Skud/moreb3
Tweak formatting of images with popovers (used mostly on homepage)
2014-08-28 12:01:24 +10:00
Skud
848b583d94 Tweak formatting of images with popovers (used mostly on homepage) 2014-08-28 11:46:36 +10:00
Skud
b260169d2d Merge pull request #389 from Growstuff/bootstrap3
Bootstrap3
2014-08-28 11:15:53 +10:00
Skud
d6e957e2fb Merge pull request #390 from Skud/cropwranglertests
Switch to match_array to get around spuriously failing tests
2014-08-28 10:44:36 +10:00
Skud
c68b029d50 Switch to match_array to get around spuriously failing tests 2014-08-28 10:16:31 +10:00
Skud
a3220653cf Merge branch 'dev' into bootstrap3 2014-08-28 08:00:48 +10:00
Skud
840a5efc4e Merge remote-tracking branch 'upstream/bootstrap3' into dev
Conflicts:
	Gemfile.lock
2014-08-28 08:00:10 +10:00
pozorvlak
5add85cd7c Merge pull request #387 from Skud/contact-twitter
Fixed contact page error
2014-08-27 19:52:22 +01:00
pozorvlak
ea31d89bd0 Merge pull request #385 from Skud/b3forms
Fixed various forms to be bootstrap3-ified
2014-08-27 14:17:27 +01:00
Skud
e5b15fae1a got rid of ugly scaffolding 'back' links 2014-08-27 19:02:49 +10:00
Skud
501fda3fc9 b3ified a few of the lesser-used forms 2014-08-27 19:02:06 +10:00
Skud
f6c2873f97 Add page content test suggested by tygriffin 2014-08-27 18:43:44 +10:00
Skud
1103e2719f Fixed up label with link to field it relates to 2014-08-27 18:42:42 +10:00
Skud
a5c2c0bb5c Fixed twitter link on contact page 2014-08-25 13:41:15 +10:00
Skud
03ecb7e238 Merge branch 'dev' of https://github.com/Growstuff/growstuff into dev 2014-08-25 09:30:46 +10:00
Taylor Griffin
2a51f66d88 fix seed view tests 2014-08-24 12:11:10 +10:00
Taylor Griffin
fd651de7ea implement auto suggest on new seed page 2014-08-24 12:02:53 +10:00
Taylor Griffin
d038ac6d8a test that input value is not affected by auto suggest 2014-08-24 10:53:24 +10:00
Skud
b91bab117f Merge pull request #383 from Marlena/pg_crop_wranglers
created list of crop wranglers on the crop wranglers page
2014-08-22 14:50:52 +10:00
Skud
1250206c5e Ongoing coverage improvements 2014-08-22 14:44:00 +10:00
Skud
9c5f7753ca Show coverage locally and send to coveralls 2014-08-22 14:09:12 +10:00
Marlena Compton
36199054c0 changed method so that you can now call crop_wranglers and admins. meta-programming ftw 2014-08-21 20:11:10 -07:00
Marlena Compton
13e015b441 fixed role factory to not create extra roles when new members 2014-08-21 20:11:10 -07:00
Marlena Compton
38b9207122 remove extra method 2014-08-21 20:11:10 -07:00
Marlena Compton
ec25f2ab91 created list of crop wranglers on the crop wranglers page 2014-08-21 20:11:10 -07:00
Skud
793eecfcb7 Fixed typo 2014-08-22 10:25:40 +10:00
Taylor Griffin
ca41f86d93 add validation for case when user input is not in the database 2014-08-17 11:34:00 +10:00
Skud
25d19a25d3 err, make that secret token 2014-08-11 15:00:46 +10:00
Skud
8669907319 add secret key to travis config (needed for devise update) 2014-08-11 14:55:43 +10:00
Skud
f02f2ae77e b3ify the signup/signin pages 2014-08-11 14:49:05 +10:00
Skud
561b7c45ac b3ify and improve design of edit profile page 2014-08-11 14:42:00 +10:00
Skud
a684efcf2a b3ified some of the forms 2014-08-11 13:02:08 +10:00
Skud
0969419c84 Merge branch 'dev' of https://github.com/Growstuff/growstuff into dev 2014-08-11 12:02:42 +10:00
Skud
eaaceb5951 Merge pull request #384 from maco/dev
test & task for the ping -> pint change
2014-08-11 11:23:17 +10:00
Mackenzie Morgan
f3c3d73ef1 updating test for harvest units to list the valid units and adding a task to correct misspelled pint harvests already in the database 2014-08-10 19:49:10 -04:00
Taylor Griffin
e0d81f5693 improve and abstract auto_suggest api 2014-08-02 22:14:10 +10:00
Taylor Griffin
7aef1264ce fix edge case where user types in full name of crop and doesn't use autocomplete suggestions 2014-08-02 20:44:19 +10:00
Taylor Griffin
957fa3417d remove exclusion of assets group gems 2014-08-01 20:27:26 +10:00
Taylor Griffin
c282b3b208 abstract crop suggest autocomplete tests into a shared example 2014-08-01 20:18:28 +10:00
Taylor Griffin
69162cf228 write feature specs for harvesting a crop 2014-08-01 19:38:47 +10:00
Taylor Griffin
1bed42876c write instructions for using crop_suggest.js in a view 2014-08-01 19:30:30 +10:00
Taylor Griffin
8352807d5a add presence validation for crop association on harvest 2014-08-01 19:27:51 +10:00
Taylor Griffin
63673112a7 repair failing view tests after implementing crop-suggest on harvest 2014-08-01 19:26:33 +10:00
Taylor Griffin
a49880d4da make crop_suggest.js more abstract so it works for other resources, not just planting 2014-08-01 19:19:27 +10:00
Taylor Griffin
b4fdf97056 switch to poltergeist-phantomjs from selenium for js webdriver 2014-07-31 14:48:35 +10:00
Skud
59608c5851 Merge branch 'dev' of https://github.com/Growstuff/growstuff into dev 2014-07-31 10:19:08 +10:00
pozorvlak
e865fc1c82 Merge pull request #382 from maco/dev
update harvest model test for oz
2014-07-30 15:01:02 +01:00
Mackenzie Morgan
d17ab658c8 fix typo. pint was ping 2014-07-30 09:28:08 -04:00
Mackenzie Morgan
0a256a2dd0 update harvest model test for oz 2014-07-30 09:15:53 -04:00
pozorvlak
f280ff968b Merge pull request #381 from maco/dev
Add 'oz' as a weight unit for harvesting
2014-07-30 11:22:58 +01:00
Mackenzie Morgan
1716de2dfc Add 'oz' as a weight unit for harvesting 2014-07-30 01:31:39 -04:00
Taylor Griffin
094d9c509a write feature spec for create planting functionality 2014-07-29 10:14:20 +10:00
Taylor Griffin
012f37f366 set autoFocus to true for jquery autocomplete 2014-07-29 08:42:35 +10:00
Taylor Griffin
1054f08206 write feature spec for crop-suggest functionality on new planting form 2014-07-28 00:23:13 +10:00
Taylor Griffin
a707d9a2ea write feature spec that tests crop suggest functionality in new planting form 2014-07-28 00:15:31 +10:00
Taylor Griffin
9d6e787883 set up database_cleaner so js specs will use the same database connection as regular specs 2014-07-28 00:14:06 +10:00
Taylor Griffin
b28ce28703 replace mapbox_map_id and nominatim_user_agent_email with benign values if Rails env is test 2014-07-28 00:12:40 +10:00
Taylor Griffin
ec060b9cc0 fix most view tests that broke after changing new planting form to auto-suggest crop name 2014-07-27 22:40:14 +10:00
Taylor Griffin
948aeb1289 working on getting Selenium tests to pass 2014-07-27 21:04:52 +10:00
Taylor Griffin
1ee79c25f1 set up selenium test but encountering jQuery not defined error 2014-07-27 07:38:56 +10:00
Taylor Griffin
29752e049e remove stray reference to capybara 2014-07-26 20:19:46 +10:00
Taylor Griffin
8a1dd9d171 implement autocomplete for crop name on new planting form 2014-07-26 20:16:22 +10:00
Taylor Griffin
5df0c9c71a sketch feature test for planting a crop 2014-07-26 08:36:48 +10:00
Taylor Griffin
b940644ef3 add capybara and selenium gems 2014-07-26 07:58:05 +10:00
Skud
bb0f88bc0b Small amount of b3ification when merging dev into b3 branch 2014-07-22 14:26:22 +10:00
Skud
d03bb5e849 Merge branch 'dev' into bootstrap3 2014-07-22 14:24:24 +10:00
Skud
250a2b7d02 Merge branch 'bootstrap3' into dev
Conflicts:
	app/assets/stylesheets/overrides.css.less
2014-07-22 14:24:07 +10:00
Skud
c0ea08ddc1 s/btn-large/btn-lg/ for bootstrap 3 2014-07-22 12:11:33 +10:00
Skud
4e9679b22a make sure all buttons are either btn-default or btn-primary 2014-07-22 12:09:08 +10:00
Skud
117fd23bea add btn-default to all btn-xs 2014-07-22 12:06:28 +10:00
Skud
0294daf423 s/btn-mini/btn-xs/ for bootstrap3 2014-07-22 12:01:49 +10:00
Skud
6e48b7d224 Merge branch 'Skud-scinames' into dev 2014-07-22 11:23:38 +10:00
Skud
d558353e4c Merge branch 'scinames' of github.com:Skud/growstuff into Skud-scinames
Conflicts:
	CONTRIBUTORS.md
2014-07-22 11:23:08 +10:00
Skud
817663bdaf Merge branch 'dev' of https://github.com/Growstuff/growstuff into regularemail
Conflicts:
	db/schema.rb
2014-07-20 19:30:20 +10:00
Skud
bac836329c Merge pull request #376 from Skud/cropbrowse
Show most popular crops on "browse crops" page
2014-07-20 19:29:32 +10:00
Skud
846a2c89c5 Tweaked FactoryGirl to use create_list 2014-07-20 19:29:06 +10:00
Skud
f67732e125 Added checkbox for whether to send planting reminder 2014-07-20 19:17:59 +10:00
Skud
7c09188bb8 Renamed email to planting_reminder 2014-07-20 18:54:58 +10:00
Skud
f4c2c2481d Include plantings/harvests in regular email 2014-07-20 18:45:48 +10:00
Skud
a7d56d4f92 Added stub code for sending regular (eg. weekly) emails 2014-07-20 17:39:27 +10:00
Skud
a0fc8802b2 Allow selection of crop display order (popularity or alphabetical)
Had some trouble with tests; apparently the counter_cache behaves
differently when it starts counting from 0, which meant that some tests
started failing unless you do @crop.reload to refresh the
plantings_count.  Weird, but oh well.
2014-07-18 18:37:47 +10:00
Skud
aeb14021f3 Removed unpopular scope (guess it really was unpopular) 2014-07-18 18:17:37 +10:00
Skud
8223025d35 Set default plantings_count to 0 not nil 2014-07-18 18:06:43 +10:00
Skud
573e555bcf Added unpopular scope to crop 2014-07-18 17:52:11 +10:00
Skud
c9857bf1c8 popular scope for crops 2014-07-18 17:38:15 +10:00
Skud
6c048dec77 Merge pull request #371 from tygriffin/dev
Fix for bug when redirecting after password reset
2014-07-18 17:30:14 +10:00
Skud
7184a0d5d5 Added scientific name field tests for edit form 2014-07-18 17:29:10 +10:00
Skud
e63b2fb472 Set up sci names in spec file so fields are shown 2014-07-18 17:27:25 +10:00
Skud
e412184737 Merge pull request #374 from Growstuff/dev
Production push: crop map, crop images, case insensitive search, navbar tweaks
2014-07-18 17:00:51 +10:00
Skud
6cbe194615 Merge pull request #373 from Skud/brandfix
Make centering specific to footer
2014-07-18 16:47:39 +10:00
Skud
48bc019419 Make centering specific to footer 2014-07-18 16:45:42 +10:00
Skud
aeba4acf0d Merge pull request #372 from Skud/brandfix
fixed broken brand link in navbar
2014-07-18 16:34:59 +10:00
Skud
90c43336ca fixed broken brand link in navbar
the "float:none" was causing trouble; removing it doesn't seem to change
the display at all.
2014-07-18 16:34:07 +10:00
Taylor Griffin
82598e75f8 fix redirect after reset password bug 2014-07-15 22:57:07 +10:00
Skud
7ef6942694 Merge pull request #370 from sabreuse/bootstrap3
Initial Bootstrap3 push
2014-07-15 12:59:44 +10:00
Amy Hendrix
863f1dfae7 Update planting form 2014-07-14 22:19:07 -04:00
Taylor Griffin
3509b6e403 Merge branch 'master' of https://github.com/Growstuff/growstuff into dev 2014-07-15 11:52:00 +10:00
Amy Hendrix
8da3430852 override some thumbnail styles 2014-07-14 21:42:44 -04:00
Amy Hendrix
98cbac8a70 Remove an extra class on member thumbs 2014-07-14 21:18:15 -04:00
Amy Hendrix
81a996b8cc New markup for thumbnails 2014-07-14 20:50:35 -04:00
Amy Hendrix
8004632b41 Thumbnail style on individual planting page 2014-07-14 20:39:40 -04:00
Amy Hendrix
48d3488b2d B3 thumbnails for crops 2014-07-14 00:06:40 -04:00
Amy Hendrix
e93d4df3c0 Responsive thumbnails for members 2014-07-14 00:02:53 -04:00
Amy Hendrix
6503b2ec7c Turn off caching in dev 2014-07-13 23:54:37 -04:00
Amy Hendrix
d910b5629a Make thumbnail avatar responsive 2014-07-13 22:39:58 -04:00
Amy Hendrix
2fbd596811 Hidden class (not visible), to disable jumbotron class on home 2014-07-13 22:25:21 -04:00
Amy Hendrix
005a31c880 Use a hidden class for phones only, rather than multiple visible classes, on member block 2014-07-13 22:19:57 -04:00
Skud
0fd10643ce Merge pull request #369 from sabreuse/dev
Fix an issue with menu item layout at small screen sizes
2014-07-14 12:00:59 +10:00
Amy Hendrix
4be08e261a Merge branch 'dev' into bootstrap3 2014-07-13 21:55:43 -04:00
Amy Hendrix
10af60f30d Cleanup crops.js.erb 2014-07-13 21:46:33 -04:00
Amy Hendrix
191363402a Replace crops.js.erb 2014-07-13 21:45:19 -04:00
Amy Hendrix
0714c2a38c Menu items should be block, not inline-block, at mobile screen sizes 2014-07-13 21:30:08 -04:00
Amy Hendrix
bf1821f8ce Force bootstrap overrides into sync with upstream/dev 2014-07-13 21:26:07 -04:00
Amy Hendrix
c2435cfb8a catch up with upstream 2014-07-13 21:08:44 -04:00
Amy Hendrix
db9ef0bc83 Full-width form elements 2014-07-13 20:28:20 -04:00
Amy Hendrix
b374beae35 Tweaks for bottom navbar 2014-07-13 20:20:58 -04:00
Amy Hendrix
fdd3951ed7 Green is the primary brand color 2014-07-13 20:13:44 -04:00
Amy Hendrix
84f6635679 Continue cleaning up header styling 2014-07-13 20:07:42 -04:00
Amy Hendrix
27062d2537 Button group styling for homepage plant/harvest/etc actions 2014-07-13 20:07:20 -04:00
Amy Hendrix
0263e361c5 Update footer markup to use bootstrap3 navbar classes 2014-07-13 20:06:31 -04:00
Amy Hendrix
17c822f6f3 Unitless line-height 2014-07-13 19:44:21 -04:00
Amy Hendrix
4728de5dd8 Clean up header markup for Bootstrap 3 2014-07-13 19:27:06 -04:00
Amy Hendrix
4436562dec Bootstrap3: fix vars for nav & dropdowns 2014-07-13 19:05:51 -04:00
Amy Hendrix
155d68bab1 Bootstrap3: inline lists 2014-07-13 18:46:08 -04:00
Amy Hendrix
b7fbe60b83 Bootstrap3: form control groups 2014-07-13 18:45:56 -04:00
Amy Hendrix
76f2d003c5 visible and hidden elements to bootstrap3 2014-07-13 18:37:33 -04:00
Amy Hendrix
0d7fbc9b76 update button class to bootstrap3 2014-07-13 18:33:19 -04:00
Amy Hendrix
6ec7b8f897 Jumbotron classes to bootstrap3 2014-07-13 18:27:48 -04:00
Amy Hendrix
bf217b1618 correct navbar-btn 2014-07-13 18:25:02 -04:00
Amy Hendrix
bb458c17e8 another navbar-collapse instance 2014-07-13 18:23:53 -04:00
Amy Hendrix
6cb89d1c75 correct navbar-nav class in header 2014-07-13 18:22:01 -04:00
Amy Hendrix
e9b3c33022 Navbar centering style for bootstrap3 2014-07-13 18:21:04 -04:00
Amy Hendrix
d7145b327f Update .brand to bootstrap3 2014-07-13 18:19:22 -04:00
Amy Hendrix
f0cd8df6e0 Update column classes 2014-07-13 18:16:57 -04:00
Amy Hendrix
8d0d01991b Bootstrap3 update: row classes 2014-07-13 15:15:08 -04:00
Amy Hendrix
df9169c13d Get stylesheet includes working 2014-07-13 15:11:59 -04:00
Amy Hendrix
088cd36d6f Update variable names to bootstrap 3 versions 2014-07-13 15:11:35 -04:00
Amy Hendrix
e226ce406c Rename bootstrap_and_overrides file 2014-07-13 15:11:21 -04:00
Amy Hendrix
bc38359219 Didn't need to specify including custom bootstrap - require_tree takes care of it 2014-07-13 14:23:35 -04:00
Amy Hendrix
471ecbc458 Require the new custom bootstrap the main stylesheet 2014-07-13 14:15:27 -04:00
Amy Hendrix
9a09d8a0ae Switch from twitter-bootstrap-rails gem to less-rails-bootstrap 2014-07-13 14:12:36 -04:00
Taylor Griffin
ded464ad4c removed call to for debugging 2014-07-13 18:00:46 +10:00
Taylor Griffin
8b45a1759c got scientific names working on the crop page but view tests are failing 2014-07-13 17:57:55 +10:00
Amy Hendrix
21d5156137 Merge branch 'master' of https://github.com/Growstuff/growstuff into dev 2014-07-10 19:43:47 -04:00
Skud
8ee1499a07 Merge pull request #367 from Skud/new-contributors
added a few recent contributors
2014-07-10 10:53:17 +10:00
Skud
0558d854af added a few recent contributors 2014-07-10 10:52:20 +10:00
Joseph Caudle
c89e1ec096 Merge pull request #365 from Skud/case-insensitive-search
Case insensitive search
2014-07-08 16:22:37 -04:00
Joseph Caudle
95130bda67 Merge pull request #366 from Skud/wrangler-rake-task
Added rake task to add new crop wranglers
2014-07-08 16:20:40 -04:00
Skud
e560258b39 install pg in all environments 2014-07-06 21:40:10 +10:00
Skud
60b407986d One more try to get travis working with postgres 2014-07-06 21:34:23 +10:00
Skud
cf41a9b866 don't install production gems in test 2014-07-06 21:30:20 +10:00
Skud
c2f7cf08ca trying to revert to the simplest travis config 2014-07-06 21:25:12 +10:00
Skud
7d624fd9ca Attempting to get scientific name editing on one page (doesn't work yet) 2014-07-06 21:21:51 +10:00
Skud
0718b5818a looks like we needed that postgres creation line after all 2014-07-06 20:52:42 +10:00
Skud
5744499182 Added rake task to add new crop wranglers
Also changed code for admin and crop wrangler to assume we already have
those roles set up, as they're part of db/seeds.rb
2014-07-06 20:37:54 +10:00
Skud
0174202ef0 Remove travis environment
We had this special environment because we wanted travis to be different
to our test environment -- specifically, to use postgres, while we used
sqlite in dev/test.  We now use postgres in dev/test so this is no
longer necessary.
2014-07-06 20:27:35 +10:00
Skud
77d2b0e950 make crop search case insensitive 2014-07-06 20:16:59 +10:00
Skud
8897e5149d switch to using postgres in dev and test 2014-07-06 20:14:12 +10:00
Skud
dd381378f1 Merge pull request #364 from Skud/crop-map3
Finally got crop maps AND community map working
2014-07-04 11:42:17 +10:00
Skud
34c45c8935 Fixed bug with specific place map
(it was still referring to div#map not #placesmap)

also changed the headings a bit on that page
2014-07-04 11:17:04 +10:00
Skud
99c473ab40 Changed headings on places maps to match new menu ('Community map') 2014-07-04 11:13:35 +10:00
Skud
0dac36df74 fixed tests to pass with new map div ids 2014-07-04 11:08:13 +10:00
Skud
828e9d318a check that map exists on page before drawing it 2014-07-04 11:02:23 +10:00
Skud
890a21ddb2 small refactoring to clean up js 2014-07-04 10:49:52 +10:00
Skud
c8dbdbe298 Rename map on /places to #placesmap
The way the javascript is compiled means it's a good idea to make sure
everything is as distinct as possible.
2014-07-04 10:47:50 +10:00
Skud
9f1a7aad63 Merge pull request #363 from Skud/crop-map2
fixed error with crop map on staging
2014-07-04 10:39:34 +10:00
Skud
f28ddaded1 renamed div#map to #cropmap on crop page
this prevents confusion when assets are compiled (i.e. it worked in dev
but not on staging; this fixes the problem.)
2014-07-04 10:38:37 +10:00
pozorvlak
ec9bd2bd7b Merge pull request #361 from Skud/crop-map
Crop map
2014-07-03 10:44:01 +01:00
Skud
67dae650bc Merge pull request #362 from Skud/navbar-visual-tweaks
Navbar visual tweaks
2014-07-02 07:33:17 +12:00
Amelia Greenhall
a5e4b0816c fix centering on top nav 2014-07-02 07:16:22 +12:00
Amelia Greenhall
adb275737f update the navbar and footer to more modern design and colors 2014-07-02 07:16:22 +12:00
Amelia Greenhall
c489c6ac70 remove 1px wide black line on borders 2014-07-02 07:16:22 +12:00
Skud
fea7da3546 rearranged crop page headings and added tests 2014-06-30 12:14:06 -07:00
Skud
f8cb7248b7 Reduced cluster radius for maps
on both crops and places pages

Did this because the clusters were annoyingly over-general, eg. showing
164 people in the eastern part of North America.  Cluster radius of 20px
is about the radius of the cluster icon itself.  Seems to work better
eg. for separating Melbourne from Sydney on the world map.
2014-06-30 11:56:46 -07:00
Skud
4972127957 Display crop plantings on a map 2014-06-30 11:51:01 -07:00
Skud
3abaca3136 Tweak what's emitted as JSON
(let's just emit plantings for now, as that's all we're using)
2014-06-30 11:48:58 -07:00
Skud
8eb644fc66 Add map, move info to sidebar 2014-06-30 11:48:13 -07:00
Skud
2f8e060b49 added plantings, seeds, and harvests to the crops JSON 2014-06-30 10:56:58 -07:00
pozorvlak
cdb146c7d7 Merge pull request #360 from Skud/crop-images
Crop images
2014-06-28 20:04:52 +01:00
Skud
1ac35e7d4e Darkened text background for readability 2014-06-28 11:29:51 -07:00
Skud
0560172565 Fixed incorrect env variable 2014-06-28 11:28:21 -07:00
Skud
343e7963f2 Use the latest omniauth-flickr
Something seems to have chagned in the API (requiring https?) which was
breaking things.
2014-06-28 11:27:45 -07:00
Skud
d10c9d96f1 Fixed whitespace issues and tests 2014-06-28 11:27:26 -07:00
Barbara Natali
174b98b118 Improve display of images on crop page 2014-06-18 21:54:30 -07:00
Skud
b2948b4367 Merge pull request #357 from Growstuff/dev
Production push: improved navbar, fixed maps bug
2014-06-18 21:02:02 -07:00
Skud
6e1101576e Merge pull request #356 from ameliagreenhall/smallsearch
Smallsearch
2014-06-18 20:49:57 -07:00
Amelia Greenhall
360ca96526 change to input class, not input-append 2014-06-18 19:55:57 -07:00
Amelia Greenhall
ef39d26fbd smaller search box in top nav 2014-06-18 19:49:10 -07:00
pozorvlak
6858ec3f17 Merge pull request #354 from Skud/places-name-bug
Fixed bug with capitalisation of usernames in map popups
2014-06-15 00:20:30 +01:00
pozorvlak
22d67083f6 Merge pull request #355 from Skud/admin-menus
Rearranged menus to save space
2014-06-14 23:44:35 +01:00
Skud
997186a701 Rearranged menus to save space 2014-06-12 19:27:02 -07:00
Skud
050834734f Fixed bug with capitalisation of usernames in map popups 2014-06-12 18:49:06 -07:00
Skud
ff03405289 Merge pull request #353 from Growstuff/dev
Production push: crop search, backend upgrades, roots/tubers, map fixes
2014-06-06 14:27:50 -05:00
pozorvlak
039eb5472a Merge pull request #352 from Skud/mapbox
Replace cloudmade maps with mapbox
2014-06-04 15:54:08 +01:00
Skud
d90268bd16 Added note as to why mapbox config isn't in application.yml 2014-06-02 19:00:50 -05:00
Skud
5d587af8b0 replaced cloudmade maps with mapbox 2014-06-02 18:57:03 -05:00
pozorvlak
879e94fe06 Merge pull request #351 from Skud/root-tuber-csv
Added roots/tubers to the CSV output for crops
2014-05-30 18:27:48 +01:00
Skud
1d71afdb2f Added roots/tubers to the CSV output
Also rearranged their order on the planting form to put it nearer bulbs
2014-05-30 11:05:33 -05:00
Joseph Caudle
73a0ae402c Merge pull request #350 from Skud/ruby-version
switch from .rvmrc to .ruby-version
2014-05-13 09:12:30 -04:00
Alex Bayley
932cbbea26 switch from .rvmrc to .ruby-version 2014-05-13 13:51:16 +10:00
Joseph Caudle
34f3c74013 Merge pull request #348 from pozorvlak/delete_rails_secret
Delete commented-out code.
2014-05-06 11:24:08 -04:00
pozorvlak
dcbfda02b9 Merge pull request #349 from maco/dev
Add 'root/tuber' to 'planted from:' list, for things like potatoes
2014-05-06 11:56:22 +01:00
Mackenzie Morgan
062add32dc Add 'root/tuber' to 'planted from:' list, for things like potatoes 2014-05-04 22:46:45 -04:00
Miles Gould
05a2c9080f Delete commented-out code. 2014-05-03 16:21:08 +01:00
pozorvlak
7da0d54487 Merge pull request #347 from Skud/devise-bug2
revert to devise 3.0.x due to confirmable misbehaviour
2014-05-02 10:28:21 +01:00
Skud
b489fda18e revert to devise 3.0.x due to confirmable misbehaviour
as documented here: https://github.com/plataformatec/devise/issues/3009

also update mailer to use letter_opener and also localhost:8080 since
we're mostly using unicorn at this point.
2014-05-01 22:48:52 +10:00
pozorvlak
f7411da5cf Merge pull request #345 from Skud/figaro
Figaro
2014-04-30 14:12:09 +01:00
Skud
53a4812571 oops, fixed incorrect syntax for env vars 2014-04-29 14:02:39 +10:00
Skud
9e5c5239a8 Need to put the site name in .travis.yml for tests to pass 2014-04-29 13:46:54 +10:00
Skud
ee27b3bd6a updated docs in application.yml.example 2014-04-29 13:28:44 +10:00
Skud
8384233f4d Moved RAILS_SECRET_TOKEN to figaro
This is the last of the stuff that was in credentials.sh so I'm removing
the deprecated credentials.example at this point.
2014-04-29 13:18:02 +10:00
Skud
72ce69ea8f moved flickr and twitter api config to figaro 2014-04-29 13:14:47 +10:00
Skud
b61bbc2170 moved mailchimp settings to figaro 2014-04-29 13:11:57 +10:00
Skud
bf6bb7f620 Moved mandrill config to figaro 2014-04-29 13:07:23 +10:00
Skud
bc36713449 Switched paypal settings to figaro 2014-04-29 13:01:04 +10:00
Skud
2cd5b1d2ed Changed one config setting (site name) over to figaro
Also massively simplified the original application.yml.example I
originally committed. Let's do this one step at a time.
2014-04-29 12:57:16 +10:00
Skud
923f943717 added application.yml to gitignore 2014-04-29 12:46:41 +10:00
Skud
13fcf9db4b added deprecation notice to credentials.example 2014-04-29 12:30:56 +10:00
Skud
bacbaf756e added application.yml.example 2014-04-29 12:29:28 +10:00
Skud
3f92f1fb79 Added figaro gem 2014-04-29 12:25:07 +10:00
Skud
1c34d428f2 Merge branch 'crop-search' of https://github.com/Skud/growstuff into Skud-crop-search
Conflicts:
	spec/models/crop_spec.rb
2014-04-29 11:16:20 +10:00
Joseph Caudle
b95647e353 Merge pull request #344 from Skud/ruby2
Ruby2
2014-04-28 13:47:08 -04:00
Skud
c21310c4e2 tweaking less versions as heroku is complaining about later ones 2014-04-28 13:11:43 +10:00
Skud
b86014b04f attempting to fix libv8 problem occurring on heroku 2014-04-28 13:02:23 +10:00
Skud
66a7dca5ab apparently leaflet.ie isn't a thing any more?
https://github.com/Leaflet/Leaflet/issues/2159
2014-04-28 12:54:07 +10:00
Skud
64d96f427f update travis.yml to use 2.1.1 2014-04-28 12:44:22 +10:00
Skud
74e1e07567 tweaking secret key settings to match what heroku already has 2014-04-28 12:42:23 +10:00
Skud
28c789f85c Update to ruby 2.1.1 and various gem tweaks to go with it 2014-04-28 12:33:43 +10:00
Skud
d33d0c507b Upgrade to ruby 2.0.0 2014-04-28 12:08:13 +10:00
Skud
14318ec235 Merge pull request #342 from pozorvlak/harvest_grams
Allow harvesting non-integer quantities.
2014-04-28 11:02:08 +10:00
Skud
813b0da6ef Merge pull request #343 from pozorvlak/seed-transaction
Wrap rake db:seed in a transaction.
2014-04-28 11:01:54 +10:00
Miles Gould
79f96f5ef4 Insist that crops created by db:seed are new.
This shaves 2s off the 22s runtime of `rake db:seed` on my machine.
2014-01-10 18:11:27 +00:00
Miles Gould
c50f345f1c Wrap rake db:seed in a transaction.
This gives about a 30% speedup on my machine (from 30s to 20s). See
http://stackoverflow.com/questions/1711631/how-do-i-improve-the-performance-of-sqlite
2014-01-10 14:10:27 +00:00
Miles Gould
4b88bf80f1 Test for spec=any in harvests/new. 2014-01-05 13:20:07 +00:00
Miles Gould
deb706607e Explain step="any" in harvest _form view. 2014-01-05 12:27:10 +00:00
Miles Gould
96675e2eca Allow harvesting non-integer quantities.
Some browsers (grrr Firefox for Android grrrr) assume "number" means
"integer" unless you specify `step="any"`. Perhaps the developers were
inspired by Kronecker?
http://mathoverflow.net/questions/34445/meaning-of-kroneckers-comment-to-lindemann

This was reported as a bug for non-integer weights; I've allowed
non-integer quantities in the other field, because some allowable units
(eg litres) are obviously divisible.
2014-01-03 21:03:01 +00:00
Skud
aa07928f1f Show crop thumbnails on search results page 2014-01-03 22:56:31 +11:00
Skud
47f182193f Added sexy search button to navbar search box 2014-01-03 22:48:06 +11:00
Skud
4ce071a0df Fixed a bug that was deleting crops from the database!
Best bug of the night. TIL: don't call delete on an activerecord
collection expecting it to act like an array. D'oh!
2014-01-03 22:47:18 +11:00
Skud
0a3ecdc5ad Added crop search controller and views 2014-01-03 22:29:44 +11:00
Skud
addd9cbddf Added search method to crops
For now it just does a naive SQL LIKE query. We can make this fancier in
future, if we want to.
2014-01-03 21:50:41 +11:00
Skud
30c1129cab Added route for crop search 2014-01-03 21:28:08 +11:00
Skud
9b278ed05e Added crop search form to header 2014-01-03 21:26:35 +11:00
Skud
8588d0f901 Added a bit more info about mailchimp lists
(not really part of this story, was just hanging around, sorry)
2014-01-03 21:25:54 +11:00
pozorvlak
06f1d9cb7e Merge pull request #338 from Skud/crop-mentions
Crop mentions
2014-01-02 03:16:40 -08:00
Skud
f45a8b346f Merge pull request #339 from pozorvlak/harvest-parts
Harvest parts
2014-01-02 03:05:56 -08:00
Miles Gould
338a7512e8 Explain reordering of plant_parts in a comment. 2014-01-02 11:04:57 +00:00
Skud
e00ad7d5eb Merge pull request #340 from Growstuff/dev
Production push: harvest improvements, more RSS, crop uploads, new garden fields
2014-01-02 02:14:16 -08:00
Miles Gould
18ccb0d9fb Merge branch 'dev' into harvest-parts
Conflicts:
	spec/models/harvest_spec.rb
2013-12-03 13:25:18 +00:00
Miles Gould
2a260abf05 Fix Postgres problem with PlantParts#crops
Postgres complains if the ORDER BY clause of a SELECT DISTINCT query is
not precisely one of the SELECTed fields. The default sort order on
crops is lower(name), and Postgres is not smart enough to notice that it
can calculate this from fields which are selected. The solution is to
override PlantParts#crops to remove the ORDER BY clause, and replace it
with `ORDER BY name`. This is not perfect, because it means the crops
associated to plant parts will not be sorted in the same order as crops
on the rest of the site.
2013-12-03 12:56:57 +00:00
Skud
948cb37d26 Specify ruby version for heroku's benefit 2013-11-23 15:56:07 +11:00
Skud
06b8740f58 Specify ruby version for heroku's benefit 2013-11-23 15:34:42 +11:00
Skud
21c10e09ab upgrade ruby version on heroku due to vulnerability 2013-11-23 15:31:40 +11:00
Skud
9da92c8f71 Make growstuff HAML extensions case insensitive 2013-11-11 11:18:14 +11:00
Skud
11e7055497 Improved case (in-)sensitivity in tests 2013-11-11 11:11:35 +11:00
Skud
9c899e80a3 Updated help text for markdown 2013-11-11 11:11:12 +11:00
Skud
076db6dd07 Use growstuff markdown in RSS feeds 2013-11-11 10:33:35 +11:00
Skud
8620236cb0 Use growstuff markdown everywhere (except policy) 2013-11-11 10:33:20 +11:00
Skud
ce7bf82336 Make growstuff markdown actually work 2013-11-11 10:20:52 +11:00
Skud
3a162e9b31 Fixed broken tests for markdown filter 2013-11-08 12:55:47 +11:00
Miles Gould
4add2f3dcf s/system_name/name 2013-11-07 12:03:43 +00:00
Skud
f3779cd2c9 Quick links to crop pages in Markdown. 2013-11-07 11:43:25 +00:00
Skud
c575638962 Added harvests and plant parts to crops CSV 2013-11-06 12:00:36 +11:00
Skud
5afaea90b9 Added plant part to harvest CSV 2013-11-06 11:23:52 +11:00
Skud
60eb4c7296 Show aggregate 'grown from' data on crop page 2013-11-06 11:21:08 +11:00
Skud
838f3c6e36 Add plant parts to harvest views 2013-11-06 10:45:03 +11:00
Skud
a1ea1fd9c1 prettify plant part views 2013-11-06 10:39:32 +11:00
Skud
435cb4aed9 remove annoying scaffold-generated tests 2013-11-06 10:39:19 +11:00
Skud
ba27bb6490 plant parts have crops through harvests 2013-11-06 10:38:50 +11:00
Skud
ac5027ec27 Can't delete plant parts that are being used 2013-11-06 10:38:28 +11:00
Miles Gould
084bdc4f40 Add friendly URLs to plant parts. 2013-10-31 00:19:48 +00:00
Miles Gould
1b85326549 Test that only admins can manage plant parts. 2013-10-31 00:02:59 +00:00
Miles Gould
f723fea4e2 Load plant parts in db:seed and rake task. 2013-10-30 23:49:34 +00:00
Miles Gould
e9a3c0f4ee rails g scaffold PlantPart...
Also migration to remove the string plant_part.
2013-10-30 23:32:20 +00:00
pozorvlak
23d9229d73 Merge pull request #336 from Skud/quicktweaks
Quick tweaks
2013-10-30 15:46:51 -07:00
Skud
94cb16acbd List inactive gardens separately 2013-10-31 09:29:38 +11:00
Skud
eb8497e1fb Add RSS link to crops index page 2013-10-31 09:25:23 +11:00
Skud
315da26542 Don't show garden location if blank 2013-10-31 09:23:39 +11:00
Skud
26bd744d31 Improve help wording for garden location 2013-10-31 09:18:38 +11:00
pozorvlak
85f132edff Merge pull request #335 from Skud/crop-harvests
Show harvests on crop page
2013-10-29 04:31:27 -07:00
pozorvlak
91e0ba92de Merge pull request #334 from Skud/harvest-bugs
Harvest bugs
2013-10-29 04:31:04 -07:00
Skud
40eac92013 Moved help text so it flows more nicely 2013-10-29 17:33:02 +11:00
Skud
5302dd58b1 Added pollen as a harvestable plant part 2013-10-29 17:31:16 +11:00
Skud
f90da16cb1 Added plant part to harvest form 2013-10-29 17:29:01 +11:00
Skud
7a5bfa5e07 Added 'other' and 'whole plant' to harvestable plant parts 2013-10-29 17:28:51 +11:00
Skud
721692277d Added plant_part validation to harvest model 2013-10-29 17:17:12 +11:00
Skud
f89c5e5b86 Added plant_part attribute to harvest 2013-10-29 17:00:32 +11:00
Skud
9917b3a489 Show harvests in crop page sidebar
Also tweaked seed display to make them more consistent.
2013-10-29 16:23:17 +11:00
Skud
8dcd3932fa Added a partial to display a member's location. 2013-10-29 16:22:48 +11:00
Skud
0ae0e54369 Sort harvests by created_at DESC 2013-10-29 15:17:01 +11:00
Skud
3494651685 Fixed quantity display bug 2013-10-29 15:02:32 +11:00
Skud
795dc0923f Merge pull request #333 from Skud/garden-inactive
New fields for gardens
2013-10-25 06:45:25 -07:00
Skud
faf0ed39d6 actually this is a slightly better fix 2013-10-26 00:44:30 +11:00
Skud
d49a9e28e4 Fixed broken test 2013-10-26 00:35:38 +11:00
Skud
e26544f5ad Added owner link to the garden page 2013-10-25 23:51:08 +11:00
Skud
b63c854b16 Set default garden locations
Also created a handy rake task to depopulate Null Island (i.e. fix up
anyone's lat/long that's somehow ended up as 0,0).
2013-10-25 23:45:48 +11:00
Skud
86aae6534b Default garden location to the owner's location, if known 2013-10-25 23:25:23 +11:00
Skud
1798696a7b Don't allow planting in inactive gardens 2013-10-25 23:07:48 +11:00
Skud
60392c30ce Only list active gardens in planting form 2013-10-25 23:05:22 +11:00
Skud
dcf5855643 Added new fields to gardens index 2013-10-25 23:01:23 +11:00
Skud
aee0adde43 Added active/inactive scopes 2013-10-25 22:58:40 +11:00
Skud
96b5a6cd94 Added new garden fields to gardens/show 2013-10-25 22:48:02 +11:00
Skud
aee35aeeca Added new fields to garden form 2013-10-25 22:32:40 +11:00
Skud
803f8244c9 Added various fields to garden
- active (default: true)
- location, latitude and longitude (because when you move house, you
    don't take your garden with you)
- area and area units (square feet or metres)
2013-10-25 21:54:13 +11:00
Skud
0aa0c38f1f Removed intentional errors accidentally left in when testing better_errors 2013-10-25 12:34:13 +11:00
Skud
52716df6e9 Fixing up confused crop names from two recent pull requests 2013-10-25 12:26:58 +11:00
Skud
a25ba32476 Merge branch 'system_name_to_name' of https://github.com/pozorvlak/growstuff into pozorvlak-system_name_to_name
Conflicts:
	db/seeds.rb
2013-10-25 12:14:01 +11:00
Skud
22df0a43fd Merge pull request #328 from Skud/crop-csv-upload
Crop csv upload
2013-10-24 18:07:09 -07:00
Skud
3b29efb828 Merge pull request #329 from pozorvlak/better_errors
Turn on better_errors in development.
2013-10-24 18:06:59 -07:00
Skud
f1368d39bb Merge pull request #332 from Skud/rss-links
Added posts and comments RSS links
2013-10-24 18:06:44 -07:00
Skud
2c8f0687e5 Added posts and comments RSS links 2013-10-23 12:06:04 +11:00
Skud
bc03252ffa Merge pull request #331 from Skud/rails_12factor
Added rails_12factor gem to suppress heroku messages
2013-10-21 20:33:54 -07:00
Skud
142df2ebad Added rails_12factor gem to suppress heroku messages 2013-10-22 14:30:05 +11:00
Miles Gould
9c5b6f6192 Rename Crop.system_name to Crop.name 2013-10-18 11:52:05 +01:00
Miles Gould
afa0dbcfa9 Turn on better_errors in development. 2013-10-18 11:03:57 +01:00
Skud
ed01c6fb29 Added some comments/docs to Crop.create_from_csv 2013-10-17 22:49:57 +11:00
Skud
c46e19e43e Load multiple crop CSV files from seeds.rb
We factored out a Crop.create_from_csv method to avoid duplicated code.

Note: naming convention with db/seeds/crop*.csv is to use a 2-digit
number for ordering.  00 and 10 chosen (with a gap in between) because I
learned to program in BASIC and it seemed like a good idea just in case.
2013-10-17 22:45:09 +11:00
Skud
a98cb31161 Added rake task to import new crops from CSV 2013-10-17 22:08:54 +11:00
Skud
58bd464bca Merge pull request #327 from Growstuff/dev
Production push: Harvests
2013-10-15 01:20:20 -07:00
Skud
bc3a31a6a3 Merge pull request #325 from Skud/csv
Fixed error with blank planting/plant_before dates in CSV files
2013-10-01 19:21:01 -07:00
Skud
219b6e3bbc Merge pull request #326 from Skud/harvests
Harvests
2013-10-01 19:20:43 -07:00
Skud
3f71605572 Turned quick links on homepage into buttons 2013-10-02 10:29:45 +10:00
Skud
7d2cadce83 Added 'harvest this' link to crop page 2013-10-02 10:18:23 +10:00
Skud
97065314f2 Fixed bug in "all test1's seeds" link
and added similar links to plantings and harvests
2013-10-01 12:43:01 +10:00
Skud
294a163918 Removed duplicate edit buttons 2013-10-01 12:37:03 +10:00
Skud
668cb33f15 Added more units for harvests 2013-10-01 12:35:41 +10:00
Skud
233d740df8 Fixed error with blank planting/plant_before dates 2013-10-01 12:21:31 +10:00
pozorvlak
bc6adc8840 Merge pull request #324 from Skud/csv
CSV data dumps
2013-09-27 08:14:12 -07:00
Skud
c23f27e8b0 Added CSV for seeds 2013-09-25 17:15:42 +10:00
Skud
9a48edc187 Fixed erroneous date 2013-09-25 17:12:58 +10:00
Skud
9cf770a200 Adjusted crops.rss to show most recent 2013-09-25 16:59:28 +10:00
Skud
013234c882 Added CSV for plantings 2013-09-25 16:57:27 +10:00
Skud
0116547c96 added links to CSV and JSON data 2013-09-25 16:23:58 +10:00
Skud
9cef31e646 allow per-owner CSV downloads 2013-09-25 16:11:08 +10:00
Skud
c452d38717 If quantity == 0, set it to nil 2013-09-25 16:07:22 +10:00
Skud
92ebf1a43c Added harvest CSV 2013-09-25 16:02:40 +10:00
Skud
1202a48131 Tweaked crop CSV to include added_by and license 2013-09-25 15:51:04 +10:00
Skud
a881ec2250 Merge commit '24255411c9d5907ebb6e8fcb39b6bca1833559d9' into csv 2013-09-25 15:41:47 +10:00
Skud
c5e8e4298f Separated informal/human units from measured weights 2013-09-25 15:39:17 +10:00
Joseph Caudle
00ef1b03d4 Merge pull request #322 from Skud/harvests
Harvests
2013-09-24 16:43:39 -07:00
Skud
4ba7a3a48e added harvest link to signed-in homepage 2013-09-23 10:03:22 +10:00
Skud
c3c3c435d5 improve display of quantities 2013-09-23 10:03:08 +10:00
Skud
78ee229205 Merge pull request #321 from Growstuff/dev
Production push: order referral codes and some CSS fixes
2013-09-18 18:23:22 -07:00
Skud
9af9d2ac04 Merge pull request #320 from Skud/order_referral_code
Order referral code
2013-09-18 18:16:00 -07:00
Skud
2ee11e19e5 removed spurious puts 2013-09-19 10:57:11 +10:00
Skud
e425a3f7f4 added error message if your referral code has invalid chars 2013-09-19 10:57:00 +10:00
Skud
9667f43874 Added friendly urls to harvests 2013-09-17 18:02:48 +10:00
Skud
c63fc97736 Validate quantity/unit for harvests
If quantity is blank, we also set unit to blank.
2013-09-17 17:56:00 +10:00
Skud
40ce4ab77b Validate units (must be one of individual/bunches/kg/lb)
Also changed "units" attribute to "unit". Oops, we weren't following the
Rails naming convention.
2013-09-17 17:26:18 +10:00
Skud
ebf6034659 Prettified all the harvest views 2013-09-17 17:09:17 +10:00
Skud
ccb0e42c95 Prettified harvest form
Also renamed "notes" to "description" in database
2013-09-17 16:08:41 +10:00
Skud
67b88e8e18 set cancan abilities for harvests 2013-09-17 15:53:51 +10:00
Skud
2196bc8373 Added associations between harvests, crops, and members 2013-09-17 15:51:30 +10:00
Skud
37383ba451 rails g scaffold Harvest... 2013-09-17 15:39:25 +10:00
Skud
3d42e4bce9 Merge pull request #319 from Skud/css-fixes
Css fixes
2013-09-16 17:55:17 -07:00
Skud
4e03e5abbd Merge pull request #318 from Skud/order_referral_code
Order referral code
2013-09-16 00:15:50 -07:00
Skud
24255411c9 added dates created/modified to crops csv 2013-09-16 17:04:39 +10:00
Skud
d014343667 A basic implementation of a CSV dump for crops 2013-09-16 15:33:34 +10:00
Skud
9e374779c0 Fixed navbar display CSS
1) Made sure padding is applied to the body *only* for the larger screen
sizes (by doing so before the responsive CSS is loaded)

2) Fixed indentation on the footer, which was incorrectly putting it
inside the main body container, and thus making it do this weird
narrowing thing at smaller screen sizes.
2013-09-16 11:09:52 +10:00
Skud
df3254135f Made li list style dots more specific
We set all li elements to use list-style disc, but it was affecting our
navbar.  Changed it to use a specific class in the crop hierarchy (where
we actually cared about it).
2013-09-16 10:49:02 +10:00
Skud
ab588bd21b add referral code to order admin table 2013-09-16 10:39:12 +10:00
Skud
a250bc162f Fixed up db/schema to remove spurious payments table 2013-09-16 10:22:42 +10:00
Skud
fef92f0d14 Added tests for admin order controller 2013-09-13 14:19:46 +10:00
Skud
faea1904c2 Added referral code search to admin forms 2013-09-13 13:47:46 +10:00
Skud
1adcedb534 moved admin order search into a model method 2013-09-13 13:38:11 +10:00
Skud
0ce821aacf added referral_code to order form/checkout code 2013-09-13 13:12:11 +10:00
Skud
2422182aa8 Added referral_code to Order
Also added validation (alphanumeric), but we're fairly lax about
whitespace and case, and clean up for them if they make minor errors.
2013-09-13 12:14:17 +10:00
Skud
065005395f Merge pull request #317 from Skud/crop-hierarchy-caching
Hotfix: Added caching of full crop hierarchy
2013-09-12 18:30:36 -07:00
Skud
950a333ac7 Merge pull request #316 from Skud/crop-hierarchy-caching
Added caching of full crop hierarchy
2013-09-12 18:30:15 -07:00
Skud
8994b5f5fc Added caching of full crop hierarchy
... as that page is really slow to load at present.
2013-09-13 11:24:03 +10:00
Skud
22cb6d2ad5 Merge pull request #315 from Skud/one-more-places-fix
(hotfix) Removed deploy script reminders, as no longer necessary
2013-09-12 05:07:21 -07:00
Skud
dbe542f3d2 Merge pull request #314 from Skud/one-more-places-fix
Removed deploy script reminders, as no longer necessary
2013-09-12 05:06:32 -07:00
Skud
c64499881d Removed deploy script reminders, as no longer necessary 2013-09-12 22:05:35 +10:00
Skud
b02091bc00 Merge pull request #313 from Growstuff/dev
Production push: places
2013-09-12 05:03:21 -07:00
Skud
32e49355ff Merge pull request #312 from Skud/one-more-places-fix
removed marker bounds on hover
2013-09-12 04:46:35 -07:00
Skud
f753211096 removed marker bounds on hover 2013-09-12 21:44:42 +10:00
Skud
32614da4ea Merge pull request #311 from Skud/pretty-maps
use a different, greener cloudmade tileset for maps
2013-09-11 02:19:58 -07:00
Skud
d345a082c8 use a different, greener cloudmade tileset for maps 2013-09-11 19:19:23 +10:00
Skud
191c86f0d5 Merge pull request #310 from Skud/final-places-fixes-really-truly
Final places fixes really truly
2013-09-11 01:22:23 -07:00
Skud
35f3ee8948 limit things-to-map to those with locations (duh) 2013-09-11 18:20:43 +10:00
Skud
e3c736927f removed spurious debug message from places/index 2013-09-11 18:17:19 +10:00
Skud
8f15b30eb7 Merge branch 'master' of heroku.growstuff:growstuff-dev into dev
Conflicts:
	app/assets/javascripts/places.js.erb
2013-09-11 18:12:15 +10:00
Skud
f6c6aa1051 Merge pull request #309 from Skud/places3
Places - one more try!
2013-09-11 01:10:37 -07:00
Skud
e7436de1e1 Merge branch 'places3' of github.com:Skud/growstuff into places3
Conflicts:
	app/assets/javascripts/places.js.erb
2013-09-11 18:08:46 +10:00
Skud
7e65af532d Set Leaflet icon path explicitly.
When we tried to deploy maps on staging, we got the following error
message in our Javascript console:

Error: Couldn't autodetect L.Icon.Default.imagePath, set it manually.

... so we did. The end.
2013-09-11 18:05:38 +10:00
Skud
a75ed5090a Hardcode Cloudmade API key.
Ugh, I know. But it's not any less secure than having it out there in
our Javascript, and it turns out Heroku just downright *refuses* to read
it from an environment variable during asset compilation. I even tried
an experimental Heroku addon
(https://devcenter.heroku.com/articles/labs-user-env-compile) but it
didn't work, so for now let's just do this and get it out there. I'm
sick of messing with it.
2013-09-11 18:03:19 +10:00
Skud
9cd9fa02f6 Merge branch 'master' of heroku.growstuff:growstuff-dev into places3 2013-09-11 17:33:57 +10:00
Skud
8a203deb19 Use experimental user-env-compile heroku addon
It seems that heroku generally denies us access to ENV['...'] during asset
compilation. They have reasonably good reasons for this, and yet I don't
know how else we're meant to get at our API keys (other than hardcoding
them into our config files, which we don't want to do).

So, to work around this, I'm recommending the use of the (experimental,
subject to removal/change, sigh) user-env-compile heroku addon.  This
lets us use ENV during asset compilation.

For more info see
https://devcenter.heroku.com/articles/labs-user-env-compile
2013-09-11 17:32:31 +10:00
Skud
f929f33844 experimenting with tainted vars, again. revert this later. 2013-09-11 16:58:52 +10:00
Skud
8b65ad5b8f experimenting with tainted vars. revert this later. 2013-09-11 16:54:03 +10:00
Skud
75d8b472d1 do env vars show up in the js? 2013-09-11 16:47:11 +10:00
Skud
90f3f0e17c still trying to get cloudmade key working (should be reverted later) 2013-09-11 16:35:20 +10:00
Skud
3582abab73 debugging output for cloudmade key (needs to be reverted later) 2013-09-11 16:29:04 +10:00
Skud
481ef2c4d1 further adventures in finding the cloudmade_key 2013-09-11 16:23:27 +10:00
Skud
541031707f Merge branch 'master' of heroku.growstuff:growstuff-dev into places3 2013-09-11 16:16:27 +10:00
Skud
67a0af3d87 Moved all ERB processing to the outside of functions
I'm not sure if this will do anything or not, but I can't figure out why
else the email address would have been getting inserted by ERB but the
cloudmade key wouldn't be.
2013-09-11 16:14:53 +10:00
Skud
af9023f87e Merge pull request #308 from Skud/places3
Made a config variable for cloudmade_key
2013-09-10 21:28:44 -07:00
Skud
c58a24f851 Made a config variable for cloudmade_key
(because the assets pipeline doesn't seem to want to deal direct with
ENV variables.)
2013-09-11 14:26:56 +10:00
Skud
b39df447b6 Merge pull request #307 from Skud/places3
Places - finally fixed?
2013-09-10 21:00:54 -07:00
Skud
7a57b4818f fixed js == vs === as per sabreuse's recommendation 2013-09-11 14:00:30 +10:00
Skud
80b9285727 reinstate @place instance variable for title 2013-09-11 13:19:51 +10:00
Skud
138318e5f4 Moved searching for nearby members into the model 2013-09-11 13:14:52 +10:00
Skud
7d5643e30d Sort nearby members by distance
Also removed distance/units from the places/show search, since you can
adjust nearness by zooming etc.

At this point the "members near here" stuff at the bottom of the page
exists mostly for accessibility and to give additional detail that we
don't currently show in the popups on the map.

So we're not using distance/units to search for members near here
anymore, but instead are just finding the 30 nearest members to the
specified location, and showing them in order of nearness.
2013-09-11 12:41:01 +10:00
Skud
3cd48f751e Redid places/show using the all-javascript method.
Moved JSON for "what's here?" from members/index to places/index -- we
can improve this later if we want to show things other than members.
2013-09-11 12:14:18 +10:00
Skud
f201f357da reinstated map attribution 2013-09-11 10:28:19 +10:00
Skud
c02772d219 Spike: use pure javascript and JSON API to draw map 2013-09-09 22:15:47 +10:00
pozorvlak
658d46ccf0 Merge pull request #304 from Skud/crop-hierarchy-page
Crop hierarchy page
2013-09-05 05:42:47 -07:00
pozorvlak
0d922acd56 Merge pull request #305 from Skud/explanatory-text
Added explanatory text to the top of the crops/seeds pages
2013-09-05 05:42:26 -07:00
Miles Gould
0bb482d181 Use Leaflet marker clusters.
Doesn't work - clusters don't spiderfy at max zoom, show their
boundaries on hover or split when you get close to them.
2013-09-05 13:40:20 +01:00
Miles Gould
d6972da84f Speed up geocoding/deal better with slow geocoding.
- set limit=1
 - set timeout=10s
2013-09-05 13:10:47 +01:00
Miles Gould
67ed1e2170 Set map height in CSS; smaller for phones.
In future we should consider making classes for different sizes of maps.
2013-09-05 12:25:45 +01:00
Skud
be6d6fd6bd Added a crop hierarchy link to the crop wrangler page 2013-09-02 12:07:58 +10:00
Skud
9e190d7345 Show new hierarchical varieties on crop page 2013-09-02 12:03:28 +10:00
Skud
cf9c1d7aa3 Make all list items use disc style (filled-in circle) 2013-09-02 12:02:34 +10:00
Skud
995f9b2d60 Display crop hierarchy (recursively!) 2013-09-02 12:01:58 +10:00
Skud
4dbfecd315 Added toplevel scope for crops without a parent 2013-09-02 11:52:01 +10:00
Skud
772eec77a7 added routes and controller stuff for crop hierarchy 2013-09-02 11:13:02 +10:00
Skud
a0e81b4570 Added explanatory text to the top of the crops/seeds pages 2013-09-02 11:04:49 +10:00
pozorvlak
3beb2e27f2 Merge pull request #292 from pozorvlak/places2
Added "places" pages to show maps of where members are
2013-08-31 08:12:27 -07:00
Miles Gould
71ea2b0485 Remove "\/" from escaped JavaScript to prevent test errors.
We were getting annoying "couldn't close <p> with </script>" messages
when running tests, because escape_javascript was turning </p> into
<\/p>. We fixed this by gsub'ing \/ to / after calling
escape_javascript. What could possibly go wrong? :-)
2013-08-31 16:07:27 +01:00
Miles Gould
4701bd1b2e Merge branch 'dev' into places2
Conflicts:
	Gemfile.lock
	config/application.rb
	credentials.example
2013-08-31 15:49:30 +01:00
martyhines
b49d548240 Escape pop-up text in place/show 2013-08-31 15:43:25 +01:00
pozorvlak
fd24680a16 Merge pull request #301 from attlebish/hidecrops
Hidecrops
2013-08-31 06:21:00 -07:00
Miles Gould
d9cb1cba89 Merge branch 'bulb' into dev 2013-08-30 12:01:43 +01:00
Miles Gould
087c2c5834 Remove extra whitespace. 2013-08-30 11:59:59 +01:00
pozorvlak
b211e34cd6 Merge pull request #302 from Skud/planting-help
added help text/links to planting form
2013-08-30 03:51:32 -07:00
Skud
ffeda3007a added help text/links to planting form 2013-08-30 16:37:59 +10:00
Lilly
0c45fde749 Hide members when in mobile view 2013-08-30 15:53:16 +10:00
Lilly
310b40aace Hide crops when in mobile view 2013-08-30 15:47:36 +10:00
Lilly
5c4ee581cc Added 'bulb' as a 'planted_from' option. 2013-08-30 15:08:23 +10:00
Miles Gould
2c6e2ee2d7 Merge branch 'dev' into places2
Conflicts:
	app/views/members/_popover.html.haml
2013-08-28 13:02:25 +01:00
Miles Gould
ca236ce7fd Improve readability of controllers/places slightly. 2013-08-28 12:24:12 +01:00
Miles Gould
24f306e8ef Set User-Agent in Geocoder requests; delete custom nominatim lib.
Nominatim-the-service's license requires that we identify ourselves.
The custom nominatim lib is no longer required since Geocoder is now
Fast Enough.
2013-08-28 12:08:19 +01:00
Miles Gould
c955504ad7 Reinstate Geocoder lookup
Direct Nominatim lookups were playing badly with "nearby" method in
testing. The slowness is largely fixed in the HEAD revision of Geocoder.
2013-08-28 12:00:58 +01:00
Skud
af3d6a50a3 Fixed CSS problem with popup tip
The little triangle underneath the popup was looking weird.  Turns out
it was mostly because of some of the leaflet_ie.css stuff, so we made
sure that the non-IE CSS took precedence, and wrote in a little override
for an unwanted border as well.
2013-08-26 11:06:21 +10:00
Miles Gould
bce0fe23c0 Replace string keys with symbols in Nominatim spec.
We're using symbol keys in the actual code, and hence should probably
use test data of the same format.
2013-08-23 17:19:20 +01:00
Miles Gould
ef73e712ba Remove nominatum.rb's dependence on Rails
The user_agent and user_agent_email are now set as class instance
variables in config/initializers/nominatim.rb.
2013-08-23 17:00:19 +01:00
Miles Gould
aa73a07e5f Add in_testing config option to Nominatum
Checking against Rails.env.test? fails on Travis.
2013-08-23 16:37:43 +01:00
Miles Gould
dfa3c410fc Show names of members in popovers in places/ 2013-08-23 14:37:29 +01:00
Miles Gould
60ddc82d9f Credit OpenStreetMap under ODbL.
- broke map attributions into a partial
2013-08-23 14:36:30 +01:00
Miles Gould
8ce2798fb3 Fail gracefully if location is not found. 2013-08-23 14:12:04 +01:00
Miles Gould
89fa16f5b3 Re-add member name to popups; fix escaping problems. 2013-08-23 14:04:43 +01:00
Miles Gould
251a45a441 Add a User-Agent to Nominatum requests
- unified repeated config into config/application.rb
 - removed superfluous calls to Growstuff::Application.config
2013-08-23 14:03:46 +01:00
Miles Gould
7857bfd0df Merge branch 'dev' into places2
Fix up broken indentation on navbar.
Conflicts:
	app/views/layouts/_header.html.haml
2013-08-23 13:29:37 +01:00
Miles Gould
4e62991f22 Replace Geocoder lookups with direct calls to Nominatim.
This is because Geocoder-via-Nominatim was really really slow (up to
10s).
2013-08-23 13:11:02 +01:00
Skud
57fe663675 Merge branch 'dev' of https://github.com/Growstuff/growstuff into places2
Conflicts:
	app/controllers/members_controller.rb
	app/models/member.rb
	app/views/members/_popover.html.haml
	spec/models/member_spec.rb
2013-08-21 17:35:31 +10:00
Skud
e54697189f look up nominatim directly 2013-08-13 12:31:19 +10:00
Skud
afc57db8d3 Added links to places pages
Committing with broken tests and pushing to github just so people can
take a look at what we're doing.
2013-08-12 13:38:20 +10:00
Skud
5cc1ab2ab5 switched geocoding from google to openstreetmaps 2013-08-12 13:00:54 +10:00
Skud
d30f8e443e added popovers, added map on places/show page 2013-08-12 12:36:09 +10:00
Skud
be9bc4ba4d added 'Places' to top nav 2013-08-12 10:48:06 +10:00
Skud
32f2830df5 changed located scope to ignore blank lat/long 2013-08-12 10:46:35 +10:00
Ryan Clark
23f8848773 Added markers for member locations 2013-08-06 19:52:29 -07:00
Ryan Clark
fe00146f22 Added map to places/index 2013-08-06 19:38:11 -07:00
Joseph Caudle
a43d3a1ce7 Add places pages
This commit builds off of @Skud's spike on locations and largely takes
off from the `nearby_members` feature which previously existed on
members.

One thing to note is that we needed to add a search route and action to
`PlacesController` to account for requests of new places as they could
not be redirected to properly from within `PlacesController#show`.

[Story #53848631]
2013-08-02 00:15:51 -04:00
580 changed files with 10903 additions and 4000 deletions

1
.gitignore vendored
View File

@@ -7,6 +7,7 @@ coverage
.*.sw*
*~
*.DS_Store
config/application.yml
credentials*.sh
Pathogen:
custom_plan.rb

1
.rspec
View File

@@ -1 +1,2 @@
--color
--require spec_helper

1
.ruby-gemset Normal file
View File

@@ -0,0 +1 @@
growstuffdev

1
.ruby-version Normal file
View File

@@ -0,0 +1 @@
2.1.5

52
.rvmrc
View File

@@ -1,52 +0,0 @@
#!/usr/bin/env bash
# This is an RVM Project .rvmrc file, used to automatically load the ruby
# development environment upon cd'ing into the directory
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
# Only full ruby name is supported here, for short names use:
# echo "rvm use 1.9.3" > .rvmrc
environment_id="ruby-1.9.3-p194@growstuffdev"
# Uncomment the following lines if you want to verify rvm version per project
# rvmrc_rvm_version="1.14.10 (stable)" # 1.10.1 seams as a safe start
# eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
# echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
# return 1
# }
# First we attempt to load the desired environment directly from the environment
# file. This is very fast and efficient compared to running through the entire
# CLI and selector. If you want feedback on which environment was used then
# insert the word 'use' after --create as this triggers verbose mode.
if [[ -d "${rvm_path:-$HOME/.rvm}/environments"
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
then
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
[[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]] &&
\. "${rvm_path:-$HOME/.rvm}/hooks/after_use" || true
if [[ $- == *i* ]] # check for interactive shells
then echo "Using: $(tput setaf 2)$GEM_HOME$(tput sgr0)" # show the user the ruby and gemset they are using in green
else echo "Using: $GEM_HOME" # don't use colors in non-interactive shells
fi
else
# If the environment file has not yet been created, use the RVM CLI to select.
rvm --create use "$environment_id" || {
echo "Failed to create RVM environment '${environment_id}'."
return 1
}
fi
# If you use bundler, this might be useful to you:
# if [[ -s Gemfile ]] && {
# ! builtin command -v bundle >/dev/null ||
# builtin command -v bundle | GREP_OPTIONS= \grep $rvm_path/bin/bundle >/dev/null
# }
# then
# printf "%b" "The rubygem 'bundler' is not installed. Installing it now.\n"
# gem install bundler
# fi
# if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
# then
# bundle install | GREP_OPTIONS= \grep -vE '^Using|Your bundle is complete'
# fi

View File

@@ -1,29 +1,12 @@
---
language: ruby
bundler_args: --without development assets
env: RAILS_ENV=travis
env: GROWSTUFF_SITE_NAME="Growstuff (travis)" RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
bundler_args: --without development production staging
rvm:
- 1.9.3
- 2.1.5
before_script:
- psql -c 'create database growstuff_test;' -U postgres
script:
- bundle exec rake db:migrate --trace
- bundle exec rspec spec/
# after_success:
# - if [[ "$TRAVIS_BRANCH" == "dev" ]]; then git remote add heroku git@heroku.com:growstuff-dev.git
# - wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh
# - echo "Host heroku.com" >> ~/.ssh/config
# - echo " StrictHostKeyChecking no" >> ~/.ssh/config
# - echo " CheckHostIP no" >> ~/.ssh/config
# - echo " UserKnownHostsFile=/dev/null" >> ~/.ssh/config
# - heroku keys:clear
# - yes | heroku keys:add
# - yes | git push heroku dev:master
# - heroku run rake db:migrate
# - heroku restart
# - fi
# env:
# global:
# secure: "QFQbCdNGyjeatp/H0j0y0oGiue45fpG2w6eA2QAbq2RmvhabgXbd5WIobN90\ndrae3S7TRxPDpMpus90icykX6EzOTLXCEvaC4rh9pCcRktj3SZqq5b9rVTvs\n1MvlS6HhtsVqsrKjQUb0WmPpnganIzTs0RtGaQspo2joPJO18A4="

View File

@@ -1,35 +1,13 @@
Thanks for contributing to Growstuff! We have different contribution
guidelines depending on whether your change is a small one (a one-line
bugfix or similar) or a larger one.
Thanks for contributing to Growstuff!
## Small changes
When you create a pull request, please include the following:
Send us a pull request! We will get one of our pairs of coders to
review it.
If you are interested in becoming a more regular contributor or working
on larger features, please see the [Growstuff
wiki](http://wiki.growstuff.org/) for more information.
## Larger changes
Growstuff does pair programming (two coders working together) for all
new features and other significant changes. This means that if you
submit a pull request and weren't working in a pair, we're unlikely to
merge it into the project as-is.
If you would like to work on any larger change, we would appreciate it
if you would get in touch with us, preferably via our [mailing
list](http://lists.growstuff.org/mailman/listinfo/discuss), and talk to
us about it first. We'll try and hook you up with a partner so you can
work as a pair, either in person or remotely depending on where you are.
The [Growstuff wiki](http://wiki.growstuff.org/) has lots more
information on our dev process, to get you started if you would like to
join us.
If you submit a larger change without working in a pair, we will treat
your work as an experimental "spike" and get one of our pairs of
programmers to look over it and maybe use what you've done as the basis
for re-implementing it using our processes. **We'd much rather work
with you, so please talk to us first!**
* Mention the issue it solves (eg. #123)
* Your code should follow our [Coding style guide](http://wiki.growstuff.org/index.php/Coding_style_guide)
* Make sure you have automated tests for your work, where possible.
* Add your name (and that of your pair partner, if any) to [CONTRIBUTORS.md](CONTRIBUTORS.md).
If you would like to discuss your work before submitting a pull request,
please join any of our [Discussion
forums](http://wiki.growstuff.org/index.php/Discussion_forums), where
our dev team will be happy to help you.

View File

@@ -1,5 +1,5 @@
This is a list of contributors to Growstuff's codebase. We maintain
this list because we work in pairs, but Github only knows about the
this list because we often work in pairs, but Github only knows about the
person who actually does the commits. This gives credit to both members
of the pair.
@@ -11,10 +11,11 @@ submit the change with your pull request.
- Alex Bayley / [Skud](https://github.com/Skud)
- Cesy / [cesy](https://github.com/cesy)
- Miles Gould / [pozorvlak](https://github.com/pozorvlak)
- Joseph Caudle / [jcaudle](https://github.com/jcaudle)
- Taylor Griffin / [tygriffin](https://github.com/tygriffin)
## Contributors
- Joseph Caudle / [jcaudle](https://github.com/jcaudle)
- Ricky Amianym / [amianym](https://github.com/amianym)
- Juliet Kemp / [julietk](https://github.com/julietk)
- Federico Mena Quintero / [federicomenaquintero](https://github.com/federicomenaquintero)
@@ -38,3 +39,17 @@ submit the change with your pull request.
- Yaw Boakye / [yawboakye](https://github.com/yawboakye)
- Ryan Clark / [IAMRYO](https://github.com/IAMRYO)
- Marty Hines / [martyhines](https://github.com/martyhines)
- Amelia Greenhall / [ameliagreenhall](https://github.com/ameliagreenhall)
- Barb Natali / [barbnatali](https://github.com/barbnatali)
- Marlena Compton / [Marlena](https://github.com/marlena)
- Elizabeth A. Kari / [catfriend](https://github.com/catfriend)
- Cheri Allen / [cherimarie](https://github.com/cherimarie)
- Maki Sugita / [macckii](https:://github.com/macckii)
- Shiho Takagi / [oshiho3](https://github.com/oshiho3)
- Emma Winston / [emmawinston](https://github.com/emmawinston)
- Kevin Rio / [krio](https://github.com/krio)
- Yoong Kang Lim / [yoongkang](https://github.com/yoongkang)
- Kevin Yang / [kevieyang](https://github.com/kevieyang)
- Justin Hamman / [juzham](https://github.com/juzham)
- Rocky Jaiswal / [rocky-jaiswal](https://github.com/rocky-jaiswal)

139
Gemfile
View File

@@ -1,75 +1,52 @@
source 'https://rubygems.org'
ruby '2.1.5'
gem 'rails', '4.1.9'
gem 'bundler', '>=1.1.5'
gem 'rails', '3.2.13'
gem 'rack', '~>1.4.5'
gem 'json', '~>1.7.7'
gem 'sass-rails', '~> 4.0.4'
gem 'coffee-rails', '~> 4.1.0'
gem 'haml'
gem 'unicorn' # http server
gem 'cancan' # for checking member privileges
# Another CSS preprocessor, used for Bootstrap overrides
gem 'less', '~>2.5.0'
gem 'less-rails', '~> 2.5.0'
# CSS framework
gem 'less-rails-bootstrap', '~> 3.2.0'
gem 'gibbon' # for Mailchimp newsletter subscriptions
gem 'uglifier', '~> 2.5.3' # JavaScript compressor
gem 'jquery-rails'
gem 'jquery-ui-rails', '~> 5.0.2'
gem 'js-routes' # provides access to Rails routes in Javascript
gem 'flickraw'
gem 'leaflet-rails'
gem 'leaflet-markercluster-rails'
gem 'unicorn' # http server
gem 'pg'
gem 'figaro' # for handling config via ENV variables
gem 'cancancan', '~> 1.9' # for checking member privileges
gem 'gibbon' # for Mailchimp newsletter subscriptions
gem 'csv_shaper' # CSV export
# vendored activemerchant for testing- needed for bogus paypal
# gateway monkeypatch
gem 'activemerchant', '1.33.0',
:path => 'vendor/gems/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'
:path => 'vendor/gems/active_utils-1.0.5'
group :production, :staging do
gem 'pg'
gem 'newrelic_rpm'
gem 'dalli'
gem 'memcachier'
end
# Gems used only for assets and not required
# in production environments by default.
group :assets do
# CSS preprocessor, used for app/assets/stylesheets/application.css
gem 'sass-rails', '~> 3.2.3'
# CoffeeScript is a Python-like language that compiles to JavaScript
gem 'coffee-rails', '~> 3.2.1'
# less-rails depends on a JavaScript engine; we use therubyracer.
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# long term, we'll probably want node.js for performance, but this will do
# for now as it's easier for new people to install
gem 'therubyracer', '~> 0.10.2', :platforms => :ruby
# Another CSS preprocessor, used for Bootstrap overrides
gem "less-rails"
# CSS framework
gem "twitter-bootstrap-rails",
:git => 'https://github.com/seyhunak/twitter-bootstrap-rails.git',
:ref => '2c7c52'
gem 'uglifier', '>= 1.0.3' # JavaScript compressor
gem 'compass-rails', '~> 1.0.3' # Yet Another CSS framework
end
gem 'jquery-rails'
gem 'flickraw'
# To use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'
# To use Jbuilder templates for JSON
# gem 'jbuilder'
# Use unicorn as the app server
# gem 'unicorn'
# To use debugger
group :development do
# Installation of the debugger gem fails on Travis CI,
# so we don't use it in the test environment
gem 'debugger'
end
# less-rails depends on a JavaScript engine; we use therubyracer.
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# long term, we'll probably want node.js for performance, but this will do
# for now as it's easier for new people to install
gem 'therubyracer', '~> 0.12', :platforms => :ruby
# libv8 is needed by therubyracer and is a bit finicky
gem 'libv8', '3.16.14.7'
# Markdown formatting for updates etc
gem 'bluecloth'
@@ -78,16 +55,18 @@ gem 'bluecloth'
gem 'will_paginate', '~> 3.0'
# user signup/login/etc
gem 'devise'
gem 'devise', '~> 3.4.1'
# nicely formatted URLs
gem 'friendly_id'
gem 'friendly_id', '~> 5.0.4'
# gravatars
gem 'gravatar-ultimate'
# For geolocation
gem 'geocoder'
gem 'geocoder',
:git => 'https://github.com/alexreisner/geocoder.git',
:ref => '104d46'
# For easy calendar selection
gem 'bootstrap-datepicker-rails'
@@ -95,18 +74,38 @@ gem 'bootstrap-datepicker-rails'
# For connecting to other services (eg Twitter)
gem 'omniauth'
gem 'omniauth-twitter'
gem 'omniauth-flickr'
gem 'omniauth-flickr', '>= 0.0.15'
gem 'rake', '>= 10.0.0'
group :development, :test do
gem 'sqlite3' # database engine
group :production, :staging do
gem 'newrelic_rpm'
gem 'dalli'
gem 'memcachier'
gem 'rails_12factor' # supresses heroku plugin injection
end
group :development, :test, :travis do
gem 'haml-rails' # HTML templating language
gem 'rspec-rails', '~> 2.12.1' # unit testing framework
gem 'webrat' # provides HTML matchers for view tests
gem 'factory_girl_rails', '~> 4.0' # for creating test data
gem 'coveralls', require: false # coverage analysis
group :development do
# A debugger and irb alternative. Pry doesn't play nice
# with unicorn, so start a Webrick server when debugging
# with Pry
gem 'pry'
gem 'better_errors'
gem 'binding_of_caller'
gem 'letter_opener'
end
group :development, :test do
gem 'haml-rails' # HTML templating language
gem 'rspec-rails', '~> 3.1.0' # unit testing framework
gem 'rspec-activemodel-mocks'
gem 'byebug' # debugging
gem 'database_cleaner', '~> 1.3.0'
gem 'webrat' # provides HTML matchers for view tests
gem 'factory_girl_rails', '~> 4.5.0' # for creating test data
gem 'coveralls', require: false # coverage analysis
gem 'capybara' # integration tests
gem 'capybara-email' # integration tests for email
gem 'poltergeist', '~> 1.5.1' # for headless JS testing
gem 'i18n-tasks' # adds tests for finding missing and unused translations
end

View File

@@ -1,13 +1,9 @@
GIT
remote: https://github.com/seyhunak/twitter-bootstrap-rails.git
revision: 2c7c527c354d9068ce49346d4fd8389328d32ce6
ref: 2c7c52
remote: https://github.com/alexreisner/geocoder.git
revision: 104d466ba7097b7dce5ba19f8e4091b7f69ccdf6
ref: 104d46
specs:
twitter-bootstrap-rails (2.2.7)
actionpack (>= 3.1)
execjs
rails (>= 3.1)
railties (>= 3.1)
geocoder (1.1.8)
PATH
remote: vendor/gems/active_utils-1.0.5
@@ -24,209 +20,296 @@ PATH
GEM
remote: https://rubygems.org/
specs:
actionmailer (3.2.13)
actionpack (= 3.2.13)
mail (~> 2.5.3)
actionpack (3.2.13)
activemodel (= 3.2.13)
activesupport (= 3.2.13)
builder (~> 3.0.0)
actionmailer (4.1.9)
actionpack (= 4.1.9)
actionview (= 4.1.9)
mail (~> 2.5, >= 2.5.4)
actionpack (4.1.9)
actionview (= 4.1.9)
activesupport (= 4.1.9)
rack (~> 1.5.2)
rack-test (~> 0.6.2)
actionview (4.1.9)
activesupport (= 4.1.9)
builder (~> 3.1)
erubis (~> 2.7.0)
journey (~> 1.0.4)
rack (~> 1.4.5)
rack-cache (~> 1.2)
rack-test (~> 0.6.1)
sprockets (~> 2.2.1)
activemodel (3.2.13)
activesupport (= 3.2.13)
builder (~> 3.0.0)
activerecord (3.2.13)
activemodel (= 3.2.13)
activesupport (= 3.2.13)
arel (~> 3.0.2)
tzinfo (~> 0.3.29)
activeresource (3.2.13)
activemodel (= 3.2.13)
activesupport (= 3.2.13)
activesupport (3.2.13)
i18n (= 0.6.1)
multi_json (~> 1.0)
arel (3.0.2)
bcrypt-ruby (3.1.1)
activemodel (4.1.9)
activesupport (= 4.1.9)
builder (~> 3.1)
activerecord (4.1.9)
activemodel (= 4.1.9)
activesupport (= 4.1.9)
arel (~> 5.0.0)
activesupport (4.1.9)
i18n (~> 0.6, >= 0.6.9)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
thread_safe (~> 0.1)
tzinfo (~> 1.1)
addressable (2.3.6)
arel (5.0.1.20140414130214)
bcrypt (3.1.9)
better_errors (2.0.0)
coderay (>= 1.0.0)
erubis (>= 2.6.6)
rack (>= 0.9.0)
binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1)
bluecloth (2.2.0)
bootstrap-datepicker-rails (1.1.1.3)
bootstrap-datepicker-rails (1.3.0.2)
railties (>= 3.0)
builder (3.0.4)
cancan (1.6.10)
chunky_png (1.2.8)
coffee-rails (3.2.2)
builder (3.2.2)
byebug (3.5.1)
columnize (~> 0.8)
debugger-linecache (~> 1.2)
slop (~> 3.6)
cancancan (1.9.2)
capybara (2.4.4)
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
xpath (~> 2.0)
capybara-email (2.4.0)
capybara (~> 2.4)
mail
cliver (0.3.2)
coderay (1.1.0)
coffee-rails (4.1.0)
coffee-script (>= 2.2.0)
railties (~> 3.2.0)
coffee-script (2.2.0)
railties (>= 4.0.0, < 5.0)
coffee-script (2.3.0)
coffee-script-source
execjs
coffee-script-source (1.6.3)
colorize (0.5.8)
columnize (0.3.6)
commonjs (0.2.6)
compass (0.12.2)
chunky_png (~> 1.2)
fssm (>= 0.2.7)
sass (~> 3.1)
compass-rails (1.0.3)
compass (>= 0.12.2, < 0.14)
coveralls (0.6.7)
colorize
coffee-script-source (1.8.0)
columnize (0.9.0)
commonjs (0.2.7)
coveralls (0.7.1)
multi_json (~> 1.3)
rest-client
simplecov (>= 0.7)
term-ansicolor
thor
dalli (2.6.4)
debugger (1.6.1)
columnize (>= 0.3.1)
debugger-linecache (~> 1.2.0)
debugger-ruby_core_source (~> 1.2.3)
csv_shaper (1.1.1)
activesupport (>= 3.0.0)
dalli (2.7.2)
database_cleaner (1.3.0)
debug_inspector (0.0.2)
debugger-linecache (1.2.0)
debugger-ruby_core_source (1.2.3)
devise (3.0.0)
bcrypt-ruby (~> 3.0)
devise (3.4.1)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 3.2.6, < 5)
responders
thread_safe (~> 0.1)
warden (~> 1.2.3)
diff-lcs (1.1.3)
diff-lcs (1.2.5)
docile (1.1.5)
easy_translate (0.5.0)
json
thread
thread_safe
erubis (2.7.0)
execjs (1.4.0)
multi_json (~> 1.0)
factory_girl (4.2.0)
execjs (2.2.2)
factory_girl (4.5.0)
activesupport (>= 3.0.0)
factory_girl_rails (4.2.1)
factory_girl (~> 4.2.0)
factory_girl_rails (4.5.0)
factory_girl (~> 4.5.0)
railties (>= 3.0.0)
flickraw (0.9.6)
friendly_id (4.0.9)
fssm (0.2.10)
geocoder (1.1.8)
gibbon (1.0.0)
figaro (1.0.0)
thor (~> 0.14)
flickraw (0.9.8)
friendly_id (5.0.4)
activerecord (>= 4.0.0)
gibbon (1.1.4)
httparty
multi_json (>= 1.3.4)
gravatar-ultimate (1.0.3)
haml (4.0.3)
gravatar-ultimate (2.0.0)
activesupport (>= 2.3.14)
rack
haml (4.1.0.beta.1)
tilt
haml-rails (0.4)
actionpack (>= 3.1, < 4.1)
activesupport (>= 3.1, < 4.1)
haml (>= 3.1, < 4.1)
railties (>= 3.1, < 4.1)
hashie (2.0.5)
haml-rails (0.6.0)
actionpack (>= 4.0.1)
activesupport (>= 4.0.1)
haml (>= 3.1, < 5.0)
html2haml (>= 1.0.1)
railties (>= 4.0.1)
hashie (3.3.2)
highline (1.6.21)
hike (1.2.3)
httparty (0.11.0)
multi_json (~> 1.0)
hpricot (0.8.6)
html2haml (1.0.1)
erubis (~> 2.7.0)
haml (>= 4.0.0.rc.1)
hpricot (~> 0.8.6)
ruby_parser (~> 3.1.1)
httparty (0.13.3)
json (~> 1.8)
multi_xml (>= 0.5.2)
i18n (0.6.1)
journey (1.0.4)
jquery-rails (3.0.4)
i18n (0.7.0)
i18n-tasks (0.7.8)
activesupport
easy_translate (>= 0.5.0)
erubis
highline
i18n
slop (>= 3.5.0)
term-ansicolor
terminal-table
jquery-rails (3.1.2)
railties (>= 3.0, < 5.0)
thor (>= 0.14, < 2.0)
json (1.7.7)
kgio (2.8.0)
less (2.3.2)
commonjs (~> 0.2.6)
less-rails (2.3.3)
jquery-ui-rails (5.0.3)
railties (>= 3.2.16)
js-routes (0.9.9)
railties (>= 3.2)
sprockets-rails
json (1.8.2)
kgio (2.9.2)
launchy (2.4.3)
addressable (~> 2.3)
leaflet-markercluster-rails (0.7.0)
railties (>= 3.1)
leaflet-rails (0.7.4)
less (2.5.1)
commonjs (~> 0.2.7)
less-rails (2.5.0)
actionpack (>= 3.1)
less (~> 2.3.1)
libv8 (3.3.10.4)
mail (2.5.4)
mime-types (~> 1.16)
treetop (~> 1.4.8)
less (~> 2.5.0)
less-rails-bootstrap (3.2.0)
less-rails (~> 2.5.0)
letter_opener (1.3.0)
launchy (~> 2.2)
libv8 (3.16.14.7)
mail (2.6.3)
mime-types (>= 1.16, < 3)
memcachier (0.0.2)
mime-types (1.23)
mini_portile (0.5.1)
multi_json (1.7.7)
method_source (0.8.2)
mime-types (2.4.3)
mini_portile (0.6.1)
minitest (5.5.1)
multi_json (1.10.1)
multi_xml (0.5.5)
newrelic_rpm (3.6.5.130)
nokogiri (1.6.0)
mini_portile (~> 0.5.0)
netrc (0.10.0)
newrelic_rpm (3.9.8.273)
nokogiri (1.6.5)
mini_portile (~> 0.6.0)
oauth (0.4.7)
omniauth (1.1.4)
hashie (>= 1.2, < 3)
rack
omniauth-flickr (0.0.11)
omniauth (1.2.2)
hashie (>= 1.2, < 4)
rack (~> 1.0)
omniauth-flickr (0.0.15)
omniauth-oauth (~> 1.0)
omniauth-oauth (1.0.1)
oauth
omniauth (~> 1.0)
omniauth-twitter (1.0.0)
omniauth-twitter (1.1.0)
multi_json (~> 1.3)
omniauth-oauth (~> 1.0)
orm_adapter (0.4.0)
pg (0.15.1)
polyglot (0.3.3)
rack (1.4.5)
rack-cache (1.2)
rack (>= 0.4)
rack-ssl (1.3.3)
rack
rack-test (0.6.2)
orm_adapter (0.5.0)
pg (0.17.1)
poltergeist (1.5.1)
capybara (~> 2.1)
cliver (~> 0.3.1)
multi_json (~> 1.0)
websocket-driver (>= 0.2.0)
pry (0.10.1)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
rack (1.5.2)
rack-test (0.6.3)
rack (>= 1.0)
rails (3.2.13)
actionmailer (= 3.2.13)
actionpack (= 3.2.13)
activerecord (= 3.2.13)
activeresource (= 3.2.13)
activesupport (= 3.2.13)
bundler (~> 1.0)
railties (= 3.2.13)
railties (3.2.13)
actionpack (= 3.2.13)
activesupport (= 3.2.13)
rack-ssl (~> 1.3.2)
rails (4.1.9)
actionmailer (= 4.1.9)
actionpack (= 4.1.9)
actionview (= 4.1.9)
activemodel (= 4.1.9)
activerecord (= 4.1.9)
activesupport (= 4.1.9)
bundler (>= 1.3.0, < 2.0)
railties (= 4.1.9)
sprockets-rails (~> 2.0)
rails_12factor (0.0.3)
rails_serve_static_assets
rails_stdout_logging
rails_serve_static_assets (0.0.2)
rails_stdout_logging (0.0.3)
railties (4.1.9)
actionpack (= 4.1.9)
activesupport (= 4.1.9)
rake (>= 0.8.7)
rdoc (~> 3.4)
thor (>= 0.14.6, < 2.0)
raindrops (0.11.0)
rake (10.1.0)
rdoc (3.12.2)
json (~> 1.4)
rest-client (1.6.7)
mime-types (>= 1.16)
rspec-core (2.12.2)
rspec-expectations (2.12.1)
diff-lcs (~> 1.1.3)
rspec-mocks (2.12.2)
rspec-rails (2.12.2)
thor (>= 0.18.1, < 2.0)
raindrops (0.13.0)
rake (10.4.2)
ref (1.0.5)
responders (1.1.2)
railties (>= 3.2, < 4.2)
rest-client (1.7.2)
mime-types (>= 1.16, < 3.0)
netrc (~> 0.7)
rspec-activemodel-mocks (1.0.1)
activemodel (>= 3.0)
activesupport (>= 3.0)
rspec-mocks (>= 2.99, < 4.0)
rspec-core (3.1.7)
rspec-support (~> 3.1.0)
rspec-expectations (3.1.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.1.0)
rspec-mocks (3.1.3)
rspec-support (~> 3.1.0)
rspec-rails (3.1.0)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
rspec-core (~> 2.12.0)
rspec-expectations (~> 2.12.0)
rspec-mocks (~> 2.12.0)
sass (3.2.9)
sass-rails (3.2.6)
railties (~> 3.2.0)
sass (>= 3.1.10)
tilt (~> 1.3)
simplecov (0.7.1)
rspec-core (~> 3.1.0)
rspec-expectations (~> 3.1.0)
rspec-mocks (~> 3.1.0)
rspec-support (~> 3.1.0)
rspec-support (3.1.2)
ruby_parser (3.1.3)
sexp_processor (~> 4.1)
sass (3.2.19)
sass-rails (4.0.5)
railties (>= 4.0.0, < 5.0)
sass (~> 3.2.2)
sprockets (~> 2.8, < 3.0)
sprockets-rails (~> 2.0)
sexp_processor (4.4.4)
simplecov (0.9.1)
docile (~> 1.1.0)
multi_json (~> 1.0)
simplecov-html (~> 0.7.1)
simplecov-html (0.7.1)
sprockets (2.2.2)
simplecov-html (~> 0.8.0)
simplecov-html (0.8.0)
slop (3.6.0)
sprockets (2.12.3)
hike (~> 1.2)
multi_json (~> 1.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
sqlite3 (1.3.7)
therubyracer (0.10.2)
libv8 (~> 3.3.10)
thor (0.18.1)
sprockets-rails (2.2.2)
actionpack (>= 3.0)
activesupport (>= 3.0)
sprockets (>= 2.8, < 4.0)
term-ansicolor (1.3.0)
tins (~> 1.0)
terminal-table (1.4.5)
therubyracer (0.12.1)
libv8 (~> 3.16.14.0)
ref
thor (0.19.1)
thread (0.1.4)
thread_safe (0.3.4)
tilt (1.4.1)
treetop (1.4.14)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.37)
uglifier (2.1.2)
tins (1.3.3)
tzinfo (1.2.2)
thread_safe (~> 0.1)
uglifier (2.5.3)
execjs (>= 0.3.0)
multi_json (~> 1.0, >= 1.0.2)
unicorn (4.6.3)
json (>= 1.8.0)
unicorn (4.8.3)
kgio (~> 2.6)
rack
raindrops (~> 0.7)
@@ -236,7 +319,12 @@ GEM
nokogiri (>= 1.2.0)
rack (>= 1.0)
rack-test (>= 0.5.3)
will_paginate (3.0.4)
websocket-driver (0.5.0)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.0)
will_paginate (3.0.7)
xpath (2.0.0)
nokogiri (~> 1.3)
PLATFORMS
ruby
@@ -244,42 +332,57 @@ PLATFORMS
DEPENDENCIES
active_utils (= 1.0.5)!
activemerchant (= 1.33.0)!
better_errors
binding_of_caller
bluecloth
bootstrap-datepicker-rails
bundler (>= 1.1.5)
cancan
coffee-rails (~> 3.2.1)
compass-rails (~> 1.0.3)
byebug
cancancan (~> 1.9)
capybara
capybara-email
coffee-rails (~> 4.1.0)
coveralls
csv_shaper
dalli
debugger
devise
factory_girl_rails (~> 4.0)
database_cleaner (~> 1.3.0)
devise (~> 3.4.1)
factory_girl_rails (~> 4.5.0)
figaro
flickraw
friendly_id
geocoder
friendly_id (~> 5.0.4)
geocoder!
gibbon
gravatar-ultimate
haml
haml-rails
i18n-tasks
jquery-rails
json (~> 1.7.7)
less-rails
jquery-ui-rails (~> 5.0.2)
js-routes
leaflet-markercluster-rails
leaflet-rails
less (~> 2.5.0)
less-rails (~> 2.5.0)
less-rails-bootstrap (~> 3.2.0)
letter_opener
libv8 (= 3.16.14.7)
memcachier
newrelic_rpm
omniauth
omniauth-flickr
omniauth-flickr (>= 0.0.15)
omniauth-twitter
pg
rack (~> 1.4.5)
rails (= 3.2.13)
poltergeist (~> 1.5.1)
pry
rails (= 4.1.9)
rails_12factor
rake (>= 10.0.0)
rspec-rails (~> 2.12.1)
sass-rails (~> 3.2.3)
sqlite3
therubyracer (~> 0.10.2)
twitter-bootstrap-rails!
uglifier (>= 1.0.3)
rspec-activemodel-mocks
rspec-rails (~> 3.1.0)
sass-rails (~> 4.0.4)
therubyracer (~> 0.12)
uglifier (~> 2.5.3)
unicorn
webrat
will_paginate (~> 3.0)

View File

@@ -5,9 +5,56 @@
Welcome to the Growstuff project.
Growstuff is an open source/open data project to create a website for food gardeners.
Growstuff is an open source/open data project to create a website for
food gardeners. We crowdsource information on what our members are
growing and harvesting, aggregate it, and make it available as open data
via our API.
You can find most of our documentation at: http://wiki.growstuff.org/
Growstuff was founded in 2012 and has been built by dozens of
[contributors](CONTRIBUTORS.md). We are an inclusive, welcoming project, and
encourage participation from people of all backgrounds and skill levels.
Our development uses Extreme Programming practices, which means we pair on all our work. Feel free to fork our code and explore, but if you would like to contribute back to us,
please read http://wiki.growstuff.org/index.php/Development_process_overview before sending us a pull request.
## Important links
* [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)
## For coders
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).
* 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.
* You may also be interested in our [API](http://wiki.growstuff.org/index.php/API).
## For designers, writers, researchers, data wranglers, and other contributors
There are heaps of ways to get involved and contribute no matter what
your skills and interests.
You might like to check out:
* The [Get Involved](http://wiki.growstuff.org/index.php/Get_involved)
page on our wiki, which has lots of detail for different areas
* [Growstuff Talk](http://talk.growstuff.org/) especially the [Idea category](http://talk.growstuff.org/c/idea)
Here on Github, you might find these useful:
* [needs: design](https://github.com/Growstuff/growstuff/labels/needs:%20design) - tasks requiring high-level design
* [needs: visual design](https://github.com/Growstuff/growstuff/labels/needs:%20visual design) - tasks requiring visual/graphical design
* [needs: documentation](https://github.com/Growstuff/growstuff/labels/needs:%20documentation)
* [needs: data](https://github.com/Growstuff/growstuff/labels/needs:%20data) - tasks requiring data entry, data design, data import, or similar
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).
## Contact
For more information about this project, contact [info@growstuff.org](mailto:info@growstuff.org).
You can also contact us on [Twitter](http://twitter.com/growstufforg/) or
[Facebook](https://www.facebook.com/pages/Growstuff/1531133417099494).

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -0,0 +1,38 @@
# Displays datepicker to finished at date
# when marking a planting finished using a
# button. The button must have class 'append-date'.
jQuery ->
el = $('.append-date')
el.datepicker({'format': 'yyyy-mm-dd'})
href = el.attr('href')
originalText = el.text()
el.click (e) ->
e.stopPropagation()
e.preventDefault()
$(this).text('Confirm without date')
$(this).bind('click.confirm', (e) ->
link = $("<a href='#{href}' data-method='put'></a>")
$('body').append(link)
$(link).click()
)
$(this).blur (e) ->
$(this).text(originalText)
$(this).unbind('click.confirm')
el.one 'changeDate', ->
date = $(this).datepicker('getDate')
url = "#{href}&planting[finished_at]=#{date}"
link = $("<a href='#{url}' data-method='put'></a>")
$('body').append(link)
$(link).click()

View File

@@ -10,8 +10,13 @@
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
// GO AFTER THE REQUIRES BELOW.
//
//= require leaflet
//= require leaflet.markercluster
//= require js-routes
//= require jquery
//= require jquery_ujs
//= require jquery-ui/autocomplete
//= require twitter/bootstrap
//= require_tree .
//= require bootstrap-datepicker

View File

@@ -0,0 +1,37 @@
# Uses JQuery's autocomplete to make a suggestion in lieu of a
# preposterously long select dropdown. To implement add code to
# the view like this:
#
# = auto_suggest @resource, :auto_suggest_source
#
# You must also add a search method to the resource's controller.
jQuery ->
if el = $( '.auto-suggest' )
id = $( '.auto-suggest-id' )
el.autocomplete
minLength: 1,
source: el.attr( 'data-source-url' ),
focus: ( event, ui ) ->
el.val( ui.item.name )
id.val( ui.item.id )
false
select: ( event, ui ) ->
el.val( ui.item.name )
id.val( ui.item.id )
false
response: ( event, ui ) ->
id.val( "" )
for item in ui.content
if item.name == el.val()
id.val( item.id )
if el.data( 'uiAutocomplete' )
el.data( 'uiAutocomplete' )._renderItem = ( ul, item ) ->
$( '<li></li>' )
.data( 'item.autocomplete', item )
.append( "<a>#{item.name}</a>" )
.appendTo( ul )

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -0,0 +1,49 @@
if (document.getElementById("cropmap") !== null) {
mapbox_map_id = "<%= Rails.env == 'test' ? 0 : Growstuff::Application.config.mapbox_map_id %>";
mapbox_base_url = "https://c.tiles.mapbox.com/v3/" + mapbox_map_id + "/{z}/{x}/{y}.png";
L.Icon.Default.imagePath = '/assets'
cropmap = L.map('cropmap').setView([0.0, -0.0], 2);
showCropMap(cropmap);
}
function showCropMap(cropmap) {
L.tileLayer(mapbox_base_url, {
attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors under <a href="http://www.openstreetmap.org/copyright">ODbL</a> | Map imagery &copy; <a href="http://mapbox.com">Mapbox</a>',
maxZoom: 18
}).addTo(cropmap);
markers = new L.MarkerClusterGroup({showCoverageOnHover: false, maxClusterRadius: 20 });
things_to_map = location.pathname + '.json';
$.getJSON(things_to_map, function(crop) {
$.each(crop.plantings, function(i, planting) {
owner = planting.owner;
if (owner.latitude && owner.longitude) {
marker = new L.Marker(new L.LatLng(owner.latitude, owner.longitude));
planting_url = "/plantings/" + planting.id;
planting_link = "<a href='" + planting_url + "'>" + owner.login_name + "'s " + crop.name + "</a>";
where = "<p><i>" + owner.location + "</i></p>";
details = "<p>";
if (planting.quantity) {
details = details + "Quantity: " + planting.quantity + "<br/>";
}
if (planting.planted_from) {
details = details + "Planted from: " + planting.planted_from + "<br/>";
}
if (planting.sunniness) {
details = details + "Planted in: " + planting.sunniness+ "<br/>";
}
details = details + "</p>";
marker.bindPopup(planting_link + where + details).openPopup();
markers.addLayer(marker);
}
});
});
cropmap.addLayer(markers);
}

View File

@@ -0,0 +1,19 @@
# Clears the finished at date field when
# a planting is marked unfinished, and
# repopulates the field with a cached value
# marking unfinished is undone.
jQuery ->
previousValue = ''
$('#planting_finished').on('click', ->
finished = $('#planting_finished_at')
if @checked
if previousValue.length
date = previousValue
finished.val(date)
else
finished.trigger('focus')
else
previousValue = finished.val()
finished.val('')
)

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -0,0 +1,28 @@
if (document.getElementById("membermap") !== null) {
mapbox_map_id = "<%= Rails.env == 'test' ? 0 : Growstuff::Application.config.mapbox_map_id %>";
mapbox_base_url = "https://c.tiles.mapbox.com/v3/" + mapbox_map_id + "/{z}/{x}/{y}.png";
L.Icon.Default.imagePath = '/assets'
$.getJSON(location.pathname + '.json', function(member) {
if (member.latitude && member.longitude) {
membermap = L.map('membermap').setView([member.latitude, member.longitude], 4);
L.tileLayer(mapbox_base_url, {
attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors under <a href="http://www.openstreetmap.org/copyright">ODbL</a> | Map imagery &copy; <a href="http://mapbox.com">Mapbox</a>',
maxZoom: 18
}).addTo(membermap);
marker = new L.Marker(new L.LatLng(member.latitude, member.longitude));
member_url = "/members/" + member.slug;
member_link = "<a href='" + member_url + "'>" + member.login_name + "</a>";
where = "<p><i>" + member.location + "</i></p>";
marker.bindPopup(member_link + where).openPopup();
marker.addTo(membermap);
}
});
}

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -0,0 +1,50 @@
if (document.getElementById("placesmap") !== null) {
places_base_path = "/places";
mapbox_map_id = "<%= Rails.env == 'test' ? 0 : Growstuff::Application.config.mapbox_map_id %>";
mapbox_base_url = "https://c.tiles.mapbox.com/v3/" + mapbox_map_id + "/{z}/{x}/{y}.png";
nominatim_base_url = 'http://nominatim.openstreetmap.org/search/';
nominatim_user_agent_email = "<%= Rails.env == 'test' ? 0 : Growstuff::Application.config.user_agent_email %>";
L.Icon.Default.imagePath = '/assets'
if (location.pathname === places_base_path) { //places index page
placesmap = L.map('placesmap').setView([0.0, -0.0], 2);
showMap(placesmap);
} else { // specific place page
place = location.pathname.replace(places_base_path + "/", '');
nominatim_query_url = nominatim_base_url + place;
nominatim_options = {
format: "json",
callback: "placeholder",
limit: 1,
email: nominatim_user_agent_email
};
$.getJSON(nominatim_query_url, nominatim_options, function(data) {
placesmap = L.map('placesmap').setView([data[0].lat, data[0].lon], 5);
showMap(placesmap);
})
}
}
function showMap(placesmap) {
L.tileLayer(mapbox_base_url, {
attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors under <a href="http://www.openstreetmap.org/copyright">ODbL</a> | Map imagery &copy; <a href="http://mapbox.com">Mapbox</a>',
maxZoom: 18
}).addTo(placesmap);
markers = new L.MarkerClusterGroup({showCoverageOnHover: false, maxClusterRadius: 20 });
things_to_map = location.pathname + '.json';
$.getJSON(things_to_map, function(members) {
$.each(members, function(i, m) {
if (m.latitude && m.longitude) {
marker = new L.Marker(new L.LatLng(m.latitude, m.longitude));
link = "<p><a href='/members/" + m.slug + "'>" + m.login_name + "</a></p>";
where = "<p><i>" + m.location + "</i></p>";
marker.bindPopup(link + where).openPopup();
markers.addLayer(marker);
}
});
});
placesmap.addLayer(markers);
}

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -1,3 +0,0 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@@ -3,6 +3,12 @@
* and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
* the top of the compiled file, but it's generally better to create a new file per style scope.
*= require_self
*= require_tree .
*= require jquery-ui/autocomplete
*= require bootstrap-datepicker
*= require leaflet
*= require leaflet.markercluster
*= require leaflet.markercluster.default
*= require custom_bootstrap/custom_bootstrap
*= require overrides.css
*= require_tree .
*/

View File

@@ -1,158 +0,0 @@
@import "twitter/bootstrap/bootstrap";
@import "twitter/bootstrap/responsive";
// Set the correct sprite paths
@iconSpritePath: asset-path("twitter/bootstrap/glyphicons-halflings");
@iconWhiteSpritePath: asset-path("twitter/bootstrap/glyphicons-halflings-white");
// Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines)
@fontAwesomeEotPath: asset-url("fontawesome-webfont.eot");
@fontAwesomeEotPath_iefix: asset-url("fontawesome-webfont.eot#iefix");
@fontAwesomeWoffPath: asset-url("fontawesome-webfont.woff");
@fontAwesomeTtfPath: asset-url("fontawesome-webfont.ttf");
@fontAwesomeSvgPath: asset-url("fontawesome-webfont.svg#fontawesomeregular");
// Font Awesome
@import "fontawesome/font-awesome";
// Glyphicons
//@import "twitter/bootstrap/sprites.less";
// Your custom LESS stylesheets goes here
//
// Since bootstrap was imported above you have access to its mixins which
// you may use and inherit here
//
// If you'd like to override bootstrap's own variables, you can do so here as well
// See http://twitter.github.com/bootstrap/customize.html#variables for their names and documentation
//
// Example:
// @linkColor: #ff0000;
// Base colours
@beige: #f3f1ee;
@brown: #413f3b;
@green: #5f8e43;
@blue: #2f4365;
@red: #8e4d43;
@orange: #b2685c;
@yellow: #b2935c;
@bodyBackground: @beige;
@textColor: @brown;
@linkColor: @green;
// Typography (with help from bootswatch.com's "readable" theme)
@import url('//fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic');
@sansFontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif;
@serifFontFamily: Georgia, "Times New Roman", Times, serif;
@monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace;
@baseFontSize: 15px;
@baseFontFamily: @serifFontFamily;
@baseLineHeight: @baseFontSize * 1.5;
@altFontFamily: @sansFontFamily;
@headingsFontFamily: "Lora", Georgia, "Times New Roman", Times, serif;
@headingsFontWeight: bold; // instead of browser default, bold
@headingsColor: inherit; // empty to use BS default, @textColor
// Hero unit
@heroUnitBackground: darken(@bodyBackground, 10%);
// Nav bar
@navbarBackground: @brown;
@navbarBackgroundHighlight: @brown;
@navbarText: @beige;
@navbarLinkColor: darken(@beige, 20%);
@navbarLinkColorHover: @beige;
@navbarLinkColorActive: @beige;
@navbarBrandColor: lighten(@green, 20%);
@dropdownBackground: lighten(@beige, 10%);
@dropdownLinkColor: @brown;
@dropdownLinkColorHover: @brown;
@dropdownLinkBackgroundHover: lighten(@green, 50%);
body {
padding-top: @navbarHeight + 10px;
padding-bottom: @navbarHeight + 10px;
}
ul.inline > li.first {
padding-left: 0px;
}
h2 {
font-size: 150%;
}
h3 {
font-size: 120%;
}
.main {
padding-right: 1em;
}
.sidebar {
margin-left: -1px;
border-left: 1px solid darken(@beige, 10%);
padding-left: 1em;
}
// this is used for eg. crops and members index pages
.six-across:nth-child(6n+1) {
margin-left: 0px
}
.three-across:nth-child(3n+1) {
margin-left: 0px;
clear: both;
}
// let's condense the hero unit a little
.hero-unit {
padding-top: 30px;
padding-bottom: 30px;
}
// info under the main heading on homepage
.hero-unit .info {
padding-top: 15px;
}
// signup widget on homepage
.hero-unit .signup {
background-color: lighten(@green, 40%);
border: 1px solid lighten(@green, 20%);
border-radius: 6px;
padding: 15px;
text-align: center;
line-height: 110%;
}
// stats shown on homepage. eg. "999 members..."
p.stats {
font-weight: bold;
}
.homepage-members {
height: 100px;
}
.homepage-members:nth-child(odd) {
margin-left: 0px;
}
// Overrides applying only to mobile view
@media only screen and (max-width: 767px) {
.sidebar {
margin-left: 0;
border-left: none;
padding-left: 0;
}
}

View File

@@ -0,0 +1,56 @@
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!! AUTOMATICALLY GENERATED FILE. DO NOT MODIFY !!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Core variables and mixins
@import "twitter/bootstrap/variables.less";
@import "custom_bootstrap/variables.less"; // Modify this for custom colors, font-sizes, etc
@import "twitter/bootstrap/mixins.less";
@import "custom_bootstrap/mixins.less"; // Modify this for custom mixins
// Reset and dependencies
@import "twitter/bootstrap/normalize.less";
@import "twitter/bootstrap/print.less";
@import "twitter/bootstrap/glyphicons.less";
// Core CSS
@import "twitter/bootstrap/scaffolding.less";
@import "twitter/bootstrap/type.less";
@import "twitter/bootstrap/code.less";
@import "twitter/bootstrap/grid.less";
@import "twitter/bootstrap/tables.less";
@import "twitter/bootstrap/forms.less";
@import "twitter/bootstrap/buttons.less";
// Components
@import "twitter/bootstrap/component-animations.less";
@import "twitter/bootstrap/dropdowns.less";
@import "twitter/bootstrap/button-groups.less";
@import "twitter/bootstrap/input-groups.less";
@import "twitter/bootstrap/navs.less";
@import "twitter/bootstrap/navbar.less";
@import "twitter/bootstrap/breadcrumbs.less";
@import "twitter/bootstrap/pagination.less";
@import "twitter/bootstrap/pager.less";
@import "twitter/bootstrap/labels.less";
@import "twitter/bootstrap/badges.less";
@import "twitter/bootstrap/jumbotron.less";
@import "twitter/bootstrap/thumbnails.less";
@import "twitter/bootstrap/alerts.less";
@import "twitter/bootstrap/progress-bars.less";
@import "twitter/bootstrap/media.less";
@import "twitter/bootstrap/list-group.less";
@import "twitter/bootstrap/panels.less";
@import "twitter/bootstrap/responsive-embed.less";
@import "twitter/bootstrap/wells.less";
@import "twitter/bootstrap/close.less";
// Components w/ JavaScript
@import "twitter/bootstrap/modals.less";
@import "twitter/bootstrap/tooltip.less";
@import "twitter/bootstrap/popovers.less";
@import "twitter/bootstrap/carousel.less";
// Utility classes
@import "twitter/bootstrap/utilities.less";
@import "twitter/bootstrap/responsive-utilities.less";

View File

@@ -0,0 +1 @@
// Use this file to override Twitter Bootstrap mixins or define own mixins.

View File

@@ -0,0 +1,54 @@
// Use this file to override Twitter Bootstrap variables or define own variables.
// Import original variables so they can be used in overrides
@import "twitter/bootstrap/variables.less";
// Base colours
@beige: #f3f1ee;
@brown: #413f3b;
@green: #5f8e43;
@blue: #2f4365;
@red: #8e4d43;
@orange: #b2685c;
@yellow: #b2935c;
@body-bg: @beige;
@text-color: @brown;
@link-color: @green;
@brand-primary: @green;
@font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif;
@font-family-serif: Georgia, "Times New Roman", Times, serif;
@font-family-mono: Monaco, Menlo, Consolas, "Courier New", monospace;
@font-size-base: 14px;
@font-family-base: @font-family-sans-serif;
@line-height-base: 1.5;
@alt-font-family: @font-family-serif;
@headings-font-family: @font-family-sans-serif;
@headings-font-weight: bold; // instead of browser default, bold
@headings-color: inherit; // empty to use BS default, @textColor
// Hero unit
@jumbotron-bg: darken(@body-bg, 10%);
// Nav bar
@navbar-default-bg: @brown;
@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-brand-color: lighten(@green, 20%);
// Top nav collapse threshold
@grid-float-breakpoint: @screen-md-min;
@dropdown-bg: lighten(@beige, 10%);
@dropdown-link-color: @brown;
@dropdown-link-hover-color: @brown;
@dropdown-link-hover-bg: lighten(@green, 50%);

View File

@@ -0,0 +1,3 @@
.leaflet-popup-content-wrapper, .leaflet-popup-tip {
border: none;
}

View File

@@ -0,0 +1,276 @@
@import "twitter/bootstrap/bootstrap";
@import "custom_bootstrap/variables";
// this padding needs to be done before the responsive stuff is imported
body {
// modifying this for our promotional banner. can be replaced after if
// needed.
// padding-top: @navbar-height + 15px;
padding-top: @navbar-height;
}
//@import "twitter/bootstrap/responsive";
// Set the correct sprite paths
@iconSpritePath: asset-path("twitter/bootstrap/glyphicons-halflings");
@iconWhiteSpritePath: asset-path("twitter/bootstrap/glyphicons-halflings-white");
// Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines)
@fontAwesomeEotPath: asset-url("fontawesome-webfont.eot");
@fontAwesomeEotPath_iefix: asset-url("fontawesome-webfont.eot#iefix");
@fontAwesomeWoffPath: asset-url("fontawesome-webfont.woff");
@fontAwesomeTtfPath: asset-url("fontawesome-webfont.ttf");
@fontAwesomeSvgPath: asset-url("fontawesome-webfont.svg#fontawesomeregular");
// Font Awesome
//@import "fontawesome/font-awesome";
// Glyphicons
//@import "twitter/bootstrap/sprites.less";
.list-inline > li.first {
padding-left: 0px;
}
h2 {
font-size: 150%;
}
/*
#subtitle {
color: lighten(@brown, 30%);
margin-top: 0px;
padding-top: 0px;
padding-left: 1em;
font-style: italic;
font-weight: normal;
}
*/
h3 {
font-size: 120%;
}
.main {
padding-right: 1em;
}
.sidebar {
margin-left: -1px;
border-left: 1px solid darken(@beige, 10%);
padding-left: 1em;
}
// this is used for eg. crops and members index pages
.six-across:nth-child(6n+1) {
margin-left: 0px
}
.three-across:nth-child(3n+1) {
margin-left: 0px;
clear: both;
}
// let's condense the hero unit a little
.jumbotron {
padding-top: 30px;
padding-bottom: 30px;
}
// info under the main heading on homepage
.jumbotron .info {
padding-top: 15px;
}
// signup widget on homepage
.jumbotron .signup {
background-color: lighten(@green, 40%);
border: 1px solid lighten(@green, 20%);
border-radius: 6px;
padding: 15px;
text-align: center;
line-height: 200%;
}
// stats shown on homepage. eg. "999 members..."
p.stats {
font-weight: bold;
}
.homepage-members {
height: 100px;
}
.homepage-members:nth-child(odd) {
margin-left: 0px;
}
#placesmap, #cropmap {
height: 500px;
}
#membermap {
height: 250px;
}
.member-location {
font-size: small;
font-style: italic;
}
.member-location a {
color: @brown;
}
.photo-thumbnail {
position:relative;
padding:0;
img {
width:100%;
}
.text {
display:none;
color:#000;
position:absolute;
bottom:0;
background:rgba(0, 0, 0, 0.8);
width:100%;
margin:0;
}
p {
padding:5px;
margin:0;
color:#fff;
}
&:hover {
.text {
display:block;
}
}
}
.thumbnail {
border: none;
text-align: center;
margin-bottom: 1.5em;
.member-thumbnail {
text-align: left;
img {
height: 85px;
width: 85px;
max-width: 85px
}
}
.crop-thumbnail {
height: 220px;
.scientific-name small, .crop-name a {
display: inline-block;
max-width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
line-height: 1em;
padding-bottom: 2px;
}
.crop-name a {
padding-top: 2px;
}
.scientific-name small {
margin-bottom: -2px;
}
}
}
li.crop-hierarchy {
list-style-type: disc;
}
.navbar-brand {
margin: 0px;
padding: 0px;
}
.navbar-bottom {
margin: 40px 0px 0px 0px !important;
}
footer {
#contact, #about-growstuff, #policies {
text-align: left;
padding-top: 1em;
padding-bottom: 2em;
ul {
list-style-type: none;
list-style-position: outside;
padding-left: 0px;
margin-left: 0px;
}
a {
color: @navbar-default-link-color;
text-decoration: none;
}
a:hover {
color: @navbar-default-link-hover-color;
}
a:active {
color: @navbar-default-link-active-color;
}
}
.navbar-bottom.navbar {
border-radius: 0;
}
}
.crop-image, .member-image {
width: 100%;
height: 100%;
}
// Autosuggest
.ui-autocomplete {
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;
}
// Overrides applying only to mobile view. This must be at the end of the overrides file.
@media only screen and (max-width: 767px) {
.sidebar {
margin-left: 0;
border-left: none;
padding-left: 0;
}
#map {
height: 300px;
}
.navbar .nav > li {
display: block;
}
}

View File

@@ -1,5 +1,7 @@
class AccountTypesController < ApplicationController
before_filter :authenticate_member!
load_and_authorize_resource
# GET /account_types
def index
@account_types = AccountType.all
@@ -34,7 +36,7 @@ class AccountTypesController < ApplicationController
# POST /account_types
def create
@account_type = AccountType.new(params[:account_type])
@account_type = AccountType.new(account_type_params)
respond_to do |format|
if @account_type.save
@@ -50,7 +52,7 @@ class AccountTypesController < ApplicationController
@account_type = AccountType.find(params[:id])
respond_to do |format|
if @account_type.update_attributes(params[:account_type])
if @account_type.update(account_type_params)
format.html { redirect_to @account_type, notice: 'Account type was successfully updated.' }
else
format.html { render action: "edit" }
@@ -64,7 +66,13 @@ class AccountTypesController < ApplicationController
@account_type.destroy
respond_to do |format|
format.html { redirect_to account_types_url }
format.html { redirect_to account_types_url, notice: 'Account type was successfully deleted.' }
end
end
private
def account_type_params
params.require(:account_type).permit(:is_paid, :is_permanent_paid, :name)
end
end

View File

@@ -1,5 +1,7 @@
class AccountsController < ApplicationController
before_filter :authenticate_member!
load_and_authorize_resource
# GET /accounts
def index
@accounts = Account.all
@@ -28,7 +30,7 @@ class AccountsController < ApplicationController
@account = Account.find(params[:id])
respond_to do |format|
if @account.update_attributes(params[:account])
if @account.update(params[:account])
format.html { redirect_to @account, notice: 'Account detail was successfully updated.' }
else
format.html { render action: "edit" }
@@ -36,4 +38,10 @@ class AccountsController < ApplicationController
end
end
private
def account_params
params.require(:account).permit(:account_type_id, :member_id, :paid_until)
end
end

View File

@@ -8,34 +8,10 @@ class Admin::OrdersController < ApplicationController
def search
authorize! :manage, :all
@orders = []
@orders = Order.search({:by => params[:search_by], :for => params[:search_text]})
if params[:search_text]
case params[:search_by]
when "member"
member = Member.find_by_login_name(params[:search_text])
if member
@orders = member.orders
end
when "order_id"
order = Order.find_by_id(params[:search_text])
if order
@orders = [order]
end
when "paypal_token"
order = Order.find_by_paypal_express_token(params[:search_text])
if order
@orders = [order]
end
when "paypal_payer_id"
order = Order.find_by_paypal_express_payer_id(params[:search_text])
if order
@orders = [order]
end
end
if @orders.empty?
flash[:alert] = "Couldn't find order with #{params[:search_by]} = #{params[:search_text]}"
end
if @orders.empty?
flash[:alert] = "Couldn't find order with #{params[:search_by]} = #{params[:search_text]}"
end
respond_to do |format|

View File

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

View File

@@ -4,17 +4,22 @@ class ApplicationController < ActionController::Base
include ApplicationHelper
after_filter :store_location
before_filter :set_locale
def store_location
# store last url - this is needed for post-login redirect to whatever the user last visited.
if (request.fullpath != new_member_session_path && \
!request.xhr?) # don't store ajax calls
session[:previous_url] = request.fullpath
if (request.path != "/members/sign_in" &&
request.path != "/members/sign_up" &&
request.path != "/members/password/new" &&
request.path != "/members/password/edit" &&
request.path != "/members/confirmation" &&
request.path != "/members/sign_out" &&
!request.xhr?)
store_location_for(:member, request.fullpath)
end
end
def after_sign_in_path_for(resource)
session[:previous_url] || root_path
stored_location_for(:member) || root_path
end
# tweak CanCan defaults because we don't have a "current_user" method
@@ -28,5 +33,46 @@ class ApplicationController < ActionController::Base
rescue_from CanCan::AccessDenied do |exception|
redirect_to request.referer || root_url, :alert => exception.message
end
def set_locale
I18n.locale = params[:locale] || extract_locale_from_subdomain || I18n.default_locale
end
def extract_locale_from_subdomain
parsed_locale = request.subdomains.first
I18n.available_locales.map(&:to_s).include?(parsed_locale) ? parsed_locale : nil
end
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) do |member|
member.permit(:login_name, :email, :password, :password_confirmation,
:remember_me, :login,
# terms of service
:tos_agreement,
# profile stuff
:bio, :location, :latitude, :longitude,
# email settings
:show_email, :newsletter, :send_notification_email, :send_planting_reminder
)
end
devise_parameter_sanitizer.for(:account_update) do |member|
member.permit(:login_name, :email, :password, :password_confirmation,
:remember_me, :login,
# terms of service
:tos_agreement,
# profile stuff
:bio, :location, :latitude, :longitude,
# email settings
:show_email, :newsletter, :send_notification_email, :send_planting_reminder,
#update password
:current_password
)
end
end
end

View File

@@ -1,15 +1,7 @@
class AuthenticationsController < ApplicationController
before_filter :authenticate_member!
load_and_authorize_resource
# GET /authentications
def index
@authentications = current_member.authentications if member_signed_in?
respond_to do |format|
format.html # index.html.erb
end
end
# POST /authentications
def create
auth = request.env['omniauth.auth']
@@ -26,12 +18,17 @@ class AuthenticationsController < ApplicationController
name = auth['info']['name']
end
@authentication = current_member.authentications.find_or_create_by_provider_and_uid(
:provider => auth['provider'],
:uid => auth['uid'],
@authentication = current_member.authentications
.create_with(
:name => name,
:token => auth['credentials']['token'],
:secret => auth['credentials']['secret'])
:secret => auth['credentials']['secret']
)
.find_or_create_by(
:provider => auth['provider'],
:uid => auth['uid'],
:name => name)
flash[:notice] = "Authentication successful."
else
flash[:notice] = "Authentication failed."

View File

@@ -1,8 +1,7 @@
class CommentsController < ApplicationController
before_filter :authenticate_member!, :except => [:index, :show]
load_and_authorize_resource
cache_sweeper :comment_sweeper
# GET /comments
# GET /comments.json
def index
@@ -54,11 +53,11 @@ class CommentsController < ApplicationController
# POST /comments.json
def create
params[:comment][:author_id] = current_member.id
@comment = Comment.new(params[:comment])
@comment = Comment.new(comment_params)
respond_to do |format|
if @comment.save
format.html { redirect_to @comment.post, notice: 'Comment was successfully created.' }
format.html { redirect_to @comment.post, notice: "Comment was successfully created." }
format.json { render json: @comment, status: :created, location: @comment }
else
format.html { render action: "new" }
@@ -78,7 +77,7 @@ class CommentsController < ApplicationController
params[:comment].delete("author_id")
respond_to do |format|
if @comment.update_attributes(params[:comment])
if @comment.update(comment_params)
format.html { redirect_to @comment.post, notice: 'Comment was successfully updated.' }
format.json { head :no_content }
else
@@ -100,4 +99,10 @@ class CommentsController < ApplicationController
format.json { head :no_content }
end
end
private
def comment_params
params.require(:comment).permit(:author_id, :body, :post_id)
end
end

View File

@@ -1,26 +1,66 @@
class CropsController < ApplicationController
before_filter :authenticate_member!, :except => [:index, :hierarchy, :search, :show]
load_and_authorize_resource
cache_sweeper :crop_sweeper
skip_authorize_resource :only => [:hierarchy, :search]
# GET /crops
# GET /crops.json
def index
@crops = Crop.includes(:scientific_names, {:plantings => :photos}).paginate(:page => params[:page])
respond_to do |format|
format.html # index.html.haml
format.json { render json: @crops }
format.rss { render :layout => false }
@sort = params[:sort]
if @sort == 'alpha'
# alphabetical order
@crops = Crop.includes(:scientific_names, {:plantings => :photos}).paginate(:page => params[:page])
else
# default to sorting by popularity
@crops = Crop.popular.includes(:scientific_names, {:plantings => :photos}).paginate(:page => params[:page])
end
end
# GET /wrangle
def wrangle
@crops = Crop.recent.paginate(:page => params[:page])
respond_to do |format|
format.html
format.json { render :json => @crops }
format.rss do
@crops = Crop.recent.includes(:scientific_names, :creator)
render :rss => @crops
end
format.csv do
@filename = "Growstuff-Crops-#{Time.zone.now.to_s(:number)}.csv"
@crops = Crop.includes(:scientific_names, :plantings, :seeds, :creator)
render :csv => @crops
end
end
end
# GET /crops/wrangle
def wrangle
@crops = Crop.recent.paginate(:page => params[:page])
@crop_wranglers = Role.crop_wranglers
respond_to do |format|
format.html
end
end
# GET /crops/hierarchy
def hierarchy
@crops = Crop.toplevel
respond_to do |format|
format.html
end
end
# GET /crops/search
def search
@search = params[:search]
@exact_match = Crop.find_by_name(params[:search])
@partial_matches = Crop.search(params[:search])
# exclude exact match from partial match list
@partial_matches = @partial_matches.reject{ |r| @exact_match && r.eql?(@exact_match) }
@fuzzy = Crop.search(params[:term])
respond_to do |format|
format.html
format.json { render :json => @fuzzy }
end
end
@@ -28,10 +68,15 @@ class CropsController < ApplicationController
# GET /crops/1.json
def show
@crop = Crop.includes(:scientific_names, {:plantings => :photos}).find(params[:id])
@posts = @crop.posts.paginate(:page => params[:page])
respond_to do |format|
format.html # show.html.haml
format.json { render json: @crop }
format.json do
render :json => @crop.to_json(:include => {
:plantings => { :include => { :owner => { :only => [:id, :login_name, :location, :latitude, :longitude] }}}
})
end
end
end
@@ -39,7 +84,9 @@ class CropsController < ApplicationController
# GET /crops/new.json
def new
@crop = Crop.new
3.times do
@crop.scientific_names.build
end
respond_to do |format|
format.html # new.html.haml
format.json { render json: @crop }
@@ -55,7 +102,7 @@ class CropsController < ApplicationController
# POST /crops.json
def create
params[:crop][:creator_id] = current_member.id
@crop = Crop.new(params[:crop])
@crop = Crop.new(crop_params)
respond_to do |format|
if @crop.save
@@ -74,7 +121,7 @@ class CropsController < ApplicationController
@crop = Crop.find(params[:id])
respond_to do |format|
if @crop.update_attributes(params[:crop])
if @crop.update(crop_params)
format.html { redirect_to @crop, notice: 'Crop was successfully updated.' }
format.json { head :no_content }
else
@@ -95,4 +142,10 @@ class CropsController < ApplicationController
format.json { head :no_content }
end
end
private
def crop_params
params.require(:crop).permit(:en_wikipedia_url, :name, :parent_id, :creator_id, :scientific_names_attributes)
end
end

View File

@@ -0,0 +1,32 @@
class FollowsController < ApplicationController
# POST /follows
def create
@follow = current_member.follows.build(:followed_id => follow_params[:followed_id])
if @follow.save
flash[:notice] = "Followed #{ @follow.followed.login_name }"
redirect_to :back
else
flash[:error] = "Already following or error while following."
redirect_to :back
end
end
# DELETE /follows/1
def destroy
@follow = current_member.follows.find(follow_params[:id])
unfollowed_name = @follow.followed.login_name
@follow.destroy
flash[:notice] = "Unfollowed #{ unfollowed_name }"
redirect_to root_path
end
private
def follow_params
params.permit(:id, :followed_id, :follower_id, :authenticity_token, :_method)
end
end

View File

@@ -1,8 +1,6 @@
class ForumsController < ApplicationController
load_and_authorize_resource
cache_sweeper :forum_sweeper
# GET /forums
# GET /forums.json
def index
@@ -44,7 +42,7 @@ class ForumsController < ApplicationController
# POST /forums
# POST /forums.json
def create
@forum = Forum.new(params[:forum])
@forum = Forum.new(forum_params)
respond_to do |format|
if @forum.save
@@ -63,7 +61,7 @@ class ForumsController < ApplicationController
@forum = Forum.find(params[:id])
respond_to do |format|
if @forum.update_attributes(params[:forum])
if @forum.update(forum_params)
format.html { redirect_to @forum, notice: 'Forum was successfully updated.' }
format.json { head :no_content }
else
@@ -80,8 +78,14 @@ class ForumsController < ApplicationController
@forum.destroy
respond_to do |format|
format.html { redirect_to forums_url }
format.html { redirect_to forums_url, notice: 'Forum was successfully deleted' }
format.json { head :no_content }
end
end
private
def forum_params
params.require(:forum).permit(:description, :name, :owner_id, :slug)
end
end

View File

@@ -1,7 +1,7 @@
class GardensController < ApplicationController
before_filter :authenticate_member!, :except => [:index, :show]
load_and_authorize_resource
cache_sweeper :garden_sweeper
# GET /gardens
# GET /gardens.json
@@ -49,12 +49,13 @@ class GardensController < ApplicationController
# POST /gardens.json
def create
params[:garden][:owner_id] = current_member.id
@garden = Garden.new(params[:garden])
@garden = Garden.new(garden_params)
respond_to do |format|
if @garden.save
format.html { redirect_to @garden, notice: 'Garden was successfully created.' }
format.json { render json: @garden, status: :created, location: @garden }
expire_fragment("homepage_stats")
else
format.html { render action: "new" }
format.json { render json: @garden.errors, status: :unprocessable_entity }
@@ -68,7 +69,7 @@ class GardensController < ApplicationController
@garden = Garden.find(params[:id])
respond_to do |format|
if @garden.update_attributes(params[:garden])
if @garden.update(garden_params)
format.html { redirect_to @garden, notice: 'Garden was successfully updated.' }
format.json { head :no_content }
else
@@ -83,10 +84,18 @@ class GardensController < ApplicationController
def destroy
@garden = Garden.find(params[:id])
@garden.destroy
expire_fragment("homepage_stats")
respond_to do |format|
format.html { redirect_to @garden.owner, notice: 'Garden was successfully deleted.' }
format.html { redirect_to gardens_by_owner_path(:owner => @garden.owner), notice: 'Garden was successfully deleted.' }
format.json { head :no_content }
end
end
private
def garden_params
params.require(:garden).permit(:name, :slug, :owner_id, :description, :active,
:location, :latitude, :longitude, :area, :area_unit)
end
end

View File

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

View File

@@ -1,15 +1,16 @@
class MembersController < ApplicationController
load_and_authorize_resource
cache_sweeper :member_sweeper
skip_authorize_resource :only => :nearby
after_action :expire_cache_fragments, :only => :create
def index
@members = Member.confirmed.paginate(:page => params[:page])
respond_to do |format|
format.html # index.html.haml
format.json { render :json => @members.to_json(:only => [:id, :login_name, :slug, :bio, :created_at, :location, :latitude, :longitude]) }
end
end
@@ -22,9 +23,10 @@ class MembersController < ApplicationController
# it requires a garden to be passed in @garden.
# The new garden is not persisted unless Garden#save is called.
@garden = Garden.new
respond_to do |format|
format.html # show.html.haml
format.json { render :json => @member.to_json(:only => [:id, :login_name, :bio, :created_at, :slug, :location, :latitude, :longitude]) }
format.rss { render(
:layout => false,
:locals => { :member => @member }
@@ -32,31 +34,20 @@ class MembersController < ApplicationController
end
end
def nearby
if !params[:location].blank?
@location = params[:location]
elsif current_member
@location = current_member.location
else
@location = nil
end
def view_follows
@member = Member.confirmed.find(params[:login_name])
@follows = @member.followed.paginate(:page => params[:page])
end
if !params[:distance].blank?
@distance = params[:distance]
else
@distance = 100
end
def view_followers
@member = Member.confirmed.find(params[:login_name])
@followers = @member.followers.paginate(:page => params[:page])
end
if params[:units] == "mi"
@units = :mi
else
@units = :km
end
private
@nearby_members = @location ? Member.near(@location, @distance, :units => @units) : []
respond_to do |format|
format.html # nearby.html.haml
end
def expire_cache_fragments
expire_fragment("homepage_stats")
end
end

View File

@@ -1,9 +1,11 @@
class NotificationsController < ApplicationController
include NotificationsHelper
before_filter :authenticate_member!
load_and_authorize_resource
# GET /notifications
def index
@notifications = Notification.find_all_by_recipient_id(current_member)
@notifications = Notification.where(recipient_id: current_member)
respond_to do |format|
format.html # index.html.erb
@@ -47,7 +49,7 @@ class NotificationsController < ApplicationController
# POST /notifications
def create
params[:notification][:sender_id] = current_member.id
@notification = Notification.new(params[:notification])
@notification = Notification.new(notification_params)
@recipient = Member.find_by_id(params[:notification][:recipient_id])
respond_to do |format|
@@ -58,4 +60,10 @@ class NotificationsController < ApplicationController
end
end
end
private
def notification_params
params.require(:notification).permit(:sender_id, :recipient_id, :subject, :body, :post_id, :read)
end
end

View File

@@ -1,4 +1,5 @@
class OrderItemsController < ApplicationController
before_filter :authenticate_member!
load_and_authorize_resource
# POST /order_items
@@ -6,7 +7,7 @@ class OrderItemsController < ApplicationController
if params[:order_item][:price]
params[:order_item][:price] = params[:order_item][:price].to_f * 100 # convert to cents
end
@order_item = OrderItem.new(params[:order_item])
@order_item = OrderItem.new(order_item_params)
@order_item.order = current_member.current_order || Order.create(:member_id => current_member.id)
respond_to do |format|
@@ -19,4 +20,10 @@ class OrderItemsController < ApplicationController
end
end
end
private
def order_item_params
params.require(:order_item).permit(:order_id, :price, :product_id, :quantity)
end
end

View File

@@ -1,9 +1,10 @@
class OrdersController < ApplicationController
before_filter :authenticate_member!
load_and_authorize_resource
# GET /orders
def index
@orders = Order.find_all_by_member_id(current_member.id)
@orders = Order.where(member_id: current_member.id)
respond_to do |format|
format.html # index.html.erb
@@ -32,24 +33,28 @@ class OrdersController < ApplicationController
def checkout
@order = Order.find(params[:id])
response = EXPRESS_GATEWAY.setup_purchase(
@order.total,
:items => @order.activemerchant_items,
:currency => Growstuff::Application.config.currency,
:no_shipping => true,
:ip => request.remote_ip,
:return_url => complete_order_url,
:cancel_return_url => shop_url
)
redirect_to EXPRESS_GATEWAY.redirect_url_for(response.token)
respond_to do |format|
if @order.update_attributes(:referral_code => params[:referral_code])
response = EXPRESS_GATEWAY.setup_purchase(
@order.total,
:items => @order.activemerchant_items,
:currency => Growstuff::Application.config.currency,
:no_shipping => true,
:ip => request.remote_ip,
:return_url => complete_order_url,
:cancel_return_url => shop_url
)
format.html { redirect_to EXPRESS_GATEWAY.redirect_url_for(response.token) }
else
format.html { render action: "show" }
end
end
end
def complete
@order = Order.find(params[:id])
@order.save
if (params[:token] && params['PayerID'])
purchase = EXPRESS_GATEWAY.purchase(
@order.total,

View File

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

View File

@@ -1,8 +1,7 @@
class PhotosController < ApplicationController
before_filter :authenticate_member!, :except => [:index, :show]
load_and_authorize_resource
cache_sweeper :photo_sweeper
# GET /photos
# GET /photos.json
def index
@@ -29,7 +28,8 @@ class PhotosController < ApplicationController
# GET /photos/new.json
def new
@photo = Photo.new
@planting_id = params[:planting_id]
@type = params[:type]
@id = params[:id]
page = params[:page] || 1
@@ -59,23 +59,39 @@ class PhotosController < ApplicationController
# POST /photos.json
def create
@photo = Photo.find_by_flickr_photo_id(params[:photo][:flickr_photo_id]) ||
Photo.new(params[:photo])
Photo.new(photo_params)
@photo.owner_id = current_member.id
@photo.set_flickr_metadata
if params[:planting_id]
planting = Planting.find_by_id(params[:planting_id])
if planting
if planting.owner.id == current_member.id
@photo.plantings << planting unless @photo.plantings.include?(planting)
# 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"]
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] = "You must own both the planting and the photo."
flash[:alert] = "Missing id parameter"
end
else
flash[:alert] = "Couldn't find planting to connect to photo."
flash[:alert] = "Cannot attach photos to #{params[:type]}"
end
else
flash[:alert] = "Missing type parameter"
end
respond_to do |format|
if @photo.save
format.html { redirect_to @photo, notice: 'Photo was successfully added.' }
@@ -93,7 +109,7 @@ class PhotosController < ApplicationController
@photo = Photo.find(params[:id])
respond_to do |format|
if @photo.update_attributes(params[:photo])
if @photo.update(photo_params)
format.html { redirect_to @photo, notice: 'Photo was successfully updated.' }
format.json { head :no_content }
else
@@ -114,4 +130,11 @@ class PhotosController < ApplicationController
format.json { head :no_content }
end
end
private
def photo_params
params.require(:photo).permit(:flickr_photo_id, :owner_id, :title, :license_name,
:license_url, :thumbnail_url, :fullsize_url, :link_url)
end
end

View File

@@ -0,0 +1,31 @@
class PlacesController < ApplicationController
skip_authorize_resource
def index
respond_to do |format|
format.html
# json response is whatever we want to map here
format.json { render :json => Member.located.to_json(:only => [:id, :login_name, :slug, :location, :latitude, :longitude]) }
end
end
# GET /places/london
# GET /places/london.json
def show
@place = params[:place] # used for page title
@nearby_members = Member.nearest_to(params[:place])
respond_to do |format|
format.html # show.html.haml
format.json { render :json => @nearby_members.to_json(:only => [:id, :login_name, :slug, :location, :latitude, :longitude]) }
end
end
def search
respond_to do |format|
format.html do
redirect_to place_path(params[:new_place])
end
end
end
end

View File

@@ -0,0 +1,91 @@
class PlantPartsController < ApplicationController
load_and_authorize_resource
# GET /plant_parts
# GET /plant_parts.json
def index
@plant_parts = PlantPart.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @plant_parts }
end
end
# GET /plant_parts/1
# GET /plant_parts/1.json
def show
@plant_part = PlantPart.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @plant_part }
end
end
# GET /plant_parts/new
# GET /plant_parts/new.json
def new
@plant_part = PlantPart.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @plant_part }
end
end
# GET /plant_parts/1/edit
def edit
@plant_part = PlantPart.find(params[:id])
end
# POST /plant_parts
# POST /plant_parts.json
def create
@plant_part = PlantPart.new(plant_part_params)
respond_to do |format|
if @plant_part.save
format.html { redirect_to @plant_part, notice: 'Plant part was successfully created.' }
format.json { render json: @plant_part, status: :created, location: @plant_part }
else
format.html { render action: "new" }
format.json { render json: @plant_part.errors, status: :unprocessable_entity }
end
end
end
# PUT /plant_parts/1
# PUT /plant_parts/1.json
def update
@plant_part = PlantPart.find(params[:id])
respond_to do |format|
if @plant_part.update(plant_part_params)
format.html { redirect_to @plant_part, notice: 'Plant part was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @plant_part.errors, status: :unprocessable_entity }
end
end
end
# DELETE /plant_parts/1
# DELETE /plant_parts/1.json
def destroy
@plant_part = PlantPart.find(params[:id])
@plant_part.destroy
respond_to do |format|
format.html { redirect_to plant_parts_url }
format.json { head :no_content }
end
end
private
def plant_part_params
params.require(:plant_part).permit(:name, :slug)
end
end

View File

@@ -1,29 +1,36 @@
class PlantingsController < ApplicationController
before_filter :authenticate_member!, :except => [:index, :show]
load_and_authorize_resource
cache_sweeper :planting_sweeper
# GET /plantings
# GET /plantings.json
def index
@owner = Member.find_by_slug(params[:owner])
@crop = Crop.find_by_slug(params[:crop])
if @owner
@plantings = @owner.plantings.includes(:owner, :crop, :garden).paginate(:page => params[:page])
elsif @crop
@plantings = @crop.plantings.includes(:owner, :crop, :garden).paginate(:page => params[:page])
else
@plantings = Planting.includes(:owner, :crop, :garden).paginate(:page => params[:page])
end
respond_to do |format|
format.html # index.html.erb
format.html { @plantings = @plantings.paginate(:page => params[:page]) }
format.json { render json: @plantings }
format.rss { render :layout => false } #index.rss.builder
format.csv do
specifics = (@owner ? "#{@owner.name}-" : @crop ? "#{@crop.name}-" : nil)
@filename = "Growstuff-#{specifics}Plantings-#{Time.zone.now.to_s(:number)}.csv"
render :csv => @plantings
end
end
end
# GET /plantings/1
# GET /plantings/1.json
def show
@planting = Planting.includes(:owner, :crop, :garden, :photos).find(params[:id])
@planting = Planting.includes(:owner, :crop, :garden, :photos).friendly.find(params[:id])
respond_to do |format|
format.html # show.html.erb
@@ -58,14 +65,15 @@ class PlantingsController < ApplicationController
# POST /plantings
# POST /plantings.json
def create
params[:planting][:owner_id] = current_member.id
params[:planted_at] = parse_date(params[:planted_at])
@planting = Planting.new(params[:planting])
@planting = Planting.new(planting_params)
@planting.owner = current_member
respond_to do |format|
if @planting.save
format.html { redirect_to @planting, notice: 'Planting was successfully created.' }
format.json { render json: @planting, status: :created, location: @planting }
expire_fragment("homepage_stats")
else
format.html { render action: "new" }
format.json { render json: @planting.errors, status: :unprocessable_entity }
@@ -80,7 +88,7 @@ class PlantingsController < ApplicationController
params[:planted_at] = parse_date(params[:planted_at])
respond_to do |format|
if @planting.update_attributes(params[:planting])
if @planting.update(planting_params)
format.html { redirect_to @planting, notice: 'Planting was successfully updated.' }
format.json { head :no_content }
else
@@ -96,10 +104,19 @@ class PlantingsController < ApplicationController
@planting = Planting.find(params[:id])
@garden = @planting.garden
@planting.destroy
expire_fragment("homepage_stats")
respond_to do |format|
format.html { redirect_to @garden }
format.json { head :no_content }
end
end
private
def planting_params
params.require(:planting).permit(:crop_id, :description, :garden_id, :planted_at,
:quantity, :sunniness, :planted_from, :owner_id, :finished,
:finished_at)
end
end

View File

@@ -1,8 +1,7 @@
class PostsController < ApplicationController
before_filter :authenticate_member!, :except => [:index, :show]
load_and_authorize_resource
cache_sweeper :post_sweeper
# GET /posts
# GET /posts.json
@@ -57,7 +56,7 @@ class PostsController < ApplicationController
# POST /posts.json
def create
params[:post][:author_id] = current_member.id
@post = Post.new(params[:post])
@post = Post.new(post_params)
respond_to do |format|
if @post.save
@@ -76,7 +75,7 @@ class PostsController < ApplicationController
@post = Post.find(params[:id])
respond_to do |format|
if @post.update_attributes(params[:post])
if @post.update(post_params)
format.html { redirect_to @post, notice: 'Post was successfully updated.' }
format.json { head :no_content }
else
@@ -97,4 +96,10 @@ class PostsController < ApplicationController
format.json { head :no_content }
end
end
private
def post_params
params.require(:post).permit(:body, :subject, :author_id, :forum_id)
end
end

View File

@@ -1,5 +1,7 @@
class ProductsController < ApplicationController
before_filter :authenticate_member!
load_and_authorize_resource
# GET /products
def index
@products = Product.all
@@ -34,7 +36,7 @@ class ProductsController < ApplicationController
# POST /products
def create
@product = Product.new(params[:product])
@product = Product.new(product_params)
respond_to do |format|
if @product.save
@@ -50,7 +52,7 @@ class ProductsController < ApplicationController
@product = Product.find(params[:id])
respond_to do |format|
if @product.update_attributes(params[:product])
if @product.update(product_params)
format.html { redirect_to @product, notice: 'Product was successfully updated.' }
else
format.html { render action: "edit" }
@@ -67,4 +69,11 @@ class ProductsController < ApplicationController
format.html { redirect_to products_url }
end
end
private
def product_params
params.require(:product).permit(:description, :min_price, :recommended_price, :name,
:account_type_id, :paid_months)
end
end

View File

@@ -1,7 +1,5 @@
class RegistrationsController < Devise::RegistrationsController
cache_sweeper :member_sweeper
def edit
@twitter_auth = current_member.auth('twitter')
@flickr_auth = current_member.auth('flickr')
@@ -10,26 +8,37 @@ class RegistrationsController < Devise::RegistrationsController
# we need this subclassed method so that Devise doesn't force people to
# change their password every time they want to edit their settings.
# we also check that they give their current password to change their password.
# Code copied from
# https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password
def update
# required for settings form to submit when password is left blank
if params[:member][:password].blank?
params[:member].delete("password")
params[:member].delete("password_confirmation")
params[:member].delete("current_password")
end
@member = Member.find(current_member.id)
if @member.update_attributes(params[:member])
successfully_updated = if needs_password?(@member, params)
@member.update_with_password(devise_parameter_sanitizer.sanitize(:account_update))
else
# remove the virtual current_password attribute
# update_without_password doesn't know how to ignore it
params[:member].delete(:current_password)
@member.update_without_password(devise_parameter_sanitizer.sanitize(:account_update))
end
if successfully_updated
set_flash_message :notice, :updated
# Sign in the member bypassing validation in case his password changed
# Sign in the member bypassing validation in case their password changed
sign_in @member, :bypass => true
redirect_to edit_member_registration_path
else
render "edit"
end
end
end
# check if we need the current password to update fields
def needs_password?(member, params)
params[:member][:password].present? ||
params[:member][:password_confirmation].present?
end

View File

@@ -1,5 +1,7 @@
class RolesController < ApplicationController
before_filter :authenticate_member!
load_and_authorize_resource
# GET /roles
def index
@roles = Role.all
@@ -34,7 +36,7 @@ class RolesController < ApplicationController
# POST /roles
def create
@role = Role.new(params[:role])
@role = Role.new(role_params)
respond_to do |format|
if @role.save
@@ -50,7 +52,7 @@ class RolesController < ApplicationController
@role = Role.find(params[:id])
respond_to do |format|
if @role.update_attributes(params[:role])
if @role.update(role_params)
format.html { redirect_to @role, notice: 'Role was successfully updated.' }
else
format.html { render action: "edit" }
@@ -67,4 +69,10 @@ class RolesController < ApplicationController
format.html { redirect_to roles_url }
end
end
private
def role_params
params.require(:role).permit(:description, :name, :members, :slug)
end
end

View File

@@ -1,8 +1,7 @@
class ScientificNamesController < ApplicationController
before_filter :authenticate_member!, :except => [:index, :show]
load_and_authorize_resource
cache_sweeper :scientific_name_sweeper
# GET /scientific_names
# GET /scientific_names.json
def index
@@ -46,7 +45,7 @@ class ScientificNamesController < ApplicationController
# POST /scientific_names.json
def create
params[:scientific_name][:creator_id] = current_member.id
@scientific_name = ScientificName.new(params[:scientific_name])
@scientific_name = ScientificName.new(scientific_name_params)
respond_to do |format|
if @scientific_name.save
@@ -65,7 +64,7 @@ class ScientificNamesController < ApplicationController
@scientific_name = ScientificName.find(params[:id])
respond_to do |format|
if @scientific_name.update_attributes(params[:scientific_name])
if @scientific_name.update(scientific_name_params)
format.html { redirect_to @scientific_name.crop, notice: 'Scientific name was successfully updated.' }
format.json { head :no_content }
else
@@ -83,8 +82,16 @@ class ScientificNamesController < ApplicationController
@scientific_name.destroy
respond_to do |format|
format.html { redirect_to @crop }
format.html {
redirect_to @crop, notice: 'Scientific name was successfully deleted.'
}
format.json { head :no_content }
end
end
private
def scientific_name_params
params.require(:scientific_name).permit(:crop_id, :scientific_name, :creator_id)
end
end

View File

@@ -1,14 +1,16 @@
class SeedsController < ApplicationController
before_filter :authenticate_member!, :except => [:index, :show]
load_and_authorize_resource
cache_sweeper :seed_sweeper
# GET /seeds
# GET /seeds.json
def index
@owner = Member.find_by_slug(params[:owner])
@crop = Crop.find_by_slug(params[:crop])
if @owner
@seeds = @owner.seeds.includes(:owner, :crop).paginate(:page => params[:page])
elsif @crop
@seeds = @crop.seeds.includes(:owner, :crop).paginate(:page => params[:page])
else
@seeds = Seed.includes(:owner, :crop).paginate(:page => params[:page])
end
@@ -17,6 +19,16 @@ class SeedsController < ApplicationController
format.html # index.html.erb
format.json { render json: @seeds }
format.rss { render :layout => false } #index.rss.builder
format.csv do
if @owner
@filename = "Growstuff-#{@owner}-Seeds-#{Time.zone.now.to_s(:number)}.csv"
@seeds = @owner.seeds.includes(:owner, :crop)
else
@filename = "Growstuff-Seeds-#{Time.zone.now.to_s(:number)}.csv"
@seeds = Seed.includes(:owner, :crop)
end
render :csv => @seeds
end
end
end
@@ -54,7 +66,7 @@ class SeedsController < ApplicationController
# POST /seeds.json
def create
params[:seed][:owner_id] = current_member.id
@seed = Seed.new(params[:seed])
@seed = Seed.new(seed_params)
respond_to do |format|
if @seed.save
@@ -73,7 +85,7 @@ class SeedsController < ApplicationController
@seed = Seed.find(params[:id])
respond_to do |format|
if @seed.update_attributes(params[:seed])
if @seed.update(seed_params)
format.html { redirect_to @seed, notice: 'Seed was successfully updated.' }
format.json { head :no_content }
else
@@ -94,4 +106,11 @@ class SeedsController < ApplicationController
format.json { head :no_content }
end
end
private
def seed_params
params.require(:seed).permit(:owner_id, :crop_id, :description, :quantity, :plant_before,
:tradable_to, :slug)
end
end

View File

@@ -24,5 +24,12 @@ module ApplicationHelper
:target => "_blank"
end
# Produces a cache key for uniquely identifying cached fragments.
def cache_key_for(klass, identifier="all")
count = klass.count
max_updated_at = klass.maximum(:updated_at).try(:utc).try(:to_s, :number)
"#{klass.name.downcase.pluralize}/#{identifier}-#{count}-#{max_updated_at}"
end
end

View File

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

View File

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

View File

@@ -1,2 +0,0 @@
module SeedsHelper
end

View File

@@ -9,4 +9,17 @@ class Notifier < ActionMailer::Base
mail(:to => @notification.recipient.email,
:subject => @notification.subject)
end
def planting_reminder(member)
@member = member
@plantings = @member.plantings.first(5)
@harvests = @member.harvests.first(5)
if @member.send_planting_reminder
mail(:to => @member.email,
:subject => "What have you planted lately?")
end
end
end

View File

@@ -6,6 +6,8 @@ class Ability
# everyone can do these things, even non-logged in
can :read, :all
can :view_follows, Member
can :view_followers, Member
# except these, which don't make sense if you're not logged in
cannot :read, Notification
@@ -40,6 +42,7 @@ class Ability
can :wrangle, Crop
can :manage, Crop
can :manage, ScientificName
can :manage, AlternateName
end
# can create & destroy their own authentications against other sites.
@@ -64,6 +67,10 @@ class Ability
can :update, Planting, :garden => { :owner_id => member.id }
can :destroy, Planting, :garden => { :owner_id => member.id }
can :create, Harvest
can :update, Harvest, :owner_id => member.id
can :destroy, Harvest, :owner_id => member.id
can :create, Photo
can :update, Photo, :owner_id => member.id
can :destroy, Photo, :owner_id => member.id
@@ -86,6 +93,11 @@ class Ability
cannot :update, OrderItem, :order => { :member_id => member.id, :completed_at => nil }
cannot :destroy, OrderItem, :order => { :member_id => member.id, :completed_at => nil }
# following/unfollowing permissions
can :create, Follow do |f|
!member.already_following?(f.followed) && f.followed_id != member.id
end
if member.has_role? :admin
can :read, :all
@@ -97,6 +109,12 @@ class Ability
cannot :destroy, Order
cannot :manage, OrderItem
# can't delete plant parts if they have harvests associated with them
cannot :destroy, PlantPart
can :destroy, PlantPart do |pp|
pp.harvests.empty?
end
end
end

View File

@@ -1,5 +1,4 @@
class Account < ActiveRecord::Base
attr_accessible :account_type_id, :member_id, :paid_until
belongs_to :member
belongs_to :account_type
@@ -9,7 +8,7 @@ class Account < ActiveRecord::Base
before_create do |account|
unless account.account_type
account.account_type = AccountType.find_or_create_by_name(
account.account_type = AccountType.find_or_create_by(name:
Growstuff::Application.config.default_account_type
)
end

View File

@@ -1,5 +1,4 @@
class AccountType < ActiveRecord::Base
attr_accessible :is_paid, :is_permanent_paid, :name
has_many :products
def to_s

View File

@@ -0,0 +1,4 @@
class AlternateName < ActiveRecord::Base
belongs_to :crop
belongs_to :creator, :class_name => 'Member'
end

View File

@@ -1,4 +1,3 @@
class Authentication < ActiveRecord::Base
belongs_to :member
attr_accessible :provider, :uid, :token, :secret, :name
end

View File

@@ -1,10 +1,9 @@
class Comment < ActiveRecord::Base
attr_accessible :author_id, :body, :post_id
belongs_to :author, :class_name => 'Member'
belongs_to :post
default_scope order("created_at DESC")
scope :post_order, reorder("created_at ASC") # for display on post page
default_scope { order("created_at DESC") }
scope :post_order, -> { reorder("created_at ASC") } # for display on post page
after_create do
recipient = self.post.author.id

View File

@@ -1,15 +0,0 @@
class CommentSweeper < ActionController::Caching::Sweeper
observe Comment
def after_create(comment)
expire_fragment('recent_posts')
end
def after_update(comment)
end
def after_destroy(comment)
expire_fragment('recent_posts')
end
end

View File

@@ -1,34 +1,39 @@
class Crop < ActiveRecord::Base
extend FriendlyId
friendly_id :system_name, use: :slugged
attr_accessible :en_wikipedia_url, :system_name, :parent_id, :creator_id
friendly_id :name, use: [:slugged, :finders]
has_many :scientific_names
accepts_nested_attributes_for :scientific_names,
:allow_destroy => true,
:reject_if => :all_blank
has_many :alternate_names
has_many :plantings
has_many :photos, :through => :plantings
has_many :seeds
has_many :harvests
has_many :plant_parts, -> { uniq }, :through => :harvests
belongs_to :creator, :class_name => 'Member'
belongs_to :parent, :class_name => 'Crop'
has_many :varieties, :class_name => 'Crop', :foreign_key => 'parent_id'
has_and_belongs_to_many :posts
before_destroy {|crop| crop.posts.clear}
default_scope order("lower(system_name) asc")
scope :recent, reorder("created_at desc")
scope :randomized, reorder('random()') # ok on sqlite and psql, but not on mysql
default_scope { order("lower(name) asc") }
scope :recent, -> { reorder("created_at desc") }
scope :toplevel, -> { where(:parent_id => nil) }
scope :popular, -> { reorder("plantings_count desc, lower(name) asc") }
scope :randomized, -> { reorder('random()') } # ok on sqlite and psql, but not on mysql
validates :en_wikipedia_url,
:format => {
:with => /^https?:\/\/en\.wikipedia\.org\/wiki/,
:with => /\Ahttps?:\/\/en\.wikipedia\.org\/wiki/,
:message => 'is not a valid English Wikipedia URL'
}
def Crop.random
@crop = Crop.offset(rand(Crop.count)).first
return @crop
end
def to_s
return system_name
return name
end
def default_scientific_name
@@ -76,6 +81,20 @@ class Crop < ActiveRecord::Base
return planted_from
end
# crop.popular_plant_parts
# returns a hash of most harvested plant parts (fruit, seed, etc)
# key: plant part (eg. 'fruit')
# value: count of how many times it's been used by harvests
def popular_plant_parts
popular_plant_parts = Hash.new(0)
harvests.each do |h|
if h.plant_part
popular_plant_parts[h.plant_part] += 1
end
end
return popular_plant_parts
end
def interesting?
min_plantings = 3 # needs this many plantings to be interesting
min_photos = 3 # needs this many photos to be interesting
@@ -97,4 +116,95 @@ class Crop < ActiveRecord::Base
return interesting_crops
end
# Crop.create_from_csv(row)
# used by db/seeds.rb and rake growstuff:import_crops
# CSV fields:
# - name (required)
# - en_wikipedia_url (required)
# - parent (name, optional)
# - scientific name (optional, can be picked up from parent if it has one)
def Crop.create_from_csv(row)
name,en_wikipedia_url,parent,scientific_names,alternate_names = row
cropbot = Member.find_by_login_name('cropbot')
raise "cropbot account not found: run rake db:seed" unless cropbot
crop = Crop.find_or_create_by(name: name)
crop.update_attributes(
:en_wikipedia_url => en_wikipedia_url,
:creator_id => cropbot.id
)
if parent
parent = Crop.find_by_name(parent)
if parent
crop.update_attributes(:parent_id => parent.id)
else
logger.warn("Warning: parent crop #{parent} not found")
end
end
crop.add_scientific_names_from_csv(scientific_names)
crop.add_alternate_names_from_csv(alternate_names)
end
def add_scientific_names_from_csv(scientific_names)
names_to_add = []
if ! scientific_names.blank? # i.e. we actually passed something in, which isn't a given
names_to_add = scientific_names.split(%r{,\s*})
elsif parent && parent.scientific_names.size > 0 # pick up from parent
names_to_add = parent.scientific_names.map{|s| s.scientific_name}
else
logger.warn("Warning: no scientific name (not even on parent crop) for #{self}")
end
if names_to_add.size > 0
cropbot = Member.find_by_login_name('cropbot')
raise "cropbot account not found: run rake db:seed" unless cropbot
names_to_add.each do |n|
if self.scientific_names.exists?(:scientific_name => n)
logger.warn("Warning: skipping duplicate scientific name #{n} for #{self}")
else
self.scientific_names.create(
:scientific_name => n,
:creator_id => cropbot.id
)
end
end
end
end
def add_alternate_names_from_csv(alternate_names)
names_to_add = []
if ! alternate_names.blank? # i.e. we actually passed something in, which isn't a given
cropbot = Member.find_by_login_name('cropbot')
raise "cropbot account not found: run rake db:seed" unless cropbot
names_to_add = alternate_names.split(%r{,\s*})
names_to_add.each do |n|
if self.alternate_names.exists?(:name => n)
logger.warn("Warning: skipping duplicate alternate name #{n} for #{self}")
else
self.alternate_names.create(
:name => n,
:creator_id => cropbot.id
)
end
end
end
end
# Crop.search(string)
# searches for crops whose names match the string given
# just uses SQL LIKE for now, but can be made fancier later
def self.search(query)
where("name ILIKE ?", "%#{query}%")
end
end

View File

@@ -1,19 +0,0 @@
class CropSweeper < ActionController::Caching::Sweeper
observe Crop
def after_create(crop)
expire_fragment('homepage_stats')
expire_fragment('recent_crops')
end
def after_update(crop)
expire_fragment("crop_image_#{crop.id}")
end
def after_destroy(crop)
expire_fragment('homepage_stats')
expire_fragment('recent_crops')
end
end

16
app/models/follow.rb Normal file
View File

@@ -0,0 +1,16 @@
class Follow < ActiveRecord::Base
belongs_to :follower, class_name: "Member"
belongs_to :followed, class_name: "Member"
validates :follower_id, uniqueness: { :scope => :followed_id }
after_create do
Notification.create(
:recipient_id => self.followed_id,
:sender_id => self.follower_id,
:subject => "#{self.follower.login_name} is now following you",
:body => "#{self.follower.login_name} just followed you on #{ENV["GROWSTUFF_SITE_NAME"]}. "
)
end
end

View File

@@ -1,7 +1,7 @@
class Forum < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: :slugged
attr_accessible :description, :name, :owner_id, :slug
friendly_id :name, use: [:slugged, :finders]
has_many :posts
belongs_to :owner, :class_name => "Member"

View File

@@ -1,16 +0,0 @@
class ForumSweeper < ActionController::Caching::Sweeper
observe Forum
def after_create(forum)
expire_fragment('homepage_forums')
end
def after_update(forum)
expire_fragment('homepage_forums')
end
def after_destroy(forum)
expire_fragment('homepage_forums')
end
end

View File

@@ -1,21 +1,53 @@
class Garden < ActiveRecord::Base
include Geocodable
extend FriendlyId
friendly_id :garden_slug, use: :slugged
friendly_id :garden_slug, use: [:slugged, :finders]
attr_accessible :name, :slug, :owner_id, :description
belongs_to :owner, :class_name => 'Member', :foreign_key => 'owner_id'
has_many :plantings, :order => 'created_at DESC', :dependent => :destroy
has_many :plantings, -> { order(created_at: :desc) }, :dependent => :destroy
has_many :crops, :through => :plantings
# before_create :replace_blank_name
# set up geocoding
geocoded_by :location
after_validation :geocode
after_validation :empty_unwanted_geocodes
after_save :mark_inactive_garden_plantings_as_finished
default_scope order("lower(name) asc")
default_scope { order("lower(name) asc") }
scope :active, -> { where(:active => true) }
scope :inactive, -> { where(:active => false) }
validates :name,
:format => {
:with => /\S/
}
validates :area,
:numericality => { :only_integer => false, :greater_than_or_equal_to => 0 },
:allow_nil => true
AREA_UNITS_VALUES = {
"square metres" => "square metre",
"square feet" => "square foot",
"hectares" => "hectare",
"acres" => "acre"
}
validates :area_unit, :inclusion => { :in => AREA_UNITS_VALUES.values,
:message => "%{value} is not a valid area unit" },
:allow_nil => true,
:allow_blank => true
after_validation :cleanup_area
def cleanup_area
if area == 0
self.area = nil
end
if area.blank?
self.area_unit = nil
end
end
def garden_slug
"#{owner.login_name}-#{name}".downcase.gsub(' ', '-')
end
@@ -40,4 +72,15 @@ class Garden < ActiveRecord::Base
name
end
# When you mark a garden as inactive, all the plantings in it should be
# marked as finished. This automates that.
def mark_inactive_garden_plantings_as_finished
if (active == false)
plantings.current.each do |p|
p.finished = true
p.save
end
end
end
end

View File

@@ -1,16 +0,0 @@
class GardenSweeper < ActionController::Caching::Sweeper
observe Garden
def after_create(garden)
expire_fragment('homepage_stats')
expire_fragment('interesting_members') if garden.owner.interesting?
expire_fragment("member_thumbnail_#{garden.owner.id}")
end
def after_destroy(garden)
expire_fragment('homepage_stats')
expire_fragment('interesting_members') if garden.owner.interesting?
expire_fragment("member_thumbnail_#{garden.owner.id}")
end
end

121
app/models/harvest.rb Normal file
View File

@@ -0,0 +1,121 @@
class Harvest < ActiveRecord::Base
include ActionView::Helpers::NumberHelper
extend FriendlyId
friendly_id :harvest_slug, use: [:slugged, :finders]
belongs_to :crop
belongs_to :owner, :class_name => 'Member'
belongs_to :plant_part
has_and_belongs_to_many :photos
before_destroy do |harvest|
photolist = harvest.photos.to_a # save a temp copy of the photo list
harvest.photos.clear # clear relationship b/w harvest and photo
photolist.each do |photo|
photo.destroy_if_unused
end
end
default_scope { order('created_at DESC') }
validates :crop, :presence => {:message => "must be present and exist in our database"}
validates :quantity,
:numericality => { :only_integer => false },
:allow_nil => true
UNITS_VALUES = {
"individual" => "individual",
"bunches" => "bunch",
"sprigs" => "sprig",
"handfuls" => "handful",
"litres" => "litre",
"pints" => "pint",
"quarts" => "quart",
"buckets" => "bucket",
"baskets" => "basket",
"bushels" => "bushel"
}
validates :unit, :inclusion => { :in => UNITS_VALUES.values,
:message => "%{value} is not a valid unit" },
:allow_nil => true,
:allow_blank => true
validates :weight_quantity,
:numericality => { :only_integer => false },
:allow_nil => true
WEIGHT_UNITS_VALUES = {
"kg" => "kg",
"lb" => "lb",
"oz" => "oz"
}
validates :weight_unit, :inclusion => { :in => WEIGHT_UNITS_VALUES.values,
:message => "%{value} is not a valid unit" },
:allow_nil => true,
:allow_blank => true
after_validation :cleanup_quantities
def cleanup_quantities
if quantity == 0
self.quantity = nil
end
if quantity.blank?
self.unit = nil
end
if weight_quantity == 0
self.weight_quantity = nil
end
if weight_quantity.blank?
self.weight_unit = nil
end
end
def harvest_slug
"#{owner.login_name}-#{crop}".downcase.gsub(' ', '-')
end
# stringify as "beet in Skud's backyard" or similar
def to_s
# 50 individual apples, weighing 3lb
# 2 buckets of apricots, weighing 10kg
string = ''
if self.quantity
string += "#{number_to_human(self.quantity.to_s, :strip_insignificant_zeros => true)} "
if self.unit == 'individual'
string += 'individual '
else
if self.quantity == 1
string += "#{self.unit} of "
else
string += "#{self.unit.pluralize} of "
end
end
end
if self.unit != 'individual' # buckets of apricot*s*
string += "#{self.crop.name.pluralize}"
elsif self.quantity == 1
string += "#{self.crop.name}"
else
string += "#{self.crop.name.pluralize}"
end
if self.weight_quantity
string += " weighing #{number_to_human(self.weight_quantity, :strip_insignificant_zeros => true)} #{self.weight_unit}"
end
return string
end
def default_photo
return photos.first
end
end

View File

@@ -1,6 +1,8 @@
class Member < ActiveRecord::Base
include Geocodable
extend FriendlyId
friendly_id :login_name, use: :slugged
friendly_id :login_name, use: [:slugged, :finders]
has_many :posts, :foreign_key => 'author_id'
has_many :comments, :foreign_key => 'author_id'
@@ -10,6 +12,7 @@ class Member < ActiveRecord::Base
has_many :plantings, :foreign_key => 'owner_id'
has_many :seeds, :foreign_key => 'owner_id'
has_many :harvests, :foreign_key => 'owner_id'
has_and_belongs_to_many :roles
@@ -24,11 +27,18 @@ class Member < ActiveRecord::Base
has_many :photos
default_scope order("lower(login_name) asc")
scope :confirmed, where('confirmed_at IS NOT NULL')
scope :located, where("location <> ''")
scope :recently_signed_in, reorder('updated_at DESC')
scope :wants_newsletter, where(:newsletter => true)
default_scope { order("lower(login_name) asc") }
scope :confirmed, -> { where('confirmed_at IS NOT NULL') }
scope :located, -> { where("location <> '' and latitude IS NOT NULL and longitude IS NOT NULL") }
scope :recently_signed_in, -> { reorder('updated_at DESC') }
scope :wants_newsletter, -> { where(:newsletter => true) }
has_many :follows, :class_name => "Follow", :foreign_key => "follower_id"
has_many :followed, :through => :follows
has_many :inverse_follows, :class_name => "Follow", :foreign_key => "followed_id"
has_many :followers, :through => :inverse_follows, :source => :follower
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
@@ -37,11 +47,6 @@ class Member < ActiveRecord::Base
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :lockable, :timeoutable
# Setup accessible (or protected) attributes for your model
attr_accessible :login_name, :email, :password, :password_confirmation,
:remember_me, :login, :tos_agreement, :show_email, :newsletter,
:location, :latitude, :longitude, :send_notification_email, :bio
# set up geocoding
geocoded_by :location
after_validation :geocode
@@ -66,7 +71,7 @@ class Member < ActiveRecord::Base
:message => "name is reserved"
},
:format => {
:with => /^\w+$/,
:with => /\A\w+\z/,
:message => "may only include letters, numbers, or underscores"
},
:uniqueness => {
@@ -79,7 +84,7 @@ class Member < ActiveRecord::Base
# and an account record (for paid accounts etc)
# we use find_or_create to avoid accidentally creating a second one,
# which can happen sometimes especially with FactoryGirl associations
after_create {|member| Account.find_or_create_by_member_id(:member_id => member.id) }
after_create {|member| Account.find_or_create_by(:member_id => member.id) }
after_save :update_newsletter_subscription
@@ -140,8 +145,8 @@ class Member < ActiveRecord::Base
if @flickr.nil?
flickr_auth = auth('flickr')
if flickr_auth
FlickRaw.api_key = ENV['FLICKR_KEY']
FlickRaw.shared_secret = ENV['FLICKR_SECRET']
FlickRaw.api_key = ENV['GROWSTUFF_FLICKR_KEY']
FlickRaw.shared_secret = ENV['GROWSTUFF_FLICKR_SECRET']
@flickr = FlickRaw::Flickr.new
@flickr.access_token = flickr_auth.token
@flickr.access_secret = flickr_auth.secret
@@ -204,13 +209,15 @@ class Member < ActiveRecord::Base
return interesting_members
end
private
def empty_unwanted_geocodes
if self.location.to_s == ''
self.latitude = nil
self.longitude = nil
def Member.nearest_to(place)
nearby_members = []
if place
latitude, longitude = Geocoder.coordinates(place, params: {limit: 1})
if latitude && longitude
nearby_members = Member.located.sort_by { |x| x.distance_from([latitude, longitude]) }
end
end
return nearby_members
end
def update_newsletter_subscription
@@ -227,22 +234,32 @@ class Member < ActiveRecord::Base
end
end
def newsletter_subscribe
def newsletter_subscribe(testing=false)
return true if (Rails.env.test? && !testing)
gb = Gibbon::API.new
res = gb.lists.subscribe({
:id => ENV['MAILCHIMP_NEWSLETTER_ID'],
:id => Gibbon::API.api_key,
:email => { :email => email },
:merge_vars => { :login_name => login_name },
:double_optin => false # they alredy confirmed their email with us
:double_optin => false # they already confirmed their email with us
})
end
def newsletter_unsubscribe
def newsletter_unsubscribe(testing=false)
return true if (Rails.env.test? && !testing)
gb = Gibbon::API.new
res = gb.lists.unsubscribe({
:id => ENV['MAILCHIMP_NEWSLETTER_ID'],
:id => ENV['GROWSTUFF_MAILCHIMP_NEWSLETTER_ID'],
:email => { :email => email }
})
end
def already_following?(member)
self.follows.exists?(:followed_id => member.id)
end
def get_follow(member)
self.follows.where(:followed_id => member.id).first if already_following?(member)
end
end

View File

@@ -1,23 +0,0 @@
class MemberSweeper < ActionController::Caching::Sweeper
observe Member
def after_create(member)
expire_fragment('homepage_stats')
end
def after_update(member)
expire_fragment('interesting_members') if member.interesting?
expire_fragment("interesting_seeds") if member.seeds.tradable.present?
expire_fragment("member_thumbnail_#{member.id}")
if member.plantings.present?
member.plantings.each do |p|
expire_fragment("plantings_listitem_#{p.id}") if p.interesting?
end
expire_fragment('interesting_plantings')
end
end
end

View File

@@ -1,13 +1,10 @@
class Notification < ActiveRecord::Base
attr_accessible :sender_id, :recipient_id,
:subject, :body, :post_id, :read
belongs_to :sender, :class_name => 'Member'
belongs_to :recipient, :class_name => 'Member'
belongs_to :post
default_scope order('created_at DESC')
scope :unread, where(:read => false)
default_scope { order('created_at DESC') }
scope :unread, -> { where(:read => false) }
before_create :replace_blank_subject
after_create :send_email

View File

@@ -1,10 +1,16 @@
class Order < ActiveRecord::Base
attr_accessible :member_id, :completed_at
belongs_to :member
has_many :order_items, :dependent => :destroy
default_scope order('created_at DESC')
default_scope { order('created_at DESC') }
validates :referral_code, :format => {
:with => /\A[a-zA-Z0-9 ]*\z/,
:message => "may only include letters and numbers"
}
before_save :standardize_referral_code
# total price of an order
def total
@@ -45,4 +51,46 @@ class Order < ActiveRecord::Base
end
end
# removes whitespace and forces to uppercase (we're somewhat liberal
# in what we accept, but we clean it up anyway.)
def standardize_referral_code
if referral_code
self.referral_code = referral_code.upcase.gsub /\s/, ''
end
end
# search orders (used by admin/orders)
# usage: Order.search({ :by => 'member', :for => 'Skud' })
# can search by: member, order_id, paypal_token, paypal_payer_id,
def Order.search(args={})
if args[:for]
case args[:by]
when "member"
member = Member.find_by_login_name(args[:for])
if member
return member.orders
end
when "order_id"
order = Order.find_by_id(args[:for])
if order
return [order]
end
when "paypal_token"
order = Order.find_by_paypal_express_token(args[:for])
if order
return [order]
end
when "paypal_payer_id"
order = Order.find_by_paypal_express_payer_id(args[:for])
if order
return [order]
end
when "referral_code"
# coerce to uppercase
return Order.where(:referral_code => args[:for].upcase)
end
end
return []
end
end

View File

@@ -1,6 +1,4 @@
class OrderItem < ActiveRecord::Base
attr_accessible :order_id, :price, :product_id, :quantity
belongs_to :order
belongs_to :product

View File

@@ -1,12 +1,21 @@
class Photo < ActiveRecord::Base
attr_accessible :flickr_photo_id, :owner_id, :title, :license_name,
:license_url, :thumbnail_url, :fullsize_url, :link_url
belongs_to :owner, :class_name => 'Member'
has_and_belongs_to_many :plantings
before_destroy {|photo| photo.plantings.clear}
has_and_belongs_to_many :harvests
before_destroy do |photo|
photo.plantings.clear
photo.harvests.clear
end
default_scope order("created_at desc")
default_scope { order("created_at desc") }
# remove photos that aren't used by anything
def destroy_if_unused
unless plantings.size > 0 or harvests.size > 0
self.destroy
end
end
# This is split into a side-effect free method and a side-effecting method
# for easier stubbing and testing.

View File

@@ -1,13 +0,0 @@
class PhotoSweeper < ActionController::Caching::Sweeper
observe Photo
def after_create(photo)
expire_fragment('interesting_plantings')
end
def after_destroy(photo)
expire_fragment('interesting_plantings')
end
end

24
app/models/plant_part.rb Normal file
View File

@@ -0,0 +1,24 @@
class PlantPart < ActiveRecord::Base
extend FriendlyId
friendly_id :name, :use => [:slugged, :finders]
has_many :harvests
has_many :crops, -> { uniq }, :through => :harvests
def to_s
return name
end
# Postgres complains if the ORDER BY clause of a SELECT DISTINCT query is
# not precisely one of the SELECTed fields. The default sort order on
# crops is lower(name), and Postgres is not smart enough to notice that it
# can calculate this from fields which are selected. The solution is to
# override PlantParts#crops to remove the ORDER BY clause, and replace it
# with `ORDER BY name`. This is not perfect, because it means the crops
# associated to plant parts will not be sorted in the same order as crops
# on the rest of the site.
def crops
return super.reorder('name')
end
end

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