mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-05-25 17:31:18 -04:00
Compare commits
271 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3bfe2329f1 | ||
|
|
941001c743 | ||
|
|
40cf5ba63a | ||
|
|
9a40449f08 | ||
|
|
90a88cf69d | ||
|
|
044a992d25 | ||
|
|
4b066ec37f | ||
|
|
c2dc2c5836 | ||
|
|
58452204aa | ||
|
|
711ba73d6b | ||
|
|
5354f2732f | ||
|
|
9bbaaa2211 | ||
|
|
93c47d774e | ||
|
|
d8ad697d09 | ||
|
|
7308a7cf9a | ||
|
|
c9c49a7e5e | ||
|
|
dba6b2a291 | ||
|
|
7d3991b295 | ||
|
|
e4c0ecfb5a | ||
|
|
fdb0e842de | ||
|
|
85ff36198b | ||
|
|
e38321aa33 | ||
|
|
d1438d1b2e | ||
|
|
b6f848ef66 | ||
|
|
ff47784aee | ||
|
|
1dba711057 | ||
|
|
6911f7b24b | ||
|
|
1e94abd063 | ||
|
|
3325e1e388 | ||
|
|
4b87977e24 | ||
|
|
dfa28264c6 | ||
|
|
f0c1d6d4c2 | ||
|
|
427b98a157 | ||
|
|
8f5000443f | ||
|
|
7947fd6e91 | ||
|
|
70bf5499b2 | ||
|
|
6b059cb4f4 | ||
|
|
efd112c4b8 | ||
|
|
5c7b760f34 | ||
|
|
81ae473972 | ||
|
|
a8171bb739 | ||
|
|
c803ed4ee6 | ||
|
|
9e41a65749 | ||
|
|
a7539df5b5 | ||
|
|
3950619877 | ||
|
|
7373fd4aa9 | ||
|
|
c3d9885525 | ||
|
|
4b5dee7bdb | ||
|
|
55d846b9e0 | ||
|
|
f2d8349a88 | ||
|
|
7c7dd7c609 | ||
|
|
d8f2c580ee | ||
|
|
2a0602468d | ||
|
|
89a9c18188 | ||
|
|
8b426da149 | ||
|
|
cab98f9750 | ||
|
|
27b7a26fee | ||
|
|
7261fae9f2 | ||
|
|
628ebd6841 | ||
|
|
61bbf7c30d | ||
|
|
e33803343a | ||
|
|
b08a448fdc | ||
|
|
7210ebfb22 | ||
|
|
039978357b | ||
|
|
7ce2481cbc | ||
|
|
5bc6af87c5 | ||
|
|
a5eaf3566e | ||
|
|
63d89be698 | ||
|
|
1b7be9f9b0 | ||
|
|
7a53e96d52 | ||
|
|
b28d146de7 | ||
|
|
55c8be8dc5 | ||
|
|
38a273459a | ||
|
|
1b07632c69 | ||
|
|
4a12523793 | ||
|
|
6aa601b8ab | ||
|
|
a66a040207 | ||
|
|
547a408a99 | ||
|
|
8cd224b7fa | ||
|
|
8428e93b47 | ||
|
|
483143f2fe | ||
|
|
1b3d106b6d | ||
|
|
e7be006fa7 | ||
|
|
b9f40151d8 | ||
|
|
fd467acc29 | ||
|
|
e1ad0c31c8 | ||
|
|
ee604dc2b0 | ||
|
|
0620646c6d | ||
|
|
df9cf3f5c4 | ||
|
|
944349760a | ||
|
|
7fe75ee52a | ||
|
|
e3d7bf9a62 | ||
|
|
deaf49c18f | ||
|
|
53543fff4c | ||
|
|
ea5e710a70 | ||
|
|
ad5a52ae74 | ||
|
|
c0cc5ab085 | ||
|
|
cf784cbedd | ||
|
|
5c68830919 | ||
|
|
370aab41c3 | ||
|
|
081f4021bc | ||
|
|
36f846fabf | ||
|
|
f6d094f57c | ||
|
|
9ce097b7d6 | ||
|
|
b03ccce575 | ||
|
|
63b8788c80 | ||
|
|
faa3beddbc | ||
|
|
5dbd5bc1d2 | ||
|
|
b8b0d98e07 | ||
|
|
b911ebfd07 | ||
|
|
1ca515bd4e | ||
|
|
905710b6e9 | ||
|
|
12e0f674bc | ||
|
|
18739c2a24 | ||
|
|
f3dc2ff7e5 | ||
|
|
e6209a5906 | ||
|
|
dbf64a4e90 | ||
|
|
a8961c3466 | ||
|
|
6931952688 | ||
|
|
936aa17ecc | ||
|
|
f3d7420b8a | ||
|
|
e419acea6e | ||
|
|
95ae15b780 | ||
|
|
ed468e79fc | ||
|
|
130565af75 | ||
|
|
ad8f360336 | ||
|
|
15775403fd | ||
|
|
e1b83c32af | ||
|
|
3fc7c65247 | ||
|
|
c8d1239b79 | ||
|
|
7885257fae | ||
|
|
a8d22709e6 | ||
|
|
31b7b45ae3 | ||
|
|
681798b582 | ||
|
|
f05ea56179 | ||
|
|
ed4269ea4c | ||
|
|
085fcc958e | ||
|
|
8f33fe3595 | ||
|
|
980a7d79d3 | ||
|
|
9c5c07e087 | ||
|
|
faaf07cad8 | ||
|
|
0e83a230b9 | ||
|
|
c278b36858 | ||
|
|
0805f86b86 | ||
|
|
aad88f1da6 | ||
|
|
7550bc860f | ||
|
|
fc38e1edea | ||
|
|
88a66a705b | ||
|
|
f77fd00931 | ||
|
|
b5c030905a | ||
|
|
2844e13298 | ||
|
|
3e4dc1f9e3 | ||
|
|
259c1e1731 | ||
|
|
870aa674b0 | ||
|
|
b1ab319bf7 | ||
|
|
857422719a | ||
|
|
235314bc13 | ||
|
|
ac1cd88ae1 | ||
|
|
f93ea3c0a1 | ||
|
|
0075040aab | ||
|
|
f9d51e623c | ||
|
|
dcd36dcd67 | ||
|
|
608a921fce | ||
|
|
4bedf1e6ac | ||
|
|
ac14c310f6 | ||
|
|
f979da315a | ||
|
|
a74ef7de6b | ||
|
|
10064121a6 | ||
|
|
f8a1ef6066 | ||
|
|
40d7b11d90 | ||
|
|
1600dd9e0b | ||
|
|
fbf5164eca | ||
|
|
21d86a8c2d | ||
|
|
848c7e117b | ||
|
|
369868672b | ||
|
|
321f3517a7 | ||
|
|
6dd7ec9f95 | ||
|
|
dc00878ff9 | ||
|
|
90f444dc1a | ||
|
|
4fa2e273aa | ||
|
|
df92e0574a | ||
|
|
e2053e2f8b | ||
|
|
31f0052b9d | ||
|
|
b6169778fd | ||
|
|
32b98a7e40 | ||
|
|
5111c2a96b | ||
|
|
2ac901c891 | ||
|
|
ff4466951c | ||
|
|
8f05e254a2 | ||
|
|
5122903139 | ||
|
|
1344f776e4 | ||
|
|
f33367ebac | ||
|
|
3ac42deae5 | ||
|
|
3d04e7c125 | ||
|
|
fa77f11177 | ||
|
|
45c8767234 | ||
|
|
13dc87f368 | ||
|
|
fc0116182f | ||
|
|
bbe9f3f1db | ||
|
|
1009570102 | ||
|
|
47f42d0ffa | ||
|
|
23d21be73f | ||
|
|
25f8d2ca44 | ||
|
|
58d91ec0b0 | ||
|
|
85cc9868cb | ||
|
|
75631da398 | ||
|
|
03c74dae03 | ||
|
|
2089866756 | ||
|
|
8d982c7e3e | ||
|
|
079cecc529 | ||
|
|
b0d90f6fd5 | ||
|
|
58f4ae32d0 | ||
|
|
dd0373a3ee | ||
|
|
170dca7086 | ||
|
|
c930f04b5a | ||
|
|
f41d919ca8 | ||
|
|
8c4583b0d3 | ||
|
|
972518e9fc | ||
|
|
5b38fad85e | ||
|
|
d227601627 | ||
|
|
736e45aec9 | ||
|
|
11e2e86b06 | ||
|
|
58617b5685 | ||
|
|
8c2aa4844f | ||
|
|
8648db5518 | ||
|
|
b5b201b6df | ||
|
|
b601fe40b3 | ||
|
|
d6999b2a8a | ||
|
|
76f152aa35 | ||
|
|
63f8a2c5c0 | ||
|
|
ae482ecab6 | ||
|
|
a8e63ab397 | ||
|
|
a2717ad058 | ||
|
|
92cce5910e | ||
|
|
ab897f05f9 | ||
|
|
cd8ca02322 | ||
|
|
5104225d11 | ||
|
|
24d6087ea7 | ||
|
|
dc9ee18e96 | ||
|
|
b4060b7903 | ||
|
|
884a3aad2c | ||
|
|
80f826421b | ||
|
|
7872bb48e2 | ||
|
|
7d10101c57 | ||
|
|
d9ed21ba53 | ||
|
|
5e8211172b | ||
|
|
24956255d7 | ||
|
|
55380dab04 | ||
|
|
e7926b6f22 | ||
|
|
fe7d8f73f3 | ||
|
|
47d7f001fe | ||
|
|
23a6722ddb | ||
|
|
23e2b756fd | ||
|
|
8bea05a77b | ||
|
|
d5ac4bac48 | ||
|
|
1af9b2e6db | ||
|
|
daa3c08706 | ||
|
|
29102e3b52 | ||
|
|
8c0fc54344 | ||
|
|
f5b20c2f32 | ||
|
|
79734ff603 | ||
|
|
397bfd8bca | ||
|
|
52dc111210 | ||
|
|
da1375e34d | ||
|
|
79db3c4c1d | ||
|
|
925027f7f0 | ||
|
|
1442a9106c | ||
|
|
fafb421a51 | ||
|
|
b2f3755196 | ||
|
|
2882e3d1a5 | ||
|
|
e8266480e5 |
36
.codeclimate.yml
Normal file
36
.codeclimate.yml
Normal file
@@ -0,0 +1,36 @@
|
||||
engines:
|
||||
rubocop:
|
||||
enabled: true
|
||||
scss-lint:
|
||||
enabled: true
|
||||
shellcheck:
|
||||
enabled: true
|
||||
eslint:
|
||||
enabled: true
|
||||
coffeelint:
|
||||
enabled: true
|
||||
brakeman:
|
||||
enabled: true
|
||||
bundler-audit:
|
||||
enabled: true
|
||||
duplication:
|
||||
enabled: true
|
||||
config:
|
||||
languages:
|
||||
- ruby
|
||||
- javascript
|
||||
fixme:
|
||||
enabled: true
|
||||
ratings:
|
||||
paths:
|
||||
- "**.rb"
|
||||
- "**.js"
|
||||
- "**.coffee"
|
||||
- "**.sass"
|
||||
- "**.haml"
|
||||
- Gemfile.lock
|
||||
exclude_paths:
|
||||
- config/
|
||||
- db/
|
||||
- spec/
|
||||
- public/
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -8,10 +8,10 @@ coverage
|
||||
*~
|
||||
*.DS_Store
|
||||
config/application.yml
|
||||
config/database.yml
|
||||
credentials*.sh
|
||||
Pathogen:
|
||||
custom_plan.rb
|
||||
zeus.json
|
||||
.bundle
|
||||
config/application.yml
|
||||
.idea/**
|
||||
@@ -1 +1 @@
|
||||
2.2.4
|
||||
2.3.1
|
||||
|
||||
@@ -8,10 +8,12 @@ env:
|
||||
global:
|
||||
secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
|
||||
rvm:
|
||||
- 2.2.4
|
||||
- 2.3.1
|
||||
before_script:
|
||||
- psql -c 'create database growstuff_test;' -U postgres
|
||||
script:
|
||||
- script/gemfile_check
|
||||
- bundle exec script/check_contributors_md
|
||||
- bundle exec rake db:migrate --trace
|
||||
- bundle exec rspec spec/
|
||||
services:
|
||||
@@ -34,4 +36,6 @@ deploy:
|
||||
- restart
|
||||
after_deploy:
|
||||
- bundle exec script/heroku_maintenance.rb off
|
||||
|
||||
addons:
|
||||
code_climate:
|
||||
repo_token: 462e015bbdaabfb20910fc07f2fea253410ecb131444e00f97dbf32dc6789ca6
|
||||
|
||||
@@ -66,3 +66,8 @@ submit the change with your pull request.
|
||||
- Anthony Atkinson / [sha1sum](https://github.com/sha1sum)
|
||||
- Terence Conquest / [twconquest](https://github.com/twconquest)
|
||||
- Daniel O'Connor / [CloCkWeRX](https://github.com/CloCkWeRX)
|
||||
- DV Dasari / [dv2](https://github.com/dv2)
|
||||
- Eric Tillberg / [Thrillberg](https://github.com/Thrillberg)
|
||||
- Lucas Nogueira / [lucasnogueira](https://github.com/lucasnogueira)
|
||||
- Charley Lewittes / [ctlewitt](https://github.com/ctlewitt)
|
||||
- Kristine Nicole Polvoriza / [polveenomials](https://github.com/polveenomials)
|
||||
4
Capfile
4
Capfile
@@ -1,4 +0,0 @@
|
||||
load 'deploy'
|
||||
# Uncomment if you are using Rails' asset pipeline
|
||||
# load 'deploy/assets'
|
||||
load 'config/deploy' # remove this line to skip loading any of the default tasks
|
||||
26
Gemfile
26
Gemfile
@@ -1,8 +1,8 @@
|
||||
source 'https://rubygems.org'
|
||||
|
||||
ruby '2.2.4'
|
||||
ruby '2.3.1'
|
||||
|
||||
gem 'rails', '~> 4.1.11'
|
||||
gem 'rails', '~> 4.2.0'
|
||||
|
||||
gem 'bundler', '>=1.1.5'
|
||||
|
||||
@@ -36,13 +36,8 @@ gem 'comfortable_mexican_sofa', '~> 1.12.0' # content management system
|
||||
gem 'kaminari' # pagination
|
||||
gem 'bootstrap-kaminari-views' # bootstrap views for kaminari
|
||||
|
||||
# vendored activemerchant for testing- needed for bogus paypal
|
||||
# gateway monkeypatch
|
||||
gem 'activemerchant', '1.33.0',
|
||||
:path => 'vendor/gems/activemerchant-1.33.0',
|
||||
:require => 'active_merchant'
|
||||
gem 'active_utils', '1.0.5',
|
||||
:path => 'vendor/gems/active_utils-1.0.5'
|
||||
gem 'activemerchant'
|
||||
gem 'active_utils'
|
||||
|
||||
# Markdown formatting for updates etc
|
||||
gem 'bluecloth'
|
||||
@@ -51,7 +46,7 @@ gem 'bluecloth'
|
||||
gem 'will_paginate', '~> 3.0'
|
||||
|
||||
# user signup/login/etc
|
||||
gem 'devise', '~> 3.5.0'
|
||||
gem 'devise', '>= 4.0.0'
|
||||
|
||||
# nicely formatted URLs
|
||||
gem 'friendly_id', '~> 5.0.4'
|
||||
@@ -60,9 +55,7 @@ gem 'friendly_id', '~> 5.0.4'
|
||||
gem 'gravatar-ultimate'
|
||||
|
||||
# For geolocation
|
||||
gem 'geocoder',
|
||||
:git => 'https://github.com/alexreisner/geocoder.git',
|
||||
:ref => '104d46'
|
||||
gem 'geocoder'
|
||||
|
||||
# For easy calendar selection
|
||||
gem 'bootstrap-datepicker-rails'
|
||||
@@ -103,18 +96,21 @@ end
|
||||
|
||||
group :development, :test do
|
||||
gem 'haml-rails' # HTML templating language
|
||||
gem 'rspec-rails', '~> 3.4.0' # unit testing framework
|
||||
gem 'rspec-rails' # unit testing framework
|
||||
gem 'rspec-activemodel-mocks'
|
||||
gem 'byebug' # debugging
|
||||
gem 'database_cleaner', '~> 1.5.0'
|
||||
gem 'webrat' # provides HTML matchers for view tests
|
||||
gem 'factory_girl_rails', '~> 4.5.0' # for creating test data
|
||||
gem 'factory_girl_rails' # for creating test data
|
||||
gem 'coveralls', require: false # coverage analysis
|
||||
gem 'capybara' # integration tests
|
||||
gem 'capybara-email' # integration tests for email
|
||||
gem 'capybara-screenshot' # for test debugging
|
||||
gem 'poltergeist', '~> 1.6' # for headless JS testing
|
||||
gem 'i18n-tasks' # adds tests for finding missing and unused translations
|
||||
gem 'selenium-webdriver'
|
||||
gem "codeclimate-test-reporter", group: :test, require: nil
|
||||
gem "active_merchant-paypal-bogus-gateway"
|
||||
end
|
||||
|
||||
group :travis do
|
||||
|
||||
266
Gemfile.lock
266
Gemfile.lock
@@ -1,57 +1,57 @@
|
||||
GIT
|
||||
remote: https://github.com/alexreisner/geocoder.git
|
||||
revision: 104d466ba7097b7dce5ba19f8e4091b7f69ccdf6
|
||||
ref: 104d46
|
||||
specs:
|
||||
geocoder (1.1.8)
|
||||
|
||||
PATH
|
||||
remote: vendor/gems/active_utils-1.0.5
|
||||
specs:
|
||||
active_utils (1.0.5)
|
||||
activesupport (>= 2.3.11)
|
||||
i18n
|
||||
|
||||
PATH
|
||||
remote: vendor/gems/activemerchant-1.33.0
|
||||
specs:
|
||||
activemerchant (1.33.0)
|
||||
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actionmailer (4.1.15)
|
||||
actionpack (= 4.1.15)
|
||||
actionview (= 4.1.15)
|
||||
actionmailer (4.2.7.1)
|
||||
actionpack (= 4.2.7.1)
|
||||
actionview (= 4.2.7.1)
|
||||
activejob (= 4.2.7.1)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
actionpack (4.1.15)
|
||||
actionview (= 4.1.15)
|
||||
activesupport (= 4.1.15)
|
||||
rack (~> 1.5.2)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
actionpack (4.2.7.1)
|
||||
actionview (= 4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
rack (~> 1.6)
|
||||
rack-test (~> 0.6.2)
|
||||
actionview (4.1.15)
|
||||
activesupport (= 4.1.15)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||
actionview (4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
builder (~> 3.1)
|
||||
erubis (~> 2.7.0)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||
active_link_to (1.0.3)
|
||||
actionpack
|
||||
activemodel (4.1.15)
|
||||
activesupport (= 4.1.15)
|
||||
active_merchant-paypal-bogus-gateway (0.1.0)
|
||||
activemerchant
|
||||
active_utils (3.2.2)
|
||||
activesupport (>= 3.2, < 5.1.0)
|
||||
i18n
|
||||
activejob (4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
globalid (>= 0.3.0)
|
||||
activemerchant (1.60.0)
|
||||
activesupport (>= 3.2.14, < 5.1)
|
||||
builder (>= 2.1.2, < 4.0.0)
|
||||
i18n (>= 0.6.9)
|
||||
nokogiri (~> 1.4)
|
||||
activemodel (4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
builder (~> 3.1)
|
||||
activerecord (4.1.15)
|
||||
activemodel (= 4.1.15)
|
||||
activesupport (= 4.1.15)
|
||||
arel (~> 5.0.0)
|
||||
activesupport (4.1.15)
|
||||
i18n (~> 0.6, >= 0.6.9)
|
||||
activerecord (4.2.7.1)
|
||||
activemodel (= 4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
arel (~> 6.0)
|
||||
activesupport (4.2.7.1)
|
||||
i18n (~> 0.7)
|
||||
json (~> 1.7, >= 1.7.7)
|
||||
minitest (~> 5.1)
|
||||
thread_safe (~> 0.1)
|
||||
thread_safe (~> 0.3, >= 0.3.4)
|
||||
tzinfo (~> 1.1)
|
||||
addressable (2.4.0)
|
||||
arel (5.0.1.20140414130214)
|
||||
ast (2.2.0)
|
||||
autoprefixer-rails (6.3.6.1)
|
||||
arel (6.0.3)
|
||||
ast (2.3.0)
|
||||
autoprefixer-rails (6.4.0.2)
|
||||
execjs
|
||||
bcrypt (3.1.11)
|
||||
better_errors (2.1.1)
|
||||
@@ -67,13 +67,13 @@ GEM
|
||||
bootstrap-kaminari-views (0.0.5)
|
||||
kaminari (>= 0.13)
|
||||
rails (>= 3.1)
|
||||
bootstrap-sass (3.3.6)
|
||||
bootstrap-sass (3.3.7)
|
||||
autoprefixer-rails (>= 5.2.1)
|
||||
sass (>= 3.3.4)
|
||||
bootstrap_form (2.3.0)
|
||||
bootstrap_form (2.5.0)
|
||||
builder (3.2.2)
|
||||
byebug (9.0.4)
|
||||
cancancan (1.14.0)
|
||||
byebug (9.0.5)
|
||||
cancancan (1.15.0)
|
||||
capybara (2.7.1)
|
||||
addressable
|
||||
mime-types (>= 1.16)
|
||||
@@ -84,6 +84,9 @@ GEM
|
||||
capybara-email (2.5.0)
|
||||
capybara (~> 2.4)
|
||||
mail
|
||||
capybara-screenshot (1.0.13)
|
||||
capybara (>= 1.0, < 3)
|
||||
launchy
|
||||
childprocess (0.5.9)
|
||||
ffi (~> 1.0, >= 1.0.11)
|
||||
climate_control (0.0.3)
|
||||
@@ -91,8 +94,10 @@ GEM
|
||||
cliver (0.3.2)
|
||||
cocaine (0.5.8)
|
||||
climate_control (>= 0.0.3, < 1.0)
|
||||
codemirror-rails (5.11)
|
||||
railties (>= 3.0, < 5)
|
||||
codeclimate-test-reporter (0.6.0)
|
||||
simplecov (>= 0.7.1, < 1.0.0)
|
||||
codemirror-rails (5.16.0)
|
||||
railties (>= 3.0, < 6.0)
|
||||
coderay (1.1.1)
|
||||
coffee-rails (4.1.1)
|
||||
coffee-script (>= 2.2.0)
|
||||
@@ -117,23 +122,22 @@ GEM
|
||||
rails-i18n (>= 4.0.0)
|
||||
sass-rails (>= 4.0.3)
|
||||
concurrent-ruby (1.0.2)
|
||||
coveralls (0.8.13)
|
||||
json (~> 1.8)
|
||||
simplecov (~> 0.11.0)
|
||||
coveralls (0.8.15)
|
||||
json (>= 1.8, < 3)
|
||||
simplecov (~> 0.12.0)
|
||||
term-ansicolor (~> 1.3)
|
||||
thor (~> 0.19.1)
|
||||
tins (~> 1.6.0)
|
||||
tins (>= 1.6.0, < 2)
|
||||
csv_shaper (1.2.0)
|
||||
activesupport (>= 3.0.0)
|
||||
dalli (2.7.6)
|
||||
database_cleaner (1.5.3)
|
||||
debug_inspector (0.0.2)
|
||||
devise (3.5.10)
|
||||
devise (4.2.0)
|
||||
bcrypt (~> 3.0)
|
||||
orm_adapter (~> 0.1)
|
||||
railties (>= 3.2.6, < 5)
|
||||
railties (>= 4.1.0, < 5.1)
|
||||
responders
|
||||
thread_safe (~> 0.1)
|
||||
warden (~> 1.2.3)
|
||||
diff-lcs (1.2.5)
|
||||
docile (1.1.5)
|
||||
@@ -141,41 +145,44 @@ GEM
|
||||
json
|
||||
thread
|
||||
thread_safe
|
||||
elasticsearch (1.0.17)
|
||||
elasticsearch-api (= 1.0.17)
|
||||
elasticsearch-transport (= 1.0.17)
|
||||
elasticsearch-api (1.0.17)
|
||||
elasticsearch (1.0.18)
|
||||
elasticsearch-api (= 1.0.18)
|
||||
elasticsearch-transport (= 1.0.18)
|
||||
elasticsearch-api (1.0.18)
|
||||
multi_json
|
||||
elasticsearch-model (0.1.9)
|
||||
activesupport (> 3)
|
||||
elasticsearch (> 0.4)
|
||||
hashie
|
||||
elasticsearch-rails (0.1.9)
|
||||
elasticsearch-transport (1.0.17)
|
||||
elasticsearch-transport (1.0.18)
|
||||
faraday
|
||||
multi_json
|
||||
erubis (2.7.0)
|
||||
excon (0.49.0)
|
||||
excon (0.51.0)
|
||||
execjs (2.7.0)
|
||||
factory_girl (4.5.0)
|
||||
factory_girl (4.7.0)
|
||||
activesupport (>= 3.0.0)
|
||||
factory_girl_rails (4.5.0)
|
||||
factory_girl (~> 4.5.0)
|
||||
factory_girl_rails (4.7.0)
|
||||
factory_girl (~> 4.7.0)
|
||||
railties (>= 3.0.0)
|
||||
faraday (0.9.2)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
ffi (1.9.10)
|
||||
ffi (1.9.14)
|
||||
figaro (1.1.1)
|
||||
thor (~> 0.14)
|
||||
flickraw (0.9.8)
|
||||
flickraw (0.9.9)
|
||||
font-awesome-sass (4.6.2)
|
||||
sass (>= 3.2)
|
||||
formatador (0.2.5)
|
||||
friendly_id (5.0.5)
|
||||
activerecord (>= 4.0.0)
|
||||
gibbon (1.2.0)
|
||||
geocoder (1.3.7)
|
||||
gibbon (1.2.1)
|
||||
httparty
|
||||
multi_json (>= 1.9.0)
|
||||
globalid (0.3.7)
|
||||
activesupport (>= 4.1.0)
|
||||
gravatar-ultimate (2.0.0)
|
||||
activesupport (>= 2.3.14)
|
||||
rack
|
||||
@@ -189,7 +196,7 @@ GEM
|
||||
shellany (~> 0.0)
|
||||
thor (>= 0.18.1)
|
||||
guard-compat (1.2.1)
|
||||
guard-rspec (4.6.5)
|
||||
guard-rspec (4.7.2)
|
||||
guard (~> 2.1)
|
||||
guard-compat (~> 1.1)
|
||||
rspec (>= 2.99.0, < 4.0)
|
||||
@@ -211,8 +218,7 @@ GEM
|
||||
haml (~> 4.0.0)
|
||||
nokogiri (~> 1.6.0)
|
||||
ruby_parser (~> 3.5)
|
||||
httparty (0.13.3)
|
||||
json (~> 1.8)
|
||||
httparty (0.14.0)
|
||||
multi_xml (>= 0.5.2)
|
||||
i18n (0.7.0)
|
||||
i18n-tasks (0.9.5)
|
||||
@@ -225,20 +231,21 @@ GEM
|
||||
parser (>= 2.2.3.0)
|
||||
term-ansicolor (>= 1.3.2)
|
||||
terminal-table (>= 1.5.1)
|
||||
jquery-rails (3.1.4)
|
||||
railties (>= 3.0, < 5.0)
|
||||
jquery-rails (4.1.1)
|
||||
rails-dom-testing (>= 1, < 3)
|
||||
railties (>= 4.2.0)
|
||||
thor (>= 0.14, < 2.0)
|
||||
jquery-ui-rails (5.0.5)
|
||||
railties (>= 3.2.16)
|
||||
js-routes (1.2.5)
|
||||
js-routes (1.2.9)
|
||||
railties (>= 3.2)
|
||||
sprockets-rails
|
||||
json (1.8.3)
|
||||
kaminari (0.16.3)
|
||||
kaminari (0.17.0)
|
||||
actionpack (>= 3.0.0)
|
||||
activesupport (>= 3.0.0)
|
||||
kgio (2.10.0)
|
||||
kramdown (1.11.1)
|
||||
kramdown (1.12.0)
|
||||
launchy (2.4.3)
|
||||
addressable (~> 2.3)
|
||||
leaflet-markercluster-rails (0.7.0)
|
||||
@@ -250,25 +257,28 @@ GEM
|
||||
rb-fsevent (~> 0.9, >= 0.9.4)
|
||||
rb-inotify (~> 0.9, >= 0.9.7)
|
||||
ruby_dep (~> 1.2)
|
||||
loofah (2.0.3)
|
||||
nokogiri (>= 1.5.9)
|
||||
lumberjack (1.0.10)
|
||||
mail (2.6.4)
|
||||
mime-types (>= 1.16, < 4)
|
||||
memcachier (0.0.2)
|
||||
method_source (0.8.2)
|
||||
mime-types (3.0)
|
||||
mime-types (3.1)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2016.0221)
|
||||
mime-types-data (3.2016.0521)
|
||||
mimemagic (0.3.0)
|
||||
mini_portile2 (2.0.0)
|
||||
mini_portile2 (2.1.0)
|
||||
minitest (5.9.0)
|
||||
multi_json (1.11.3)
|
||||
multi_xml (0.5.5)
|
||||
multipart-post (2.0.0)
|
||||
nenv (0.3.0)
|
||||
newrelic_rpm (3.15.2.317)
|
||||
nokogiri (1.6.7.2)
|
||||
mini_portile2 (~> 2.0.0.rc2)
|
||||
notiffany (0.1.0)
|
||||
newrelic_rpm (3.16.0.318)
|
||||
nokogiri (1.6.8)
|
||||
mini_portile2 (~> 2.1.0)
|
||||
pkg-config (~> 1.1.7)
|
||||
notiffany (0.1.1)
|
||||
nenv (~> 0.1)
|
||||
shellany (~> 0.0)
|
||||
oauth (0.5.1)
|
||||
@@ -291,35 +301,44 @@ GEM
|
||||
cocaine (~> 0.5.5)
|
||||
mime-types
|
||||
mimemagic (= 0.3.0)
|
||||
parser (2.3.1.0)
|
||||
parser (2.3.1.2)
|
||||
ast (~> 2.2)
|
||||
pg (0.18.4)
|
||||
pkg-config (1.1.7)
|
||||
plupload-rails (1.2.1)
|
||||
rails (>= 3.1)
|
||||
poltergeist (1.9.0)
|
||||
poltergeist (1.10.0)
|
||||
capybara (~> 2.1)
|
||||
cliver (~> 0.3.1)
|
||||
multi_json (~> 1.0)
|
||||
websocket-driver (>= 0.2.0)
|
||||
pry (0.10.3)
|
||||
pry (0.10.4)
|
||||
coderay (~> 1.1.0)
|
||||
method_source (~> 0.8.1)
|
||||
slop (~> 3.4)
|
||||
quiet_assets (1.1.0)
|
||||
railties (>= 3.1, < 5.0)
|
||||
rack (1.5.5)
|
||||
rack (1.6.4)
|
||||
rack-test (0.6.3)
|
||||
rack (>= 1.0)
|
||||
rails (4.1.15)
|
||||
actionmailer (= 4.1.15)
|
||||
actionpack (= 4.1.15)
|
||||
actionview (= 4.1.15)
|
||||
activemodel (= 4.1.15)
|
||||
activerecord (= 4.1.15)
|
||||
activesupport (= 4.1.15)
|
||||
rails (4.2.7.1)
|
||||
actionmailer (= 4.2.7.1)
|
||||
actionpack (= 4.2.7.1)
|
||||
actionview (= 4.2.7.1)
|
||||
activejob (= 4.2.7.1)
|
||||
activemodel (= 4.2.7.1)
|
||||
activerecord (= 4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
bundler (>= 1.3.0, < 2.0)
|
||||
railties (= 4.1.15)
|
||||
sprockets-rails (~> 2.0)
|
||||
railties (= 4.2.7.1)
|
||||
sprockets-rails
|
||||
rails-deprecated_sanitizer (1.0.3)
|
||||
activesupport (>= 4.2.0.alpha)
|
||||
rails-dom-testing (1.0.7)
|
||||
activesupport (>= 4.2.0.beta, < 5.0)
|
||||
nokogiri (~> 1.6.0)
|
||||
rails-deprecated_sanitizer (>= 1.0.1)
|
||||
rails-html-sanitizer (1.0.3)
|
||||
loofah (~> 2.0)
|
||||
rails-i18n (4.0.8)
|
||||
i18n (~> 0.7)
|
||||
railties (~> 4.0)
|
||||
@@ -328,18 +347,18 @@ GEM
|
||||
rails_stdout_logging
|
||||
rails_serve_static_assets (0.0.5)
|
||||
rails_stdout_logging (0.0.5)
|
||||
railties (4.1.15)
|
||||
actionpack (= 4.1.15)
|
||||
activesupport (= 4.1.15)
|
||||
railties (4.2.7.1)
|
||||
actionpack (= 4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
rake (>= 0.8.7)
|
||||
thor (>= 0.18.1, < 2.0)
|
||||
raindrops (0.16.0)
|
||||
rake (11.1.2)
|
||||
rake (11.2.2)
|
||||
rb-fsevent (0.9.7)
|
||||
rb-inotify (0.9.7)
|
||||
ffi (>= 0.5.0)
|
||||
responders (1.1.2)
|
||||
railties (>= 3.2, < 4.2)
|
||||
responders (2.2.0)
|
||||
railties (>= 4.2.0, < 5.1)
|
||||
rspec (3.4.0)
|
||||
rspec-core (~> 3.4.0)
|
||||
rspec-expectations (~> 3.4.0)
|
||||
@@ -371,39 +390,39 @@ GEM
|
||||
sexp_processor (~> 4.1)
|
||||
rubyzip (1.2.0)
|
||||
sass (3.4.22)
|
||||
sass-rails (5.0.4)
|
||||
railties (>= 4.0.0, < 5.0)
|
||||
sass-rails (5.0.6)
|
||||
railties (>= 4.0.0, < 6)
|
||||
sass (~> 3.1)
|
||||
sprockets (>= 2.8, < 4.0)
|
||||
sprockets-rails (>= 2.0, < 4.0)
|
||||
tilt (>= 1.1, < 3)
|
||||
selenium-webdriver (2.53.0)
|
||||
selenium-webdriver (2.53.4)
|
||||
childprocess (~> 0.5)
|
||||
rubyzip (~> 1.0)
|
||||
websocket (~> 1.0)
|
||||
sexp_processor (4.7.0)
|
||||
shellany (0.0.1)
|
||||
simplecov (0.11.2)
|
||||
simplecov (0.12.0)
|
||||
docile (~> 1.1.0)
|
||||
json (~> 1.8)
|
||||
json (>= 1.8, < 3)
|
||||
simplecov-html (~> 0.10.0)
|
||||
simplecov-html (0.10.0)
|
||||
slop (3.6.0)
|
||||
sprockets (3.6.0)
|
||||
sprockets (3.7.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (> 1, < 3)
|
||||
sprockets-rails (2.3.3)
|
||||
actionpack (>= 3.0)
|
||||
activesupport (>= 3.0)
|
||||
sprockets (>= 2.8, < 4.0)
|
||||
sprockets-rails (3.1.1)
|
||||
actionpack (>= 4.0)
|
||||
activesupport (>= 4.0)
|
||||
sprockets (>= 3.0.0)
|
||||
term-ansicolor (1.3.2)
|
||||
tins (~> 1.0)
|
||||
terminal-table (1.5.2)
|
||||
terminal-table (1.6.0)
|
||||
thor (0.19.1)
|
||||
thread (0.2.2)
|
||||
thread_safe (0.3.5)
|
||||
tilt (2.0.4)
|
||||
tins (1.6.0)
|
||||
tilt (2.0.5)
|
||||
tins (1.12.0)
|
||||
tzinfo (1.2.2)
|
||||
thread_safe (~> 0.1)
|
||||
uglifier (2.7.2)
|
||||
@@ -430,8 +449,9 @@ PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
active_utils (= 1.0.5)!
|
||||
activemerchant (= 1.33.0)!
|
||||
active_merchant-paypal-bogus-gateway
|
||||
active_utils
|
||||
activemerchant
|
||||
better_errors
|
||||
binding_of_caller
|
||||
bluecloth
|
||||
@@ -444,21 +464,23 @@ DEPENDENCIES
|
||||
cancancan (~> 1.9)
|
||||
capybara
|
||||
capybara-email
|
||||
capybara-screenshot
|
||||
codeclimate-test-reporter
|
||||
coffee-rails (~> 4.1.0)
|
||||
comfortable_mexican_sofa (~> 1.12.0)
|
||||
coveralls
|
||||
csv_shaper
|
||||
dalli
|
||||
database_cleaner (~> 1.5.0)
|
||||
devise (~> 3.5.0)
|
||||
devise (>= 4.0.0)
|
||||
elasticsearch-model
|
||||
elasticsearch-rails
|
||||
factory_girl_rails (~> 4.5.0)
|
||||
factory_girl_rails
|
||||
figaro
|
||||
flickraw
|
||||
font-awesome-sass
|
||||
friendly_id (~> 5.0.4)
|
||||
geocoder!
|
||||
geocoder
|
||||
gibbon (~> 1.2.0)
|
||||
gravatar-ultimate
|
||||
guard
|
||||
@@ -483,11 +505,11 @@ DEPENDENCIES
|
||||
poltergeist (~> 1.6)
|
||||
pry
|
||||
quiet_assets
|
||||
rails (~> 4.1.11)
|
||||
rails (~> 4.2.0)
|
||||
rails_12factor
|
||||
rake (>= 10.0.0)
|
||||
rspec-activemodel-mocks
|
||||
rspec-rails (~> 3.4.0)
|
||||
rspec-rails
|
||||
ruby-units
|
||||
sass-rails (~> 5.0.4)
|
||||
selenium-webdriver
|
||||
@@ -497,7 +519,7 @@ DEPENDENCIES
|
||||
will_paginate (~> 3.0)
|
||||
|
||||
RUBY VERSION
|
||||
ruby 2.1.8p440
|
||||
ruby 2.3.1p112
|
||||
|
||||
BUNDLED WITH
|
||||
1.12.4
|
||||
1.12.5
|
||||
|
||||
19
README.md
19
README.md
@@ -2,6 +2,7 @@
|
||||
|
||||
[](https://travis-ci.org/Growstuff/growstuff)
|
||||
[](https://coveralls.io/r/Growstuff/growstuff)
|
||||
[](https://codeclimate.com/github/Growstuff/growstuff)
|
||||
|
||||
Welcome to the Growstuff project.
|
||||
|
||||
@@ -18,8 +19,9 @@ encourage participation from people of all backgrounds and skill levels.
|
||||
|
||||
* [Issues](http://github.com/Growstuff/growstuff/issues) (features we're
|
||||
working on, known bugs, etc)
|
||||
* [Discussion forums](http://wiki.growstuff.org/index.php/Discussion_forums) (mailing lists, IRC, etc)
|
||||
* [Wiki](http://wiki.growstuff.org/) (general documentation)
|
||||
* [Discussion forums](http://talk.growstuff.org/) (design ideas, planning releases)
|
||||
* [IRC](https://webchat.freenode.net/) growstuff channel (general chat, brainstorming and troubleshooting) or [Gitter](https://gitter.im/Growstuff/growstuff)
|
||||
* [Wiki](https://github.com/Growstuff/growstuff/wiki) (general documentation, etc. Help by migrating from the [old wiki](https://web.archive.org/web/*/wiki.growstuff.org))
|
||||
|
||||
## For coders
|
||||
|
||||
@@ -27,19 +29,11 @@ Growstuff is built in Ruby on Rails and also uses JavaScript for
|
||||
frontend features. We welcome contributions -- see
|
||||
[CONTRIBUTING](CONTRIBUTING.md) for details.
|
||||
|
||||
* To set up your development environment, see [Getting started](http://wiki.growstuff.org/index.php/Development/Getting_Started).
|
||||
* To set up your development environment, see [Getting started](https://github.com/Growstuff/growstuff/wiki/New-contributor-guide).
|
||||
* We encourage [pair programming](http://wiki.growstuff.org/index.php/Pairing), especially for newer developers. [Find a pair programming partner.](http://talk.growstuff.org/t/find-a-pair-programming-partner/13)
|
||||
* Drop in to one of our [discussion forums](http://wiki.growstuff.org/index.php/Discussion_forums) to chat to other developers, get help, etc.
|
||||
* Drop in to our [discussion forums](http://talk.growstuff.org/), IRC or Gitter to chat to other developers, get help, etc.
|
||||
* You may also be interested in our [API](http://wiki.growstuff.org/index.php/API).
|
||||
|
||||
The wiki is down right now, so here's what you need to do on Mac OS X to get set up.
|
||||
|
||||
```
|
||||
gem install bundle
|
||||
gem install pg -v '0.18.4' -- --with-pg-config=/Applications/Postgres.app/Contents/Versions/latest/bin/pg_config
|
||||
bundle install
|
||||
```
|
||||
|
||||
## For designers, writers, researchers, data wranglers, and other contributors
|
||||
|
||||
There are heaps of ways to get involved and contribute no matter what
|
||||
@@ -57,6 +51,7 @@ Here on Github, you might find these useful:
|
||||
* [needs: visual design](https://github.com/Growstuff/growstuff/labels/needs:%20visual design) - tasks requiring visual/graphical design
|
||||
* [needs: documentation](https://github.com/Growstuff/growstuff/labels/needs:%20documentation)
|
||||
* [needs: data](https://github.com/Growstuff/growstuff/labels/needs:%20data) - tasks requiring data entry, data design, data import, or similar
|
||||
* [curated:beginner](https://github.com/Growstuff/growstuff/labels/curated:%20beginner) - tasks that are ideal for beginner programmers or people new to the project
|
||||
|
||||
Feel free to comment on any of the issues you find there, or open up a broader conversation on [Growstuff Talk](http://talk.growstuff.org).
|
||||
|
||||
|
||||
BIN
app/assets/images/facebook-thumbnail.png
Normal file
BIN
app/assets/images/facebook-thumbnail.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
BIN
app/assets/images/location-not-set.en.png
Normal file
BIN
app/assets/images/location-not-set.en.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
@@ -8,14 +8,12 @@ jQuery ->
|
||||
|
||||
el.datepicker({'format': 'yyyy-mm-dd'})
|
||||
|
||||
href = el.attr('href')
|
||||
|
||||
originalText = el.text()
|
||||
|
||||
el.click (e) ->
|
||||
e.stopPropagation()
|
||||
e.preventDefault()
|
||||
|
||||
originalText = $(this).text()
|
||||
href = $(this).attr('href')
|
||||
$(this).text('Confirm without date')
|
||||
|
||||
$(this).bind('click.confirm', (e) ->
|
||||
@@ -31,6 +29,8 @@ jQuery ->
|
||||
|
||||
el.one 'changeDate', ->
|
||||
date = $(this).datepicker('getDate')
|
||||
href = $(this).attr('href')
|
||||
|
||||
url = "#{href}&planting[finished_at]=#{date}"
|
||||
|
||||
link = $("<a href='#{url}' data-method='put'></a>")
|
||||
|
||||
4
app/assets/javascripts/bootstrap-accessibility.min.js
vendored
Normal file
4
app/assets/javascripts/bootstrap-accessibility.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1,6 +1,7 @@
|
||||
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";
|
||||
mapbox_access_token = "<%= Rails.env == 'test' ? 0 : Growstuff::Application.config.mapbox_access_token %>";
|
||||
mapbox_base_url = "http://a.tiles.mapbox.com/v4/" + mapbox_map_id + "/{z}/{x}/{y}.png?access_token=" + mapbox_access_token;
|
||||
|
||||
L.Icon.Default.imagePath = '/assets'
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
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";
|
||||
mapbox_access_token = "<%= Rails.env == 'test' ? 0 : Growstuff::Application.config.mapbox_access_token %>";
|
||||
mapbox_base_url = "http://a.tiles.mapbox.com/v4/" + mapbox_map_id + "/{z}/{x}/{y}.png?access_token=" + mapbox_access_token;
|
||||
|
||||
L.Icon.Default.imagePath = '/assets'
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
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";
|
||||
mapbox_access_token = "<%= Rails.env == 'test' ? 0 : Growstuff::Application.config.mapbox_access_token %>";
|
||||
mapbox_base_url = "http://a.tiles.mapbox.com/v4/" + mapbox_map_id + "/{z}/{x}/{y}.png?access_token=" + mapbox_access_token;
|
||||
nominatim_base_url = 'http://nominatim.openstreetmap.org/search/';
|
||||
nominatim_user_agent_email = "<%= Rails.env == 'test' ? 0 : Growstuff::Application.config.user_agent_email %>";
|
||||
|
||||
|
||||
1
app/assets/stylesheets/bootstrap-accessibility.css
vendored
Normal file
1
app/assets/stylesheets/bootstrap-accessibility.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.btn:focus{outline:dotted 2px #000}div.active:focus{outline:dotted 1px #000}a:focus{outline:dotted 1px #000}.close:hover,.close:focus{outline:dotted 1px #000}.nav>li>a:hover,.nav>li>a:focus{outline:dotted 1px #000}.carousel-inner>.item{position:absolute;top:-999999em;display:block;-moz-transition:ease-in-out 0.6s left;-o-transition:ease-in-out 0.6s left;-webkit-transition:ease-in-out 0.6s left;transition:ease-in-out 0.6s left}.carousel-inner>.active{top:0}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{position:relative}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.alert-success{color:#2d4821}.alert-info{color:#214c62}.alert-warning{color:#6c4a00;background-color:#f9f1c6}.alert-danger{color:#d2322d}.alert-danger:hover{color:#a82824}
|
||||
@@ -42,7 +42,7 @@ $navbar-default-bg-highlight: $brown
|
||||
$navbar-default-color: $beige
|
||||
$navbar-default-link-color: darken($beige, 20%)
|
||||
$navbar-default-link-hover-color: $beige
|
||||
$navbar-default-link-active-color: $beige
|
||||
$navbar-default-link-active-color: darken($beige,80%)
|
||||
$navbar-default-brand-color: lighten($green, 20%)
|
||||
|
||||
// Top nav collapse threshold
|
||||
|
||||
@@ -40,6 +40,19 @@ h3
|
||||
.main
|
||||
padding-right: 1em
|
||||
|
||||
.navbar .navbar-form
|
||||
padding-top: 0
|
||||
padding-bottom: 0
|
||||
margin-right: 0
|
||||
margin-left: 15px
|
||||
border: 0
|
||||
-webkit-box-shadow: none
|
||||
box-shadow: none
|
||||
|
||||
.img-responsive
|
||||
max-width: 100%
|
||||
height: auto
|
||||
|
||||
.sidebar
|
||||
border-left: 1px solid darken($beige, 10%)
|
||||
margin-left: -1px
|
||||
@@ -93,12 +106,45 @@ p.stats
|
||||
padding-left: 1em
|
||||
width: 15em
|
||||
|
||||
.planting
|
||||
dl.planting-attributes
|
||||
font-size: 85%
|
||||
|
||||
dt
|
||||
text-align: left
|
||||
dd
|
||||
margin-left: auto
|
||||
|
||||
@media (min-width: $screen-md-min)
|
||||
.planting-thumbnail
|
||||
dl.planting-attributes
|
||||
font-size: 85%
|
||||
width: 100%
|
||||
|
||||
dt
|
||||
text-align: left
|
||||
width: 80px
|
||||
dd
|
||||
padding-left: 80px
|
||||
margin-left: auto
|
||||
|
||||
.navbar .navbar-form
|
||||
width: 250px
|
||||
|
||||
|
||||
#placesmap, #cropmap
|
||||
height: 500px
|
||||
|
||||
#membermap
|
||||
height: 250px
|
||||
|
||||
.location-not-set
|
||||
height: 250px
|
||||
width: 100%
|
||||
background-image: image-url('location-not-set.en.png')
|
||||
background-repeat: no-repeat
|
||||
background-position: center
|
||||
|
||||
.member-location
|
||||
font-size: small
|
||||
font-style: italic
|
||||
@@ -222,23 +268,10 @@ html, body
|
||||
|
||||
// Autosuggest
|
||||
|
||||
.ui-autocomplete
|
||||
.ui-autocomplete
|
||||
background: white
|
||||
z-index: $zindex-tooltip
|
||||
|
||||
// Crowdfunding campaign, Sep-Oct 2014
|
||||
|
||||
.crowdfunding-banner
|
||||
text-align: center
|
||||
font-weight: bold
|
||||
background-color: lighten($green, 30%)
|
||||
margin-top: 0px
|
||||
margin-bottom: 5px
|
||||
padding: 15px
|
||||
|
||||
.crowdfunding-banner a
|
||||
color: $brown
|
||||
text-decoration: underline
|
||||
|
||||
.alert
|
||||
a
|
||||
font-weight: 800
|
||||
@@ -257,6 +290,11 @@ html, body
|
||||
.navbar .nav > li
|
||||
display: block
|
||||
|
||||
.navbar .navbar-form
|
||||
width: 185px
|
||||
padding-left: 0
|
||||
padding-right: 0
|
||||
|
||||
/* override "info" alert boxes to be green, not blue, on Growstuff */
|
||||
$state-info-text: darken($green, 10%)
|
||||
$state-info-bg: lighten($green, 50%)
|
||||
@@ -276,6 +314,11 @@ $state-success-bg: lighten($green, 50%)
|
||||
.panel-footer
|
||||
height: 6em
|
||||
|
||||
.panel
|
||||
.dl-horizontal
|
||||
text-overflow: ellipsis
|
||||
overflow: hidden
|
||||
|
||||
#gardens_panel_body
|
||||
height: 20em
|
||||
|
||||
@@ -288,3 +331,8 @@ $state-success-bg: lighten($green, 50%)
|
||||
|
||||
.red
|
||||
color: red
|
||||
|
||||
.truncate
|
||||
overflow: hidden
|
||||
text-overflow: ellipsis
|
||||
white-space: nowrap
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
class AboutController < ApplicationController
|
||||
end
|
||||
@@ -13,17 +13,6 @@ class AlternateNamesController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
# GET /alternate_names/1
|
||||
# GET /alternate_names/1.json
|
||||
def show
|
||||
@alternate_name = AlternateName.find(params[:id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # show.html.haml
|
||||
format.json { render json: @alternate_name }
|
||||
end
|
||||
end
|
||||
|
||||
# GET /alternate_names/new
|
||||
# GET /alternate_names/new.json
|
||||
def new
|
||||
|
||||
@@ -52,7 +52,7 @@ class ApplicationController < ActionController::Base
|
||||
protected
|
||||
|
||||
def configure_permitted_parameters
|
||||
devise_parameter_sanitizer.for(:sign_up) do |member|
|
||||
devise_parameter_sanitizer.permit(:sign_up) do |member|
|
||||
member.permit(:login_name, :email, :password, :password_confirmation,
|
||||
:remember_me, :login,
|
||||
# terms of service
|
||||
@@ -64,7 +64,7 @@ class ApplicationController < ActionController::Base
|
||||
)
|
||||
end
|
||||
|
||||
devise_parameter_sanitizer.for(:account_update) do |member|
|
||||
devise_parameter_sanitizer.permit(:account_update) do |member|
|
||||
member.permit(:login_name, :email, :password, :password_confirmation,
|
||||
:remember_me, :login,
|
||||
# terms of service
|
||||
|
||||
@@ -14,17 +14,6 @@ class CommentsController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
# GET /comments/1
|
||||
# GET /comments/1.json
|
||||
def show
|
||||
@comment = Comment.find(params[:id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # show.html.erb
|
||||
format.json { render json: @comment }
|
||||
end
|
||||
end
|
||||
|
||||
# GET /comments/new
|
||||
# GET /comments/new.json
|
||||
def new
|
||||
|
||||
@@ -83,8 +83,16 @@ class CropsController < ApplicationController
|
||||
respond_to do |format|
|
||||
format.html # show.html.haml
|
||||
format.json do
|
||||
# TODO RABL or similar one day to avoid presentation logic here
|
||||
owner_structure = {
|
||||
owner: {
|
||||
only: [:id, :login_name, :location, :latitude, :longitude]
|
||||
}
|
||||
}
|
||||
render json: @crop.to_json(include: {
|
||||
plantings: { include: { owner: { only: [:id, :login_name, :location, :latitude, :longitude] }}}
|
||||
plantings: {
|
||||
include: owner_structure
|
||||
}
|
||||
})
|
||||
end
|
||||
end
|
||||
@@ -136,7 +144,7 @@ class CropsController < ApplicationController
|
||||
end
|
||||
unless current_member.has_role? :crop_wrangler
|
||||
Role.crop_wranglers.each do |w|
|
||||
Notifier.new_crop_request(w, @crop).deliver!
|
||||
Notifier.new_crop_request(w, @crop).deliver_now!
|
||||
end
|
||||
end
|
||||
|
||||
@@ -180,8 +188,8 @@ class CropsController < ApplicationController
|
||||
if previous_status == "pending"
|
||||
requester = @crop.requester
|
||||
new_status = @crop.approval_status
|
||||
Notifier.crop_request_approved(requester, @crop).deliver! if new_status == "approved"
|
||||
Notifier.crop_request_rejected(requester, @crop).deliver! if new_status == "rejected"
|
||||
Notifier.crop_request_approved(requester, @crop).deliver_now! if new_status == "approved"
|
||||
Notifier.crop_request_rejected(requester, @crop).deliver_now! if new_status == "rejected"
|
||||
end
|
||||
format.html { redirect_to @crop, notice: 'Crop was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
|
||||
@@ -27,17 +27,6 @@ class HarvestsController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
# GET /harvests/1
|
||||
# GET /harvests/1.json
|
||||
def show
|
||||
@harvest = Harvest.find(params[:id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # show.html.erb
|
||||
format.json { render json: @harvest }
|
||||
end
|
||||
end
|
||||
|
||||
# GET /harvests/new
|
||||
# GET /harvests/new.json
|
||||
def new
|
||||
|
||||
6
app/controllers/pages_controller.rb
Normal file
6
app/controllers/pages_controller.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
class PagesController < ApplicationController
|
||||
def letsencrypt
|
||||
# use your code here, not mine
|
||||
render text: "y9KNck8wqkoQLnlr2RgA2TVwWtyYb4PeY_hzGNx0Tfs.dlIPqFhMDCLyQEccczY3roHZ1UWu6UqVeyb9mkRxheU"
|
||||
end
|
||||
end
|
||||
@@ -13,17 +13,6 @@ class PhotosController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
# GET /photos/1
|
||||
# GET /photos/1.json
|
||||
def show
|
||||
@photo = Photo.find(params[:id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # show.html.erb
|
||||
format.json { render json: @photo }
|
||||
end
|
||||
end
|
||||
|
||||
# GET /photos/new
|
||||
# GET /photos/new.json
|
||||
def new
|
||||
@@ -63,35 +52,29 @@ class PhotosController < ApplicationController
|
||||
@photo.owner_id = current_member.id
|
||||
@photo.set_flickr_metadata
|
||||
|
||||
# several models can have photos. we need to know what model and the id
|
||||
# for the entry to attach the photo to
|
||||
valid_models = ["planting", "harvest", "garden"]
|
||||
if params[:type]
|
||||
if valid_models.include?(params[:type])
|
||||
if params[:id]
|
||||
item = params[:type].camelcase.constantize.find_by_id(params[:id])
|
||||
if item
|
||||
if item.owner.id == current_member.id
|
||||
# This syntax is weird, so just know that it means this:
|
||||
# @photo.harvests << item unless @photo.harvests.include?(item)
|
||||
# but with the correct many-to-many relationship automatically referenced
|
||||
(@photo.send "#{params[:type]}s") << item unless (@photo.send "#{params[:type]}s").include?(item)
|
||||
else
|
||||
flash[:alert] = "You must own both the #{params[:type]} and the photo."
|
||||
end
|
||||
else
|
||||
flash[:alert] = "Couldn't find #{params[:type]} to connect to photo."
|
||||
end
|
||||
else
|
||||
flash[:alert] = "Missing id parameter"
|
||||
end
|
||||
|
||||
collection = case params[:type]
|
||||
when 'garden'
|
||||
@photo.gardens
|
||||
when 'planting'
|
||||
@photo.plantings
|
||||
when 'harvest'
|
||||
@photo.harvests
|
||||
else
|
||||
nil
|
||||
end
|
||||
|
||||
if collection && has_item_id
|
||||
item = params[:type].camelcase.constantize.find_by_id(params[:id])
|
||||
if item && member_owns_item(item)
|
||||
collection << item unless collection.include?(item)
|
||||
else
|
||||
flash[:alert] = "Cannot attach photos to #{params[:type]}"
|
||||
flash[:alert] = "Could not find this item owned by you"
|
||||
end
|
||||
else
|
||||
flash[:alert] = "Missing type parameter"
|
||||
else
|
||||
flash[:alert] = "Missing or invalid type or id parameter"
|
||||
end
|
||||
|
||||
|
||||
respond_to do |format|
|
||||
if @photo.save
|
||||
format.html { redirect_to @photo, notice: 'Photo was successfully added.' }
|
||||
@@ -134,6 +117,14 @@ class PhotosController < ApplicationController
|
||||
|
||||
private
|
||||
|
||||
def has_item_id
|
||||
params.key? :id
|
||||
end
|
||||
|
||||
def member_owns_item(item)
|
||||
item.owner.id == current_member.id
|
||||
end
|
||||
|
||||
def photo_params
|
||||
params.require(:photo).permit(:flickr_photo_id, :owner_id, :title, :license_name,
|
||||
:license_url, :thumbnail_url, :fullsize_url, :link_url)
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
class PolicyController < ApplicationController
|
||||
end
|
||||
9
app/controllers/sessions_controller.rb
Normal file
9
app/controllers/sessions_controller.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
class SessionsController < Devise::SessionsController
|
||||
def create
|
||||
super do |resource|
|
||||
if Crop.pending_approval.present? && current_member.has_role?(:crop_wrangler)
|
||||
flash[:alert] = "There are crops waiting to be wrangled."
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,2 +0,0 @@
|
||||
class SupportController < ApplicationController
|
||||
end
|
||||
@@ -19,10 +19,24 @@ module ApplicationHelper
|
||||
pid = price_in_dollars(price)
|
||||
currency = Growstuff::Application.config.currency
|
||||
link = "http://www.wolframalpha.com/input/?i=#{pid}+#{currency}"
|
||||
return link_to "(convert)",
|
||||
link,
|
||||
target: "_blank"
|
||||
end
|
||||
|
||||
link_to "(convert)", link, target: "_blank", rel: "noopener noreferrer"
|
||||
end
|
||||
|
||||
def build_alert_classes(alert_type = :info)
|
||||
classes = 'alert alert-dismissable '
|
||||
case alert_type.to_sym
|
||||
when :alert, :danger, :error, :validation_errors
|
||||
classes += 'alert-danger'
|
||||
when :warning, :todo
|
||||
classes += 'alert-warning'
|
||||
when :notice, :success
|
||||
classes += 'alert-success'
|
||||
when :info
|
||||
classes += 'alert-info'
|
||||
end
|
||||
classes
|
||||
end
|
||||
|
||||
# Produces a cache key for uniquely identifying cached fragments.
|
||||
def cache_key_for(klass, identifier="all")
|
||||
@@ -50,5 +64,13 @@ module ApplicationHelper
|
||||
default: :identicon
|
||||
})
|
||||
end
|
||||
|
||||
# Returns a string with the quantity and the right pluralization for a
|
||||
# given collection and model.
|
||||
def localize_plural(collection, model)
|
||||
size = collection.size
|
||||
model_name = model.model_name.human(count: size)
|
||||
"#{size} #{model_name}"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,17 +1,21 @@
|
||||
module CropsHelper
|
||||
def display_seed_availability(member, crop)
|
||||
total_quantity = 0
|
||||
member.seeds.each do |seed|
|
||||
if seed.crop.name == crop.name
|
||||
total_quantity = total_quantity + seed.quantity
|
||||
end
|
||||
|
||||
seeds = member.seeds.select {|seed| seed.crop.name == crop.name }
|
||||
|
||||
seeds.each do |seed|
|
||||
total_quantity = total_quantity + seed.quantity if seed.quantity
|
||||
end
|
||||
|
||||
if !seeds.any?
|
||||
return "You don't have any seeds of this crop."
|
||||
end
|
||||
|
||||
if (total_quantity != 0)
|
||||
"You have #{pluralize(total_quantity, "seed")} of this crop."
|
||||
"You have #{total_quantity} #{Seed.model_name.human(count: total_quantity)} of this crop."
|
||||
else
|
||||
"You don't have any seeds of this crop."
|
||||
"You have an unknown quantity of seeds of this crop."
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -41,7 +41,7 @@ module HarvestsHelper
|
||||
if harvest.description.empty?
|
||||
"No description provided."
|
||||
else
|
||||
truncate(harvest.description, length: 130, separator: ' ', omission: '... ') { link_to "Read more", harvest_path(harvest) }
|
||||
harvest.description
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -2,12 +2,10 @@ class Notifier < ActionMailer::Base
|
||||
include NotificationsHelper
|
||||
default from: "Growstuff <noreply@growstuff.org>"
|
||||
|
||||
def verifier()
|
||||
if ENV['RAILS_SECRET_TOKEN']
|
||||
return ActiveSupport::MessageVerifier.new(ENV['RAILS_SECRET_TOKEN'])
|
||||
else
|
||||
raise "RAILS_SECRET_TOKEN environment variable not set - have you created config/application.yml?"
|
||||
end
|
||||
def verifier
|
||||
raise "RAILS_SECRET_TOKEN environment variable not set - have you created config/application.yml?" unless ENV['RAILS_SECRET_TOKEN']
|
||||
|
||||
return ActiveSupport::MessageVerifier.new(ENV['RAILS_SECRET_TOKEN'])
|
||||
end
|
||||
|
||||
def notify(notification)
|
||||
|
||||
@@ -128,7 +128,11 @@ class Crop < ActiveRecord::Base
|
||||
# later we can choose a default photo based on different criteria,
|
||||
# eg. popularity
|
||||
def default_photo
|
||||
return photos.first
|
||||
return photos.first if photos.any?
|
||||
|
||||
# Crop has no photos? Look for the most recent harvest with a photo.
|
||||
harvest_with_photo = Harvest.where(crop_id: id).joins(:photos).order('harvests.id DESC').limit(1).first
|
||||
return harvest_with_photo.photos.first if harvest_with_photo
|
||||
end
|
||||
|
||||
# crop.sunniness
|
||||
@@ -206,7 +210,7 @@ class Crop < ActiveRecord::Base
|
||||
# returns a list of interesting crops, for use on the homepage etc
|
||||
def Crop.interesting
|
||||
howmany = 12 # max number to find
|
||||
interesting_crops = Array.new
|
||||
interesting_crops = []
|
||||
Crop.includes(:photos).randomized.each do |c|
|
||||
break if interesting_crops.size == howmany
|
||||
next unless c.interesting?
|
||||
|
||||
@@ -132,7 +132,7 @@ class Harvest < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def default_photo
|
||||
return photos.first
|
||||
return photos.first || crop.default_photo
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -130,7 +130,7 @@ class Member < ActiveRecord::Base
|
||||
def is_paid?
|
||||
if account.account_type.is_permanent_paid
|
||||
return true
|
||||
elsif account.account_type.is_paid and account.paid_until >= Time.zone.now
|
||||
elsif account.account_type.is_paid && account.paid_until >= Time.zone.now
|
||||
return true
|
||||
else
|
||||
return false
|
||||
@@ -200,7 +200,7 @@ class Member < ActiveRecord::Base
|
||||
|
||||
def Member.interesting
|
||||
howmany = 12 # max number to find
|
||||
interesting_members = Array.new
|
||||
interesting_members = []
|
||||
Member.confirmed.located.recently_signed_in.each do |m|
|
||||
break if interesting_members.size == howmany
|
||||
if m.interesting?
|
||||
@@ -222,7 +222,7 @@ class Member < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def update_newsletter_subscription
|
||||
if confirmed_at_changed? and newsletter # just signed up
|
||||
if confirmed_at_changed? && newsletter # just signed up
|
||||
newsletter_subscribe
|
||||
elsif confirmed_at # i.e. after member's confirmed their account
|
||||
if newsletter_changed? # edited member settings
|
||||
@@ -239,7 +239,7 @@ class Member < ActiveRecord::Base
|
||||
return true if (Rails.env.test? && !testing)
|
||||
gb = Gibbon::API.new
|
||||
res = gb.lists.subscribe({
|
||||
id: Gibbon::API.api_key,
|
||||
id: Growstuff::Application.config.newsletter_list_id,
|
||||
email: { email: email },
|
||||
merge_vars: { login_name: login_name },
|
||||
double_optin: false # they already confirmed their email with us
|
||||
@@ -250,7 +250,7 @@ class Member < ActiveRecord::Base
|
||||
return true if (Rails.env.test? && !testing)
|
||||
gb = Gibbon::API.new
|
||||
res = gb.lists.unsubscribe({
|
||||
id: ENV['GROWSTUFF_MAILCHIMP_NEWSLETTER_ID'],
|
||||
id: Growstuff::Application.config.newsletter_list_id,
|
||||
email: { email: email }
|
||||
})
|
||||
end
|
||||
|
||||
@@ -23,7 +23,7 @@ class Notification < ActiveRecord::Base
|
||||
|
||||
def send_email
|
||||
if self.recipient.send_notification_email
|
||||
Notifier.notify(self).deliver
|
||||
Notifier.notify(self).deliver_now
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ class Planting < ActiveRecord::Base
|
||||
|
||||
# check that any finished_at date occurs after planted_at
|
||||
def finished_must_be_after_planted
|
||||
return unless planted_at and finished_at # only check if we have both
|
||||
return unless planted_at && finished_at # only check if we have both
|
||||
errors.add(:finished_at, "must be after the planting date") unless planted_at < finished_at
|
||||
end
|
||||
|
||||
@@ -97,7 +97,7 @@ class Planting < ActiveRecord::Base
|
||||
def calculate_days_before_maturity(planting, crop)
|
||||
p_crop = Planting.where(crop_id: crop).where.not(id: planting)
|
||||
differences = p_crop.collect do |p|
|
||||
if p.finished and !p.finished_at.nil?
|
||||
if p.finished && !p.finished_at.nil?
|
||||
(p.finished_at - p.planted_at).to_i
|
||||
end
|
||||
end
|
||||
@@ -133,7 +133,7 @@ class Planting < ActiveRecord::Base
|
||||
# we can't do this via a scope (as far as we know) so sadly we have to
|
||||
# do it this way.
|
||||
def Planting.interesting(howmany=12, require_photo=true)
|
||||
interesting_plantings = Array.new
|
||||
interesting_plantings = []
|
||||
seen_owners = Hash.new(false) # keep track of which owners we've seen already
|
||||
|
||||
Planting.includes(:photos).each do |p|
|
||||
|
||||
@@ -11,17 +11,17 @@ class Post < ActiveRecord::Base
|
||||
# from this direction, so we won't set up an association for now.
|
||||
|
||||
after_create do
|
||||
recipients = Array.new
|
||||
recipients = []
|
||||
sender = self.author.id
|
||||
self.body.scan(Haml::Filters::GrowstuffMarkdown::MEMBER_REGEX) do |m|
|
||||
# find member case-insensitively and add to list of recipients
|
||||
member = Member.where('lower(login_name) = ?', $1.downcase).first
|
||||
recipients << member if member and not recipients.include?(member)
|
||||
recipients << member if member && !recipients.include?(member)
|
||||
end
|
||||
self.body.scan(Haml::Filters::GrowstuffMarkdown::MEMBER_AT_REGEX) do |m|
|
||||
# find member case-insensitively and add to list of recipients
|
||||
member = Member.where('lower(login_name) = ?', $1[1..-1].downcase).first
|
||||
recipients << member if member and not recipients.include?(member)
|
||||
recipients << member if member && !recipients.include?(member)
|
||||
end
|
||||
# don't send notifications to yourself
|
||||
recipients.map{ |r| r.id }.each do |recipient|
|
||||
@@ -64,7 +64,7 @@ class Post < ActiveRecord::Base
|
||||
|
||||
# return posts sorted by recent activity
|
||||
def Post.recently_active
|
||||
Post.all.sort do |a,b|
|
||||
Post.all.sort do |a, b|
|
||||
b.recent_activity <=> a.recent_activity
|
||||
end
|
||||
end
|
||||
@@ -77,7 +77,7 @@ class Post < ActiveRecord::Base
|
||||
# find crop case-insensitively
|
||||
crop = Crop.where('lower(name) = ?', $1.downcase).first
|
||||
# create association
|
||||
self.crops << crop if crop and not self.crops.include?(crop)
|
||||
self.crops << crop if crop && !self.crops.include?(crop)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -79,7 +79,7 @@ class Seed < ActiveRecord::Base
|
||||
# returns a list of interesting seeds, for use on the homepage etc
|
||||
def Seed.interesting
|
||||
howmany = 12 # max number to find
|
||||
interesting_seeds = Array.new
|
||||
interesting_seeds = []
|
||||
|
||||
Seed.tradable.each do |s|
|
||||
break if interesting_seeds.size == howmany
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
-content_for :title, 'Contact'
|
||||
|
||||
%dl
|
||||
%dt General contact email
|
||||
%dd= link_to 'info@growstuff.org', 'mailto:info@growstuff.org'
|
||||
%dl
|
||||
%dt
|
||||
Support and accounts enquiries (not covered by the
|
||||
=succeed ")" do
|
||||
=link_to 'FAQ', url_for(:controller => '/support')
|
||||
%dd= link_to 'support@growstuff.org', 'mailto:support@growstuff.org'
|
||||
%dl
|
||||
%dt Media/Press enquiries
|
||||
%dd= link_to 'media@growstuff.org', 'mailto:media@growstuff.org'
|
||||
%dl
|
||||
%dt Twitter
|
||||
%dd= link_to '@growstufforg', 'http://twitter.com/growstufforg'
|
||||
@@ -1,3 +1,10 @@
|
||||
= content_for :title, @alternate_name.name
|
||||
- content_for :opengraph do
|
||||
= tag("meta", property: "og:title", content: @alternate_name.name)
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
%p#notice= notice
|
||||
|
||||
= render :partial => 'crops/approval_status_message', :locals => { :crop => @alternate_name.crop }
|
||||
|
||||
@@ -5,10 +5,13 @@
|
||||
= render :partial => "members/avatar", :locals => { :member => comment.author }
|
||||
.col-md-11
|
||||
.comment-meta
|
||||
= (comment.created_at == comment.updated_at) ? 'Posted by' : 'Edited by'
|
||||
Posted by
|
||||
= link_to comment.author.login_name, member_path(comment.author)
|
||||
on
|
||||
= (comment.created_at == comment.updated_at) ? comment.created_at : comment.updated_at
|
||||
= comment.created_at
|
||||
- if comment.updated_at > comment.created_at
|
||||
and edited at
|
||||
= comment.updated_at
|
||||
|
||||
.comment-body
|
||||
:growstuff_markdown
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
= content_for :title, "Recent comments"
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @comments, :model => "comments"
|
||||
= page_entries_info @comments
|
||||
= will_paginate @comments
|
||||
|
||||
- @comments.each do |comment|
|
||||
@@ -11,7 +11,7 @@
|
||||
= render :partial => "single", :locals => { :comment => comment }
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @comments, :model => "comments"
|
||||
= page_entries_info @comments
|
||||
= will_paginate @comments
|
||||
|
||||
%p
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
= content_for :title, @comment.post.subject
|
||||
- content_for :opengraph do
|
||||
= tag("meta", property: "og:image", content: avatar_uri(@comment.post.author, 200))
|
||||
= tag("meta", property: "og:image:user_generated", content: "true")
|
||||
= tag("meta", property: "og:title", content: @comment.post.subject)
|
||||
= tag("meta", property: "og:description", content: strip_tags(@comment.post.body).split(' ')[0..20].join(' '))
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
= render :partial => "posts/single", :locals => { :post => @comment.post }
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
%h4 Find #{ crop.name } seeds
|
||||
- if crop.seeds.empty?
|
||||
%p
|
||||
There are no seeds available to trade.
|
||||
There are no seeds available to trade on Growstuff right now.
|
||||
- else
|
||||
%ul
|
||||
- crop.seeds.tradable.each do |seed|
|
||||
@@ -10,6 +10,8 @@
|
||||
= render :partial => 'members/location', :locals => { :member => seed.owner }
|
||||
%p
|
||||
= link_to "View all #{crop.name} seeds", seeds_by_crop_path(crop)
|
||||
%p
|
||||
= link_to "Purchase seeds via Ebay", "http://rover.ebay.com/rover/1/705-53470-19255-0/1?icep_ff3=9&pub=5575213277&toolid=10001&campid=5337940151&customid=&icep_uq=#{URI.escape crop.name}&icep_sellerId=&icep_ex_kw=&icep_sortBy=12&icep_catId=181003&icep_minPrice=&icep_maxPrice=&ipn=psmain&icep_vectorid=229515&kwid=902099&mtid=824&kw=lg", target: "_blank", rel: "noopener noreferrer"
|
||||
- if crop.approved?
|
||||
- if current_member
|
||||
%p= link_to "List #{crop.name} seeds to trade", new_seed_path(:crop_id => crop.id)
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
- content_for :title, @crop.name
|
||||
- content_for :subtitle, @crop.default_scientific_name
|
||||
- content_for :opengraph do
|
||||
- @crop.photos.each do |photo|
|
||||
= tag("meta", property: "og:image", content: photo.fullsize_url)
|
||||
= tag("meta", property: "og:title", content: @crop.name)
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
= render :partial => 'approval_status_message', :locals => { :crop => @crop }
|
||||
|
||||
@@ -54,13 +61,13 @@
|
||||
= render :partial => "shared/signin_signup", :locals => { :to => "post your tips and experiences growing #{ @crop.name.pluralize }" }
|
||||
- else
|
||||
%div.pagination
|
||||
= page_entries_info @posts, :model => "posts"
|
||||
= page_entries_info @posts
|
||||
= will_paginate @posts, :params => {:anchor => "posts"}
|
||||
- @posts.each do |post|
|
||||
= render :partial => "posts/single", :locals => { :post => post, :subject => true }
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @posts, :model => "posts"
|
||||
= page_entries_info @posts
|
||||
= will_paginate @posts, :params => {:anchor => "posts"}
|
||||
|
||||
.col-md-3
|
||||
@@ -84,4 +91,9 @@
|
||||
|
||||
%h4 Learn more about #{ @crop.name.pluralize }
|
||||
%ul
|
||||
%li= link_to 'Wikipedia (English)', @crop.en_wikipedia_url
|
||||
%li= link_to 'Wikipedia (English)', @crop.en_wikipedia_url, target: "_blank", rel: "noopener noreferrer"
|
||||
%li
|
||||
= link_to "Gardenate - Planting reminders", "http://www.gardenate.com/plant/#{URI.escape @crop.name}", target: "_blank", rel: "noopener noreferrer"
|
||||
- if current_member && current_member.location
|
||||
%li
|
||||
= link_to "Google", "http://www.google.com/search?q=#{URI.escape ["Growing", @crop.name, current_member.location].join(" ")}", target: "_blank", rel: "noopener noreferrer"
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @crops, :model => "crops"
|
||||
= page_entries_info @crops
|
||||
= will_paginate @crops
|
||||
|
||||
%table{:class => "table table-striped", :id => @approval_status.blank? ? 'recently-added-crops' : "#{@approval_status}-crops"}
|
||||
@@ -64,7 +64,7 @@
|
||||
ago.
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @crops, :model => "crops"
|
||||
= page_entries_info @crops
|
||||
= will_paginate @crops
|
||||
|
||||
|
||||
|
||||
@@ -13,4 +13,6 @@
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit "Resend confirmation instructions", :class => 'btn btn-primary'
|
||||
|
||||
= render "devise/shared/links"
|
||||
.form-group
|
||||
.col-md-offset-2.col-md-8
|
||||
= render "devise/shared/links"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
%p
|
||||
We'd also appreciate it if you'd read our
|
||||
= succeed "," do
|
||||
= link_to 'Community Guidelines', url_for(:controller => '/policy', :action => 'community', :only_path => false)
|
||||
= link_to 'Community Guidelines', "#{root_url}/policy/community"
|
||||
and make sure you follow them. We want #{site_name} to be a
|
||||
friendly, welcoming environment for everyone, and we hope you'll
|
||||
help us keep it that way.
|
||||
|
||||
@@ -11,4 +11,6 @@
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit "Send me reset password instructions", :class => 'btn btn-primary'
|
||||
|
||||
= render "devise/shared/links"
|
||||
.form-group
|
||||
.col-md-offset-2.col-md-8
|
||||
= render "devise/shared/links"
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
= f.check_box :tos_agreement
|
||||
I agree to the
|
||||
= succeed "." do
|
||||
= link_to 'Terms of Service', url_for(:action => 'tos', :controller => '/policy')
|
||||
= link_to 'Terms of Service', "#{root_url}/policy/tos"
|
||||
.form-group
|
||||
.col-md-offset-2.col-md-8.checkbox
|
||||
%label
|
||||
|
||||
@@ -11,4 +11,6 @@
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit "Resend unlock instructions", :class => 'btn btn-primary'
|
||||
|
||||
= render "devise/shared/links"
|
||||
.form-group
|
||||
.col-md-offset-2.col-md-8
|
||||
= render "devise/shared/links"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
- @forums.each do |forum|
|
||||
%h2= forum
|
||||
%p
|
||||
= pluralize(forum.posts.size, "post")
|
||||
= localize_plural(forum.posts, Post)
|
||||
|
|
||||
=link_to "Visit forum", forum
|
||||
|
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
- content_for :title, @forum.name
|
||||
- content_for :opengraph do
|
||||
- if @forum.description
|
||||
= tag("meta", property: "og:description", content: strip_tags(@forum.description).split(' ')[0..20].join(' '))
|
||||
= tag("meta", property: "og:title", content: @forum.name)
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
%p#notice= notice
|
||||
|
||||
|
||||
@@ -16,15 +16,16 @@
|
||||
.form-group
|
||||
= f.label :description, :class => 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_area :description, :rows => 6, :class => 'form-control', :placeholder => 'optional'
|
||||
= f.text_area :description, :rows => 6, :class => 'form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
|
||||
.form-group
|
||||
= f.label :location, :class => 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_field :location, :value => @garden.location || current_member.location, :class => 'form-control', :placeholder => 'optional', :maxlength => 255
|
||||
= f.text_field :location, :value => @garden.location || current_member.location, :class => 'form-control', :maxlength => 255
|
||||
= render :partial => 'shared/form_optional'
|
||||
%span.help-block
|
||||
If you have a location set in your profile, it will be used when
|
||||
you create a new garden.
|
||||
= t('.location_helper')
|
||||
- if current_member.location.blank?
|
||||
=link_to "Set your location now.", edit_member_registration_path
|
||||
- else
|
||||
@@ -33,7 +34,8 @@
|
||||
.form-group
|
||||
= f.label :area, :class => 'control-label col-md-2'
|
||||
.col-md-2
|
||||
= f.number_field :area, :class => 'input-small form-control', :placeholder => 'optional'
|
||||
= f.number_field :area, :class => 'input-small form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
.col-md-2
|
||||
= f.select(:area_unit, Garden::AREA_UNITS_VALUES, {:include_blank => false}, :class => 'form-control')
|
||||
|
||||
|
||||
@@ -18,14 +18,14 @@
|
||||
- if garden.location.blank?
|
||||
not specified
|
||||
- else
|
||||
= link_to garden.location, place_path(garden.location)
|
||||
= link_to garden.location, place_path(garden.location, anchor: "gardens")
|
||||
%dt Area :
|
||||
%dd= garden.area.nil? ? "not specified" : pluralize(garden.area, garden.area_unit)
|
||||
%dt Active? :
|
||||
%dd= garden.active ? "Yes" : "No"
|
||||
.col-md-12
|
||||
%b
|
||||
= "#{pluralize(garden.plantings.size, "Planting")} : "
|
||||
= "#{localize_plural(garden.plantings, Planting)} : "
|
||||
= display_garden_plantings(garden.plantings.current)
|
||||
- if garden.plantings.size > 2
|
||||
%br
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
= render :partial => 'shared/signin_signup', :locals => { :to => 'add a new garden' }
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @gardens, :model => "gardens"
|
||||
= page_entries_info @gardens
|
||||
= will_paginate @gardens
|
||||
|
||||
.row
|
||||
@@ -27,6 +27,6 @@
|
||||
%p There are no gardens to display.
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @gardens, :model => "gardens"
|
||||
= page_entries_info @gardens
|
||||
= will_paginate @gardens
|
||||
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
=content_for :title, "#{@garden.owner}'s #{@garden}"
|
||||
|
||||
- content_for :opengraph do
|
||||
- @garden.photos.each do |photo|
|
||||
= tag("meta", property: "og:image", content: photo.fullsize_url)
|
||||
- if @garden.description
|
||||
= tag("meta", property: "og:description", content: @garden.description)
|
||||
= tag("meta", property: "og:title", content: "#{@garden.owner}'s #{@garden}")
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
.row
|
||||
.col-md-9
|
||||
- if can? :edit, @garden or can? :delete, @garden
|
||||
@@ -39,7 +47,7 @@
|
||||
- if @garden.photos.size > 0 or (can? :edit, @garden and can? :create, Photo)
|
||||
.row-fluid
|
||||
%h3 Photos
|
||||
%p= pluralize(@garden.photos.length, "photo")
|
||||
%p= localize_plural(@garden.photos, Photo)
|
||||
.row-fluid
|
||||
%ul.thumbnails
|
||||
- @garden.photos.each do |p|
|
||||
|
||||
@@ -19,9 +19,10 @@
|
||||
= link_to "Request new crops.", new_crop_path
|
||||
|
||||
.form-group
|
||||
= f.label :harvested_at, 'When?', :class => 'control-label col-md-2', :placeholder => 'optional'
|
||||
= f.label :harvested_at, 'When?', :class => 'control-label col-md-2'
|
||||
.col-md-2
|
||||
= f.text_field :harvested_at, :value => @harvest.harvested_at ? @harvest.harvested_at.to_s(:ymd) : '', :class => 'add-datepicker form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
|
||||
.form-group
|
||||
= f.label :quantity, 'How many?', :class => 'control-label col-md-2'
|
||||
@@ -29,20 +30,23 @@
|
||||
-# Some browsers (eg Firefox for Android) assume "number" means
|
||||
-# "integer" unless you specify step="any":
|
||||
-# http://blog.isotoma.com/2012/03/html5-input-typenumber-and-decimalsfloats-in-chrome/
|
||||
= f.number_field :quantity, :class => 'input-small', :step => 'any', :class => 'form-control', :placeholder => 'optional'
|
||||
= f.number_field :quantity, :class => 'input-small form-control', :step => 'any'
|
||||
= render :partial => 'shared/form_optional'
|
||||
.col-md-2
|
||||
= f.select(:unit, Harvest::UNITS_VALUES, {:include_blank => false}, :class => 'input-medium form-control')
|
||||
|
||||
.form-group
|
||||
= f.label :weight_quantity, 'Weighing (in total):', :class => 'control-label col-md-2'
|
||||
.col-md-2
|
||||
= f.number_field :weight_quantity, :class => 'input-small form-control', :step => 'any', :placeholder => 'optional'
|
||||
= f.number_field :weight_quantity, :class => 'input-small form-control', :step => 'any'
|
||||
= render :partial => 'shared/form_optional'
|
||||
.col-md-2
|
||||
= f.select(:weight_unit, Harvest::WEIGHT_UNITS_VALUES, {:include_blank => false}, :class => 'form-control')
|
||||
.form-group
|
||||
= f.label :description, 'Notes', :class => 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_area :description, :rows => 6, :class => 'form-control', :placeholder => 'optional'
|
||||
= f.text_area :description, :rows => 6, :class => 'form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
.panel-body
|
||||
.row
|
||||
.col-md-4
|
||||
= link_to image_tag((harvest.crop.default_photo ? harvest.crop.default_photo.thumbnail_url : 'placeholder_150.png'), :alt => harvest.crop.name, :class => 'img'), harvest.crop
|
||||
= link_to image_tag((harvest.default_photo ? harvest.default_photo.thumbnail_url : 'placeholder_150.png'), :alt => harvest.crop.name, :class => 'img'), harvest.crop
|
||||
.col-md-8
|
||||
%dl.dl-horizontal
|
||||
%dt Crop :
|
||||
@@ -21,5 +21,7 @@
|
||||
%dd= harvest.harvested_at
|
||||
.panel-footer
|
||||
%dt Description
|
||||
%dd
|
||||
%dd.truncate
|
||||
= display_harvest_description(harvest)
|
||||
= if not harvest.description.empty?
|
||||
- link_to "Read more", harvest_path(harvest)
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
= render :partial => 'shared/signin_signup', :locals => { :to => 'track your harvests' }
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @harvests, :model => "harvests"
|
||||
= page_entries_info @harvests
|
||||
= will_paginate @harvests
|
||||
.row
|
||||
- if @harvests.size > 0
|
||||
@@ -30,7 +30,7 @@
|
||||
=render :partial => 'harvests/thumbnail', :locals => {:harvest => harvest}
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @harvests, :model => "harvests"
|
||||
= page_entries_info @harvests
|
||||
= will_paginate @harvests
|
||||
|
||||
%ul.list-inline
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
=content_for :title, "#{@harvest.crop} harvested by #{@harvest.owner}"
|
||||
- content_for :opengraph do
|
||||
- @harvest.photos.each do |photo|
|
||||
= tag("meta", property: "og:image", content: photo.fullsize_url)
|
||||
= tag("meta", property: "og:image:user_generated", content: "true")
|
||||
= tag("meta", property: "og:title", content: "#{@harvest.crop} harvested by #{@harvest.owner}")
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
.row
|
||||
.col-md-6
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
- daysleft = Date.new(2014, 10, 22) - Date.today # end of campaign is the 21st, this gives a number that matches what IGG uses
|
||||
- if daysleft > 0
|
||||
.crowdfunding-banner
|
||||
Help us share free growing information with the world.
|
||||
= link_to "Support our crowdfunding campaign.", "https://www.indiegogo.com/projects/growstuff/x/6079859"
|
||||
There are only #{daysleft.to_i} days left.
|
||||
|
||||
@@ -8,16 +8,24 @@
|
||||
%span.icon-bar
|
||||
%span.icon-bar
|
||||
%span.icon-bar
|
||||
%a.navbar-brand(href=root_path)
|
||||
%a.navbar-brand.hidden-xs(href=root_path)
|
||||
= image_tag("growstuff-brand.png", :size => "200x50", :alt => ENV['GROWSTUFF_SITE_NAME'])
|
||||
= form_tag crops_search_path, :method => :get, :id => 'navbar-search', :class => 'navbar-form pull-right' do
|
||||
.input
|
||||
%a.navbar-brand.visible-xs(href=root_path)
|
||||
= image_tag("growstuff-apple-touch-icon-precomposed.png", :size => "50x50", :class=>"img-responsive", :alt => ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
.form.navbar-form.pull-left
|
||||
= form_tag crops_search_path, :method => :get, :id => 'navbar-search' do
|
||||
= label_tag :term, "Search crop database:", :class => 'sr-only'
|
||||
= text_field_tag 'term', nil, :class => 'search-query input-medium form-control', :placeholder => 'Search crops'
|
||||
= submit_tag "Search", :class => 'btn sr-only'
|
||||
.input
|
||||
.input-group
|
||||
= text_field_tag 'term', nil, :class => 'search-query input-medium form-control', :placeholder => 'Search crops'
|
||||
.input-group-btn
|
||||
%button.btn.btn-default{:style => "height: 34px;"}
|
||||
= submit_tag "Search", :class => 'btn sr-only'
|
||||
%span.glyphicon.glyphicon-search
|
||||
|
||||
.navbar-collapse.collapse#navbar-collapse
|
||||
%ul.nav.navbar-nav.pull-right
|
||||
%ul.nav.navbar-nav.navbar-right
|
||||
%li.dropdown<
|
||||
%a.dropdown-toggle{'data-toggle' => 'dropdown', :href => crops_path}
|
||||
Crops
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
%head
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta property="og:image" content="#{image_url 'growstuff-apple-touch-icon-precomposed.png'}"/>
|
||||
<meta property="og:title" content="#{content_for?(:title) ? yield(:title) + " - #{ ENV['GROWSTUFF_SITE_NAME']} " : ENV['GROWSTUFF_SITE_NAME']}" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="#{root_url}" />
|
||||
<meta property="og:site_name" content="#{ENV['GROWSTUFF_SITE_NAME']}" />
|
||||
- if content_for?(:opengraph)
|
||||
= yield(:opengraph)
|
||||
- else
|
||||
= tag("meta", property: "og:image", content: image_url('facebook-thumbnail.png'))
|
||||
= tag("meta", property: "og:title", content: "#{content_for?(:title) ? yield(:title) + " - #{ ENV['GROWSTUFF_SITE_NAME']} " : ENV['GROWSTUFF_SITE_NAME']}")
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: root_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
- if (content_for?(:member_rss_login_name) && content_for(:member_rss_slug))
|
||||
= auto_discovery_link_tag(:rss, { :controller => "/members", :action => 'show', :format => "rss", :id => yield(:member_rss_slug) }, { :title => "#{ ENV['GROWSTUFF_SITE_NAME'] }- #{yield(:member_rss_login_name)}'s posts" })
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
= render :partial => "layouts/meta"
|
||||
%body
|
||||
= render :partial => "layouts/header"
|
||||
= render :partial => "layouts/crowdfunding"
|
||||
|
||||
#maincontainer.container
|
||||
.row
|
||||
@@ -18,12 +17,7 @@
|
||||
%p
|
||||
.btn-group
|
||||
= yield(:buttonbar)
|
||||
- if notice
|
||||
.alert.alert-success
|
||||
= notice
|
||||
- if alert
|
||||
.alert.alert-warning
|
||||
= alert
|
||||
= render :partial => "shared/flash_messages", flash: flash
|
||||
= yield
|
||||
|
||||
%footer
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
- if g.photos.size > 0 or (can? :edit, g and can? :create, Photo)
|
||||
.row
|
||||
%h3 Photos
|
||||
%p= pluralize(g.photos.length, "photo")
|
||||
%p= localize_plural(g.photos, Photo)
|
||||
.row
|
||||
%ul.thumbnails
|
||||
- g.photos.each do |p|
|
||||
@@ -44,12 +44,12 @@
|
||||
%p
|
||||
= link_to "Add photo", new_photo_path(:type => "garden", :id => g.id), :class => 'btn btn-primary'
|
||||
|
||||
%h3 What's planted here?
|
||||
.row
|
||||
- if g.featured_plantings.size > 0
|
||||
- g.featured_plantings.each.with_index do |planting|
|
||||
.col-xs-12.col-lg-6
|
||||
= render partial: "plantings/thumbnail", locals: {:planting => planting}
|
||||
%h3 What's planted here?
|
||||
.row
|
||||
- if g.featured_plantings.size > 0
|
||||
- g.featured_plantings.each.with_index do |planting|
|
||||
.col-xs-12.col-lg-6
|
||||
= render partial: "plantings/thumbnail", locals: {:planting => planting}
|
||||
|
||||
%p
|
||||
= link_to "More about this garden...", url_for(g)
|
||||
%p
|
||||
= link_to "More about this garden...", url_for(g)
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
- if member.location.blank?
|
||||
unknown location
|
||||
- else
|
||||
= link_to member.location, place_path(:place => member.location)
|
||||
= link_to member.location, place_path(:place => member.location, anchor: "members")
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
- if member.latitude and member.longitude
|
||||
%div#membermap
|
||||
%p
|
||||
See other members near
|
||||
= link_to member.location, place_path(member.location)
|
||||
See other members, plantings, seeds and more near
|
||||
= link_to member.location, place_path(member.location, anchor: "members")
|
||||
- else
|
||||
%div.location-not-set
|
||||
%div.sr-only Location not known
|
||||
%div.sr-only We can't show you what's nearby
|
||||
@@ -1,30 +1,30 @@
|
||||
%h3 Activity
|
||||
|
||||
%ul
|
||||
%ul.list-inline
|
||||
%li
|
||||
- if member.plantings.size > 0
|
||||
= link_to pluralize(member.plantings.size, "planting"), plantings_by_owner_path(:owner => member)
|
||||
= link_to localize_plural(member.plantings, Planting), plantings_by_owner_path(owner: member)
|
||||
- else
|
||||
0 plantings
|
||||
%li
|
||||
- if member.harvests.size > 0
|
||||
= link_to pluralize(member.harvests.size, "harvest"), harvests_by_owner_path(:owner => member)
|
||||
= link_to localize_plural(member.harvests, Harvest), harvests_by_owner_path(owner: member)
|
||||
- else
|
||||
0 harvests
|
||||
%li
|
||||
- if member.seeds.size > 0
|
||||
= link_to pluralize(member.seeds.size, "seeds"), seeds_by_owner_path(:owner => member)
|
||||
= link_to localize_plural(member.seeds, Seed), seeds_by_owner_path(owner: member)
|
||||
- else
|
||||
0 seeds
|
||||
%li
|
||||
- if member.posts.size > 0
|
||||
= link_to pluralize(member.posts.size, "post"), posts_by_author_path(:author => member)
|
||||
= link_to localize_plural(member.posts, Post), posts_by_author_path(author: member)
|
||||
- else
|
||||
0 posts
|
||||
|
||||
%li
|
||||
- if member.followed.size > 0
|
||||
= link_to pluralize(member.followed.size, "follow"), member_follows_path(member)
|
||||
= link_to localize_plural(member.followed, Follow), member_follows_path(member)
|
||||
- else
|
||||
0 following
|
||||
|
||||
|
||||
@@ -21,4 +21,4 @@
|
||||
ago.
|
||||
%p
|
||||
%small
|
||||
= [pluralize(member.gardens.size, "garden"), pluralize(member.plantings.size, "planting"), pluralize(member.seeds.size, "seed")].join(", ")
|
||||
= [localize_plural(member.gardens, Garden), localize_plural(member.plantings, Planting), localize_plural(member.seeds, Seed)].join(", ")
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
= submit_tag "Show", :class => 'btn btn-primary'
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @members, :model => "members"
|
||||
= page_entries_info @members
|
||||
= will_paginate @members
|
||||
|
||||
.member-cards
|
||||
@@ -15,5 +15,5 @@
|
||||
= render :partial => "members/thumbnail", :locals => { :member => m }
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @members, :model => "members"
|
||||
= page_entries_info @members
|
||||
= will_paginate @members
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
- content_for :title, @member.login_name
|
||||
- content_for :subtitle, @member.location
|
||||
- content_for :opengraph do
|
||||
= tag("meta", property: "og:image", content: avatar_uri(@member, 200))
|
||||
= tag("meta", property: "og:image:user_generated", content: "true")
|
||||
= tag("meta", property: "og:title", content: @member.login_name)
|
||||
= tag("meta", property: "og:type", content: "profile")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
- content_for :buttonbar do
|
||||
- if can? :update, @member
|
||||
= link_to 'Edit profile', edit_member_registration_path, :class => 'btn btn-default'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
- content_for :title, "#{@member.login_name}'s followers"
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @followers, :model => "members"
|
||||
= page_entries_info @followers
|
||||
= will_paginate @followers
|
||||
|
||||
.row
|
||||
@@ -12,5 +12,5 @@
|
||||
= render :partial => "members/thumbnail", :locals => { :member => f }
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @followers, :model => "members"
|
||||
= will_paginate @followers
|
||||
= page_entries_info @followers
|
||||
= will_paginate @followers
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
- content_for :title, "#{@member.login_name}'s follows"
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @follows, :model => "members"
|
||||
= page_entries_info @follows
|
||||
= will_paginate @follows
|
||||
|
||||
.row
|
||||
@@ -12,5 +12,5 @@
|
||||
= render :partial => "members/thumbnail", :locals => { :member => f }
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @follows, :model => "members"
|
||||
= will_paginate @follows
|
||||
= page_entries_info @follows
|
||||
= will_paginate @follows
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
%p Most recent photos added to #{ENV['GROWSTUFF_SITE_NAME']}.
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @photos, :model => "photos"
|
||||
= page_entries_info @photos
|
||||
= will_paginate @photos
|
||||
|
||||
.row
|
||||
@@ -17,7 +17,7 @@
|
||||
= link_to p.owner, p.owner
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @photos, :model => "photos"
|
||||
= page_entries_info @photos
|
||||
= will_paginate @photos
|
||||
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
= submit_tag "Search", :class => 'btn btn-primary'
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @photos, :model => "photos"
|
||||
= page_entries_info @photos
|
||||
= will_paginate @photos
|
||||
|
||||
.row
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
-content_for :title, @photo.title
|
||||
- content_for :title, @photo.title
|
||||
- content_for :opengraph do
|
||||
= tag("meta", property: "og:title", content: @photo.title)
|
||||
= tag("meta", property: "og:image", content: @photo.fullsize_url)
|
||||
= tag("meta", property: "og:image:user_generated", content: "true")
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
.row
|
||||
.col-md-6
|
||||
@@ -24,13 +31,13 @@
|
||||
%ul
|
||||
- if @photo.plantings.size > 0
|
||||
- @photo.plantings.each do |p|
|
||||
%li= link_to p, p
|
||||
%li= link_to t('.thing_by', thing: Planting.model_name.singular, owner: p.owner), p
|
||||
- if @photo.harvests.size > 0
|
||||
- @photo.harvests.each do |h|
|
||||
%li= link_to h, h
|
||||
%li= link_to t('.thing_by', thing: Harvest.model_name.singular, owner: h.owner), h
|
||||
- if @photo.gardens.size > 0
|
||||
- @photo.gardens.each do |g|
|
||||
%li= link_to g, g
|
||||
%li= link_to t('.thing_by', thing: Garden.model_name.singular, owner: g.owner), g
|
||||
|
||||
|
||||
.row
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
-content_for :title, "#{ENV['GROWSTUFF_SITE_NAME']} members near #{@place}"
|
||||
-content_for :title, "#{ENV['GROWSTUFF_SITE_NAME']} community near #{@place}"
|
||||
- content_for :opengraph do
|
||||
= tag("meta", property: "og:title", content: "#{ENV['GROWSTUFF_SITE_NAME']} community near #{@place}")
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
= render partial: 'search_form'
|
||||
|
||||
%div#placesmap{ :style => "height:300px"}
|
||||
|
||||
%h3= "Nearby members"
|
||||
%h3#members= "Nearby members"
|
||||
|
||||
- if !@nearby_members.empty?
|
||||
.row
|
||||
@@ -13,7 +18,7 @@
|
||||
= render :partial => "members/thumbnail", :locals => { :member => member }
|
||||
= link_to "View all members >>", members_path
|
||||
|
||||
%h3= "Seeds available for trade near #{@place}"
|
||||
%h3#seeds= "Seeds available for trade near #{@place}"
|
||||
- crop_id = []
|
||||
- @nearby_members.first(10).each do |member|
|
||||
- member.seeds.first(5).each do |seed|
|
||||
@@ -27,19 +32,23 @@
|
||||
- else
|
||||
%p No nearby seeds found
|
||||
|
||||
#plantings
|
||||
%h3= "Recent plantings near #{@place}"
|
||||
|
||||
.row
|
||||
- plantings = []
|
||||
- @nearby_members.first(10).each do |member|
|
||||
- member.plantings.first(5).each do |planting|
|
||||
- plantings << planting
|
||||
- if !plantings.blank?
|
||||
|
||||
- plantings = []
|
||||
- @nearby_members.first(10).each do |member|
|
||||
- member.plantings.first(5).each do |planting|
|
||||
- plantings << planting
|
||||
- if !plantings.blank?
|
||||
.row
|
||||
- plantings.first(10).each.with_index do |planting, index|
|
||||
.col-xs-12.col-lg-6
|
||||
= render partial: "plantings/thumbnail", locals: {:planting => planting, :index => index}
|
||||
.row
|
||||
= link_to "View all plantings >>", plantings_path
|
||||
- else
|
||||
- else
|
||||
.row
|
||||
%p No nearby plantings found
|
||||
- else
|
||||
%p No results found
|
||||
@@ -1,4 +1,9 @@
|
||||
- content_for :title, @plant_part.name.titlecase
|
||||
- content_for :opengraph do
|
||||
= tag("meta", property: "og:title", content: @plant_part.name.titlecase)
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
- if @plant_part.crops.empty?
|
||||
%p No crops are harvested for this plant part (yet).
|
||||
|
||||
@@ -23,32 +23,42 @@
|
||||
= link_to "Add a garden.", new_garden_path
|
||||
.form-group
|
||||
= f.label :planted_at, 'When?', :class => 'control-label col-md-2'
|
||||
.col-md-2= f.text_field :planted_at, :value => @planting.planted_at ? @planting.planted_at.to_s(:ymd) : '', :class => 'add-datepicker form-control', :placeholder => 'optional'
|
||||
.col-md-2
|
||||
= f.text_field :planted_at, :value => @planting.planted_at ? @planting.planted_at.to_s(:ymd) : '', :class => 'add-datepicker form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
.form-group
|
||||
= f.label :quantity, 'How many?', :class => 'control-label col-md-2'
|
||||
.col-md-2
|
||||
= f.number_field :quantity, :class => 'form-control', :placeholder => 'optional'
|
||||
= f.number_field :quantity, :class => 'form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
.form-group
|
||||
= f.label :planted_from, 'Planted from:', :class => 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.select(:planted_from, Planting::PLANTED_FROM_VALUES, {:include_blank => 'optional'}, :class => 'form-control')
|
||||
= f.select(:planted_from, Planting::PLANTED_FROM_VALUES, {:include_blank => ''}, :class => 'form-control')
|
||||
= render :partial => 'shared/form_optional'
|
||||
.form-group
|
||||
= f.label :sunniness, 'Sun or shade?', :class => 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.select(:sunniness, Planting::SUNNINESS_VALUES, {:include_blank => 'optional'}, :class => 'form-control')
|
||||
= f.select(:sunniness, Planting::SUNNINESS_VALUES, {:include_blank => ''}, :class => 'form-control')
|
||||
= render :partial => 'shared/form_optional'
|
||||
.form-group
|
||||
= f.label :description, 'Tell us more about it', :class => 'control-label col-md-2'
|
||||
.col-md-8= f.text_area :description, :rows => 6, :class => 'form-control', :placeholder => 'optional'
|
||||
.col-md-8
|
||||
= f.text_area :description, :rows => 6, :class => 'form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
.form-group
|
||||
= f.label :finished, 'Mark as finished', :class => 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.check_box :finished
|
||||
= render :partial => 'shared/form_optional'
|
||||
%span.help-block
|
||||
A planting is finished when you've harvested all of the crop, or it dies, or it's otherwise no longer growing in your garden.
|
||||
= t('.finish_helper')
|
||||
|
||||
.form-group
|
||||
= f.label :finished_at, 'Finished date', { :class => 'control-label col-md-2', :placeholder => 'optional' }
|
||||
= f.label :finished_at, 'Finished date', { :class => 'control-label col-md-2' }
|
||||
.col-md-2
|
||||
= f.text_field :finished_at, :value => @planting.finished_at ? @planting.finished_at.to_s(:ymd) : '', :class => 'add-datepicker form-control', :placeholder => 'optional'
|
||||
= render :partial => 'shared/form_optional'
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit 'Save', :class => 'btn btn-primary'
|
||||
|
||||
@@ -1,41 +1,44 @@
|
||||
.row
|
||||
.col-xs-4.col-md-2
|
||||
= link_to image_tag((planting.default_photo ? planting.default_photo.thumbnail_url : 'placeholder_150.png'), :alt => planting.crop_id, :class => 'img'), planting
|
||||
.col-xs-4.col-md-6
|
||||
%dl.dl-horizontal
|
||||
%dt Owner:
|
||||
%dd= link_to planting.owner.login_name, planting.owner
|
||||
%dt Garden:
|
||||
%dd= link_to planting.garden.name, planting.garden
|
||||
%dt Planted on:
|
||||
%dd= planting.planted_at
|
||||
%dt Quantity:
|
||||
%dd= "#{display_planting_quantity(planting)}"
|
||||
%dt Finished on:
|
||||
%dd= "#{display_finished(planting)}"
|
||||
%dt Sun/shade?:
|
||||
%dd
|
||||
- sunniness = planting.sunniness.blank? ? "not specified" : planting.sunniness
|
||||
= image_tag("sunniness_#{sunniness}.png", :size => "25x25", :alt => "#{sunniness}", :title => "#{sunniness}")
|
||||
= " (#{sunniness})"
|
||||
%dt Planted from:
|
||||
%dd= "#{display_planted_from(planting)}"
|
||||
.col-xs-4.col-md-4
|
||||
%ul{:style => "list-style-type:none"}
|
||||
%li= link_to 'Details', planting, :class => 'btn btn-default btn-xs'
|
||||
- if can? :edit, planting
|
||||
%li= link_to 'Edit', edit_planting_path(planting), :class => 'btn btn-default btn-xs'
|
||||
- if ! planting.finished
|
||||
%li= link_to "Mark as finished", planting_path(planting, :planting => {:finished => 1}), :method => :put, :class => 'btn btn-default btn-xs append-date'
|
||||
- if can? :destroy, planting
|
||||
%li= link_to 'Delete', planting, method: :delete, data: { confirm: 'Are you sure?' }, :class => 'btn btn-default btn-xs'
|
||||
.row
|
||||
.col-xs-3.col-md-4
|
||||
%dl
|
||||
%dt Crop name:
|
||||
%dd= link_to planting.crop.name, planting.crop
|
||||
%dt Days until maturity:
|
||||
%dd= "#{display_days_before_maturity(planting)}"
|
||||
.panel.panel-success.planting-thumbnail
|
||||
.panel-heading
|
||||
%h3.panel-title= link_to planting.crop.name, planting.crop
|
||||
.panel-body
|
||||
.row
|
||||
.col-xs-12.col-md-4
|
||||
= link_to image_tag((planting.default_photo ? planting.default_photo.thumbnail_url : 'placeholder_150.png'), :alt => planting.crop_id, :class => 'img'), planting
|
||||
.col-xs-7.col-md-5
|
||||
%dl.dl-horizontal.planting-attributes
|
||||
%dt Owner:
|
||||
%dd= link_to planting.owner.login_name, planting.owner
|
||||
%dt Garden:
|
||||
%dd= link_to planting.garden.name, planting.garden
|
||||
%dt Planted on:
|
||||
%dd= planting.planted_at
|
||||
%dt Quantity:
|
||||
%dd= "#{display_planting_quantity(planting)}"
|
||||
%dt Finished on:
|
||||
%dd= "#{display_finished(planting)}"
|
||||
%dt Sun/shade?:
|
||||
%dd
|
||||
- sunniness = planting.sunniness.blank? ? "not specified" : planting.sunniness
|
||||
= image_tag("sunniness_#{sunniness}.png", :size => "25x25", :alt => "#{sunniness}", :title => "#{sunniness}")
|
||||
= " (#{sunniness})"
|
||||
%dt Planted from:
|
||||
%dd= "#{display_planted_from(planting)}"
|
||||
.col-xs-1.col-md-3
|
||||
%ul{:style => "list-style-type:none; text-align:right"}
|
||||
%li= link_to 'Details', planting, :class => 'btn btn-default btn-xs'
|
||||
- if can? :edit, planting
|
||||
%li= link_to 'Edit', edit_planting_path(planting), :class => 'btn btn-default btn-xs'
|
||||
- if ! planting.finished
|
||||
%li= link_to "Mark as finished", planting_path(planting, :planting => {:finished => 1}), :method => :put, :class => 'btn btn-default btn-xs append-date'
|
||||
- if can? :destroy, planting
|
||||
%li= link_to 'Delete', planting, method: :delete, data: { confirm: 'Are you sure?' }, :class => 'btn btn-default btn-xs'
|
||||
|
||||
.col-xs-9.col-md-8
|
||||
= render partial: 'plantings/planting_progress', locals: {planting: planting}
|
||||
.row
|
||||
.col-xs-12.col-md-4
|
||||
%dl
|
||||
%dt Days until maturity:
|
||||
%dd= "#{display_days_before_maturity(planting)}"
|
||||
|
||||
.col-xs-12.col-md-8
|
||||
= render partial: 'plantings/planting_progress', locals: {planting: planting}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
= render :partial => 'shared/signin_signup', :locals => { :to => "track what you've planted" }
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @plantings, :model => "plantings"
|
||||
= page_entries_info @plantings
|
||||
= will_paginate @plantings
|
||||
|
||||
.row
|
||||
@@ -27,7 +27,7 @@
|
||||
= render partial: "plantings/thumbnail", locals: {:planting => planting}
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @plantings, :model => "plantings"
|
||||
= page_entries_info @plantings
|
||||
= will_paginate @plantings
|
||||
|
||||
%ul.list-inline
|
||||
|
||||
@@ -1,51 +1,55 @@
|
||||
=content_for :title, "#{@planting.crop} in #{@planting.location}"
|
||||
- content_for :opengraph do
|
||||
- @planting.crop.photos.each do |photo|
|
||||
= tag("meta", property: "og:image", content: photo.fullsize_url)
|
||||
= tag("meta", property: "og:title", content: "#{@planting.crop} in #{@planting.location}")
|
||||
- if @planting.description
|
||||
= tag("meta", property: "og:description", content: @planting.description)
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
.row
|
||||
.row.planting
|
||||
.col-md-6
|
||||
%p
|
||||
%b Owner:
|
||||
= link_to @planting.owner, @planting.owner
|
||||
—
|
||||
= link_to "view all #{@planting.owner}'s plantings", plantings_by_owner_path(:owner => @planting.owner.slug)
|
||||
%p
|
||||
%b Planted on:
|
||||
= @planting.planted_at ? @planting.planted_at : "not specified"
|
||||
%dl.dl-horizontal.planting-attributes
|
||||
%dt Owner:
|
||||
%dd
|
||||
= link_to @planting.owner, @planting.owner
|
||||
—
|
||||
= link_to "view all #{@planting.owner}'s plantings", plantings_by_owner_path(:owner => @planting.owner.slug)
|
||||
|
||||
%p
|
||||
%b Where:
|
||||
=link_to "#{@planting.owner}'s", @planting.owner
|
||||
=link_to @planting.garden, @planting.garden
|
||||
- if ! @planting.owner.location.blank?
|
||||
= "(#{@planting.owner.location})"
|
||||
%p
|
||||
%b
|
||||
= "Quantity: "
|
||||
= "#{display_planting_quantity(@planting)}"
|
||||
%dt Planted on:
|
||||
%dd= @planting.planted_at ? @planting.planted_at : "not specified"
|
||||
|
||||
%dt Where:
|
||||
%dd
|
||||
=link_to "#{@planting.owner}'s", @planting.owner
|
||||
=link_to @planting.garden, @planting.garden
|
||||
- if ! @planting.owner.location.blank?
|
||||
= "(#{@planting.owner.location})"
|
||||
|
||||
%dt Quantity:
|
||||
%dd
|
||||
="#{display_planting_quantity(@planting)}"
|
||||
|
||||
- if !@planting.planted_from.blank?
|
||||
%p
|
||||
%b
|
||||
= "Planted from: "
|
||||
= "#{display_planted_from(@planting)}"
|
||||
- if !@planting.planted_from.blank?
|
||||
%dt Planted from:
|
||||
%dd= "#{display_planted_from(@planting)}"
|
||||
|
||||
%p
|
||||
%b
|
||||
= "Sun or shade?: "
|
||||
- sunniness = @planting.sunniness.blank? ? "not specified" : @planting.sunniness
|
||||
= image_tag("sunniness_#{sunniness}.png", :size => "25x25", :alt => "#{sunniness}", :title => "#{sunniness}")
|
||||
= " (#{sunniness})"
|
||||
%dt Sun or shade?
|
||||
%dd
|
||||
- sunniness = @planting.sunniness.blank? ? "not specified" : @planting.sunniness
|
||||
= image_tag("sunniness_#{sunniness}.png", :size => "25x25", :alt => "#{sunniness}", :title => "#{sunniness}")
|
||||
= " (#{sunniness})"
|
||||
|
||||
%dt Days until maturity:
|
||||
%dd= "#{display_days_before_maturity(@planting)}"
|
||||
|
||||
%dt Finished:
|
||||
%dd= "#{display_finished(@planting)}"
|
||||
|
||||
%p
|
||||
%b
|
||||
= "Days until maturity: "
|
||||
= "#{display_days_before_maturity(@planting)}"
|
||||
%p
|
||||
%b
|
||||
= "Finished: "
|
||||
= "#{display_finished(@planting)}"
|
||||
|
||||
%p
|
||||
%b= render 'planting_progress', planting: @planting
|
||||
= render 'planting_progress', planting: @planting
|
||||
|
||||
- if can? :edit, @planting or can? :destroy, @planting
|
||||
%p
|
||||
@@ -58,11 +62,16 @@
|
||||
|
||||
.col-md-6
|
||||
= render :partial => "crops/index_card", :locals => { :crop => @planting.crop}
|
||||
- if @planting.owner.location
|
||||
%p
|
||||
%small
|
||||
View other plantings, members and more near
|
||||
= link_to @planting.owner.location, place_path(@planting.owner.location, anchor: "plantings")
|
||||
- if @planting.description
|
||||
%h2 Notes
|
||||
|
||||
%h2 Notes
|
||||
|
||||
:growstuff_markdown
|
||||
#{ @planting.description != "" ? @planting.description : "No description given." }
|
||||
:growstuff_markdown
|
||||
#{ @planting.description != "" ? @planting.description : "No description given." }
|
||||
|
||||
- if @planting.photos.size > 0 or (can? :edit, @planting and can? :create, Photo)
|
||||
%h2 Pictures
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
-content_for :title, 'API and Data Use Policy'
|
||||
|
||||
:markdown
|
||||
We hate legalese, so we've tried to make this policy readable. If you've got any questions, feel free to [ask us](mailto:support@growstuff.org), and we'll do our best to answer.
|
||||
|
||||
This API and Data Use Policy covers all websites (such as [growstuff.org](http://growstuff.org)) owned and operated by Growstuff Pty Ltd ("Growstuff", "we", "us", "our") and all associated services, collectively referred to as the Service.
|
||||
|
||||
In particular, this policy covers any access to the Service via any Application Programming Interface, feeds, spidering, scraping, or any other automated or programmatic access to the Structured Data or Content available via the Service (collectively, the "API"). This policy applies to anyone who uses the API ("you", "developer").
|
||||
|
||||
## 1. API Provided As-Is, and Subject to Change
|
||||
|
||||
Growstuff provides its API on an as-is basis, as described under "Disclaimer of Warranties" in our [Terms of Service](http://growstuff.org/policy/tos).
|
||||
|
||||
Growstuff's API is subject to change. We will make reasonable efforts to notify developers of changes and of the release status of any API features. You should take reasonable efforts to keep up with Growstuff technical news via our forums, mailing lists, or other channels.
|
||||
|
||||
## 2. Don't overload our servers
|
||||
|
||||
You agree to limit your access to the API in such a way as to prevent excessive load on the Service. Growstuff reserves the right to restrict or rate-limit access to the API if necessary to maintain the performance of the Service.
|
||||
|
||||
## 3. Use of Growstuff Data and Content
|
||||
|
||||
You agree to observe the terms of the [Creative Commons Attribution-ShareAlike (CC-BY-SA) 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/deed.en_US) under which our Structured Data is made available. You agree to to observe the copyright and intellectual property rights of Growstuff's members with regard to their Content posted on the Service, including but not limited to posts, comments, images, etc.
|
||||
|
||||
You agree to respect any privacy settings which pertain to the Structured Data or Content you access via the API. You agree not to republish any Structured Data or Content with more permissive access than was originally intended by the member who posted it.
|
||||
|
||||
Growstuff acknowledges that Structured Data and Content made available under the API may be cached or retained by third parties for any length of time. However, we request that if you are building an application using current Structured Data and Content, you will take reasonable efforts to regularly update it, including removing any Structured Data or Content that is deleted from the Service, and reflecting any changes in privacy settings that pertain to it.
|
||||
|
||||
## 4. Authentication
|
||||
|
||||
Growstuff reserves the right to require authentication and/or app registration as a condition of use of the API and Data.
|
||||
|
||||
If you provide users with the ability to login to Growstuff, you must do so via OAuth. You may not require users to provide their Growstuff login name and password.
|
||||
|
||||
## 5. Penalties
|
||||
|
||||
If you violate the terms of this Policy, Growstuff may restrict your access to the API.
|
||||
|
||||
## 6. Changes
|
||||
|
||||
We may change our API and Data Use Policy from time to time. A history of changes to this Policy is available via our public source code repository at [https://github.com/Growstuff/policy](https://github.com/Growstuff/policy). We will take reasonable steps to notify you of any substantial changes to this Policy; however, it is your responsibility to check this Policy periodically for changes. Your continued use of this site after any change in this Privacy Policy will constitute your acceptance of such change.
|
||||
|
||||
## 7. Creative Commons License
|
||||
|
||||
This API and Data Use Policy is licensed under a [Creative Commons Attribution-ShareAlike (CC-BY-SA) 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/deed.en_US).
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
-content_for :title, 'Growstuff Community Guidelines'
|
||||
|
||||
:markdown
|
||||
Growstuff is a community by and for food-gardeners. Together, we are building a website where we can share our experience, knowledge, and the products of our harvest. The most important thing about Growstuff is the people. For Growstuff to thrive, we need people to add their crops, share their knowledge, and help build the site itself.
|
||||
|
||||
Whatever your interest in Growstuff you are welcome here, and will be treated with respect. In particular:
|
||||
|
||||
- We welcome people of any age, gender identity or expression, ethnicity, nationality, religion or absence thereof, political opinion, sexual orientation, marital status, family structure, ability or disability, appearance, subculture, or other identity or self-identification.
|
||||
|
||||
- Although Growstuff is primarily focused on food gardening, we welcome all kinds of gardeners, including organic and conventional growers; those who grow their crops in fields or on balconies or in hydroponic systems; those who garden commercially or non-commercially; those who subsist on their crops and those who garden for other reasons.
|
||||
|
||||
- We welcome people of all skill and experience levels, and we don't believe in being dismissive or commenting rudely just because you are new or learning.
|
||||
|
||||
- Every role in our community is important, including gardeners who contribute skills, knowledge, and information to our site; coders, designers and other techies who help build it; moderators and others who help our community thrive; or any other form of participation. We believe in working together, and prioritise communication and mutual understanding.
|
||||
|
||||
If you want to participate in the Growstuff community (which includes our website and any auxiliary forums such as our mailing list(s), IRC channel, etc), you need to agree to our general commitment to inclusiveness and mutual respect, as well as to the following specific policies:
|
||||
|
||||
- Harassment of any Growstuff community member is forbidden. Harassment includes slurs directed at individuals or groups; unwanted sexual remarks directed at any person or group; sexually explicit comments or imagery in public spaces; stalking or other repeated, unwanted contact; or any repeated or sustained behaviour which disrupts someone else's enjoyment of the Growstuff site or community.
|
||||
|
||||
- The privacy of our community members is very important. You may not disclose any member's personal details (including names by which they are known outside of Growstuff, their location, employment details, family details, outside-of-Growstuff contact details, or any other identifying or personal information) without their explicit consent.
|
||||
|
||||
- Although we let you choose your own name on our site, and don't insist that you use the same name on our website as you have on the cards in your wallet, you're not allowed to create or use a pseudonymous account to mislead people, evade accountability, or otherwise cause trouble. (This is commonly known as a "sockpuppet" account.)
|
||||
|
||||
If you experience or witness behaviour that goes against these community guidelines, you can report it to support@growstuff.org. We will listen carefully and take your report seriously. Once we've looked into the situation, we may take any action we deem necessary. For instance, we may issue a warning, or in serious cases we may suspend or ban people from our community. If this happens, we will always tell the person affected the reason for our action, with reference to our policy documents.
|
||||
|
||||
We don't want to make these guidelines too long or legalistic, so we'll leave it there, except for one final guideline. As Bill and Ted said: *be excellent to each other*. And grow stuff.
|
||||
|
||||
## Creative Commons License
|
||||
|
||||
These Community Guidelines are licensed under a [Creative Commons Attribution-ShareAlike (CC-BY-SA) 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/deed.en_US).
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
-content_for :title, 'Copyright Infringement Policy'
|
||||
|
||||
:markdown
|
||||
We hate legalese, so we've tried to make this policy readable. If you've got any questions, feel free to [ask us](mailto:support@growstuff.org), and we'll do our best to answer.
|
||||
|
||||
This Copyright Infringement Policy covers all websites (such as [growstuff.org](http://growstuff.org)) owned and operated by Growstuff Pty Ltd ("Growstuff", "we", "us", "our") and all associated services, collectively referred to as "the Service". It describes how you may report a violation of copyright on the Service.
|
||||
|
||||
Growstuff respects the intellectual property of others, and we ask our users to do the same. Growstuff members are required by the [Terms of Service](http://growstuff.org/policy/tos) to ensure that they have the legal right to post content to the Service.
|
||||
|
||||
Growstuff is based in Melbourne, Australia and is not subject to the provisions of the United States Digital Millennium Copyright Act (DMCA). However, we have established policy and procedures which are similar to those required by the DMCA, as we believe they constitute best practice for web services operating in Australia.
|
||||
|
||||
## 1. Notifying us of an infringement
|
||||
|
||||
If you believe that a Growstuff member has infringed your intellectual property rights by posting Content to the service, you may follow these steps to notify us and ask for the removal of the Content.
|
||||
|
||||
Notifications may be submitted by email to [support@growstuff.org](mailto:support@growstuff.org) or by physical mail to:
|
||||
|
||||
Growstuff
|
||||
Level 3, 673 Bourke Street
|
||||
Melbourne VIC 3000
|
||||
AUSTRALIA
|
||||
|
||||
We prefer to receive notifications by email.
|
||||
|
||||
Copyright infringement notifications sent through any other mechanism or forum will not be acted upon.
|
||||
|
||||
You must provide the following information:
|
||||
|
||||
* Sufficient information to identify the copyrighted work being infringed. For instance, if the work is a published book, provide the title, author, and ISBN; if the work is a magazine article, provide the title, author, magazine name, and magazine issue; if the work is available on the Internet, provide the URL of the work.
|
||||
* The URL of the specific page on Growstuff where your work was reproduced without permission. General descriptions or non-specific links (such as to Growstuff's homepage) cannot be acted upon.
|
||||
* Your postal address, telephone number, and email address.
|
||||
* A statement by you that the above information is accurate and that you are the copyright or intellectual property owner or authorized to act on the copyright or intellectual property owner's behalf.
|
||||
* A physical signature or digital signature in a recognized industry-standard format such as PGP, of the copyright or intellectual property owner or the person authorized to act on their behalf. Unsigned notifications will not be processed.
|
||||
|
||||
## 2. Responding to notifications
|
||||
|
||||
We will respond to copyright infringement notifications within two business days.
|
||||
|
||||
If we are not provided with enough information to act on the notification, including all the items listed in the section above, we will reject the notification and notify the submitter that it cannot be acted upon.
|
||||
|
||||
If the Content is not hosted on our servers (for instance, if the notification concerns an image hosted on another site which is merely displayed on or linked from our site) we will respond, notifying the submitter that the Content is not hosted by us and referring them to the hosting site.
|
||||
|
||||
Provided we are able to act upon the notification, we will contact the member who posted the Content and inform them of the notification and claim of intellectual property rights.
|
||||
|
||||
The member will have two business days to respond. They may respond as follows:
|
||||
|
||||
* Admit that they have posted something to which they do not hold intellectual property rights. In this case, the member may delete the Content from the Service, or we may render it inaccessible.
|
||||
* Submit a counter-notification, stating that they have the right to post the Content, and that they are prepared to uphold this claim in court. The process for this is outlined below.
|
||||
* Respond saying that they do not believe they have infringed any intellectual property rights, but that they do not wish to formally submit a counter-notification. In this case, the member may delete the Content from the Service, or we may render the Content inaccessible.
|
||||
* If the member fails to respond, we will render the Content inaccessible.
|
||||
|
||||
When Content is deleted or rendered inaccessible, we will take reasonable efforts to ensure it cannot be accessed via the Service. However, caching or external references may mean that Content remains accessible for some time, including on third-party sites or applications. Third party sites and applications are not under Growstuff's control. If infringing Content has been removed or rendered inaccessible via the Service but is still available via third-party sites and applications, the copyright or intellectual property holder may contact the operators of those sites/applications to notify them of the infringement.
|
||||
|
||||
## 3. Counter-notification and restoration process
|
||||
|
||||
A counter-notification is a statement that you do not believe your content infringes on another person's rights, or that your use of another person's copyrighted material falls into a protected category under law.
|
||||
|
||||
By filing a counter-notification, you are indicating that you are willing to defend your use of the material in court, if the copyright owner chooses to bring a lawsuit against you for your use of the material. This may involve civil and/or criminal penalties. We strongly suggest you contact an intellectual property lawyer licensed to practice law in your jurisdiction before you do this, so that you are aware of your rights and obligations under the law.
|
||||
|
||||
A counter-notification must contain the following items:
|
||||
|
||||
* Your signature. Signatures may be a physical signature or a digital signature in a recognized industry-standard format such as PGP.
|
||||
* The URL of the Content that has been called into question (this will have been provided in the original notification).
|
||||
* A statement that you have a good faith belief that the copyright infringement notification was sent as a result of mistake or misidentification of the material. This should include any reasons why you believe your use of the material is not infringing.
|
||||
* Your name, address, and telephone number.
|
||||
|
||||
We will forward your counter-notification, in full, to the submitter of the original notification. They will then have 14 days to initiate legal action and notify us that they have done so.
|
||||
|
||||
In the meantime, we will render the Content inaccessible.
|
||||
|
||||
If, after 14 days, we have not been informed that legal proceedings have been initiated, we will restore the Content.
|
||||
|
||||
If you have filed a counter-notification, you may not re-post the allegedly-infringing material until we notify you that the waiting period has expired.
|
||||
|
||||
## 4. Repeat offenses
|
||||
|
||||
Members who receive three or more valid copyright infringement notices will have their accounts terminated.
|
||||
|
||||
If a counter-notification is filed, or if the member has stated that they do not accept the allegation of copyright infringement but do not wish to formally file a counter-notification, the notification will not be counted toward termination.
|
||||
|
||||
We also reserve the right to terminate the accounts of those who, in our opinion, misuse or abuse the copyright infringement notification process against other members.
|
||||
|
||||
## 5. Changes
|
||||
|
||||
We may change our Copyright Infringement Policy from time to time. A history of changes to this Policy is available via our public source code repository at [https://github.com/Growstuff/policy](https://github.com/Growstuff/policy). We will take reasonable steps to notify you of any substantial changes to this Policy; however, it is your responsibility to check this Policy periodically for changes. Your continued use of this site after any change in this Privacy Policy will constitute your acceptance of such change.
|
||||
|
||||
## 6. Creative Commons license
|
||||
|
||||
This Terms of Service document is based on one developed by Dreamwidth ([http://www.dreamwidth.org/legal/dmca](http://www.dreamwidth.org/legal/dmca)) and is licensed under a [Creative Commons Attribution-ShareAlike 2.5 License](http://creativecommons.org/licenses/by-sa/2.5/).
|
||||
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
-content_for :title, 'Privacy Policy'
|
||||
|
||||
:markdown
|
||||
We hate legalese, so we've tried to make this policy readable. If you've got any questions, feel free to [ask us](mailto:support@growstuff.org), and we'll do our best to answer.
|
||||
|
||||
This privacy statement ("Privacy Policy") covers all websites (such as [growstuff.org](http://growstuff.org/)) owned and operated by Growstuff Pty Ltd ("Growstuff", "we", "us", "our") and all associated services, collectively referred to as "the Service".
|
||||
|
||||
We use information you share with us for our internal business purposes. We do not sell your information. This notice tells you what information we collect, how we use it, and steps we take to protect and secure it.
|
||||
|
||||
## 1. Information we collect
|
||||
|
||||
### 1.1 Non-Personal Data
|
||||
|
||||
Like most website operators, we collect Non-Personal Data such as browser type, language preference, referring site, and the date and time of each visitor request.
|
||||
|
||||
We collect this to understand how our visitors and members use our service, and use it to make decisions about how to change and adapt the service.
|
||||
|
||||
From time to time, we may release Non-Personal Data in aggregate form (for instance, by publishing trends in site usage) to explain our reasoning in making decisions. We will not release individual information, only aggregate information.
|
||||
|
||||
### 1.2 Personal Data
|
||||
|
||||
Personal Data is anything which can be used to identify or contact you, such as your legal name, email address, IP address, or physical location.
|
||||
|
||||
#### 1.2.1 Automatically collected Personal Data
|
||||
|
||||
We automatically collect some Personal Data, such as IP address, provided by your browser and your computer whenever you visit our website.
|
||||
|
||||
We collect this information for several purposes:
|
||||
|
||||
* To diagnose and repair network issues with your use of the site;
|
||||
* To estimate the number of users accessing the service from specific geographic regions;
|
||||
* To help prevent fraud and abuse.
|
||||
|
||||
#### 1.2.2 Email address
|
||||
|
||||
In order to register for the service, you must give us your email address. We will use your email address to send confirmation of certain actions, such as when you change your password. We will contact you when it's necessary to complete a transaction that you've initiated, or if there's a critical or administrative issue affecting your use of the service.
|
||||
|
||||
Once you have created your account, you can choose to subscribe to certain events and have notifications of those events sent to you via email. You will be able to change your mind and opt out of receiving notifications via email at any time.
|
||||
|
||||
We will never sell or provide your email address to any third party for marketing purposes, or for any other reason except as set out below.
|
||||
|
||||
#### 1.2.3 Optional Personal Data you provide to us
|
||||
|
||||
As you use the service, you have the option to provide more Personal Data, through your profile and other activity on the site. Providing this information is strictly optional.
|
||||
|
||||
You have the option to provide us with your location. You may provide this at whatever level of detail you wish, for instance you may provide your street address or your country of residence or nothing at all. We use this location to provide you with relevant content.
|
||||
|
||||
Many of your activities on the Service may allow you to post Personal Data or to directly or indirectly disclose Personal Data about yourself. For instance, you may disclose Personal Data in a post or comment on the site, by uploading a picture, by linking to another website you use, or by recording your gardening activity in detail. All of these activities are optional. You should use due caution when disclosing Personal Data through your activity on the Service.
|
||||
|
||||
We will show the information you provide, including any Personal Data it may contain, to others viewing the site, in accordance with the privacy options you've selected.
|
||||
|
||||
The information you provide is also made available to third parties via our API and feeds, in accordance with the privacy options you've selected and subject to the terms of our API and Data Use Policy which is available at [http://growstuff.org/policy/api](http://growstuff.org/policy/api).
|
||||
|
||||
Some of the information you provide is categorised as Structured Data, which is defined more fully in our [Terms of Service]([http://growstuff.org/policy/tos). We make Structured Data freely available under a Creative Commons Attribution ShareAlike (CC-BY-SA) 3.0 Unported license for use by third parties, in accordance with the privacy options you've selected.
|
||||
|
||||
We may also use any Personal Data you provide, in aggregate, to make decisions about how to change and adapt the service. From time to time, we may release information in aggregate form (for instance, by publishing trends in site usage) to explain our reasoning in making decisions. We will not release individual information, only aggregate information.
|
||||
|
||||
#### 1.2.4 Financial information and transactions
|
||||
|
||||
You can engage in financial transactions with Growstuff to purchase a paid account. These transactions are optional. If you choose to purchase a paid account, you will be asked to provide financial information to complete the transaction.
|
||||
|
||||
Credit cards: If you pay by credit card, we need you to provide your credit card number, your full name as it appears on the card, your address as it appears on the card statement, and the CVN or Card Verification Number. This information is required so we can authorize and charge your credit card. Your financial information is protected by industry-standard encryption methods. It is never stored on our servers: we pass it immediately along to our processor for the sole purpose of completing the authorized transaction.
|
||||
|
||||
In all cases, Growstuff collects this personal and financial information only as necessary or appropriate for the completion of the single requested transaction. Any additional non-financial Personal Data you disclose during these transactions will be governed by the "Disclosure of Personal Data" provisions below.
|
||||
|
||||
## 2. Disclosure of Personal Data
|
||||
|
||||
We disclose Personal Data, including optional personal information you have provided but which is not normally available to other site users, only to those of our employees, contractors, and volunteers who (i) need to know that information in order to operate the service and (ii) have agreed not to disclose it to others. Circumstances in which this is necessary include, but are not limited to: troubleshooting and diagnosing technical problems, investigating possible Terms of Service violations, and legal compliance issues.
|
||||
|
||||
We contract with third-party vendors to provide some site features. We will only share personal information with third-party vendors to the extent that is necessary for them to provide these site features. We require our third-party vendors to provide the same level of privacy protection that we do, and they do not have the right to share or use personal information for any purpose other than for an authorized transaction.
|
||||
|
||||
We may disclose Personal Data or potentially personally-identifying data when that release is required by law or by court order, or when we believe in good faith that disclosure is reasonably necessary to protect the safety or rights of us, third parties, or the public at large.
|
||||
|
||||
We reserve the right to transfer your Personal Data to a third party in the event of a sale, merger, liquidation, receivership or transfer of all or substantially all of the assets of our company provided that the third party agrees to adhere to the terms of the Growstuff Privacy Policy and provided that the third party only uses your Personal Data for the purposes that you provided it to us. You will be notified in the event of any such transfer and you will be afforded an opportunity to opt-out.
|
||||
|
||||
## 3. Cookies
|
||||
|
||||
A cookie is a string of information that a website stores on a visitor's computer, and that the visitor's browser provides to the website each time the visitor returns. We use cookies to help us identify and track visitors, their usage of the website, and their website access preferences. We also use cookies to govern logging into your account.
|
||||
|
||||
Visitors who do not wish to have cookies placed on their computers should set their browsers to refuse cookies before using the site, with the drawback that certain features of the site may not function properly without the aid of cookies.
|
||||
|
||||
## 4. Confidentiality and security
|
||||
|
||||
No data transmisson over the Internet can ever be guaranteed to be 100% secure. You use this service at your own risk. However, we will take all reasonable steps (including appropriate technical and organisational measures) to protect your Personal Data.
|
||||
|
||||
Your account information is password-protected. We recommend that you choose a strong and secure password. We use industry-standard encryption to protect your password on our servers.
|
||||
|
||||
If we learn of a system security breach, we will notify you electronically so you can take appropriate steps to protect yourself.
|
||||
|
||||
## 5. Deleting your information
|
||||
|
||||
You can change or delete any optional information that you've provided us at any time. If you change or delete any optional information you've provided, the change will take place immediately on the Service. However, caching or references to the data, including in third party applications based on the Service, may mean that formerly available data remains available for some time.
|
||||
|
||||
As part of the day to day operation of the Service, we will make regular copies of the data contained in the databases for backup purposes. These backups can potentially contain deleted data for several weeks or months. These backups will also be governed by the rules for Disclosure of Personal Data.
|
||||
|
||||
## 6. Changes
|
||||
|
||||
We may change our Privacy Policy from time to time. A history of changes to this Policy is available via our public source code repository at [https://github.com/Growstuff/policy](https://github.com/Growstuff/policy). We will take reasonable steps to notify you of any substantial changes to this Policy; however, it is your responsibility to check this Policy periodically for changes. Your continued use of this site after any change in this Privacy Policy will constitute your acceptance of such change.
|
||||
|
||||
## 7. Contacting us
|
||||
|
||||
If you have questions about this policy, you can contact us at [support@growstuff.org](mailto:support@growstuff.org).
|
||||
|
||||
## 8. Creative Commons
|
||||
|
||||
This privacy policy is based on one developed by Automattic ([http://automattic.com/privacy/](http://automattic.com/privacy/)) and amended by Dreamwidth ([http://dreamwidth.org/legal/privacy](http://dreamwidth.org/legal/privacy)) and is licensed under a [Creative Commons Attribution-ShareAlike 2.5 License](http://creativecommons.org/licenses/by-sa/2.5/).
|
||||
|
||||
@@ -1,156 +0,0 @@
|
||||
-content_for :title, 'Growstuff Terms of Service'
|
||||
|
||||
:markdown
|
||||
We hate legalese, so we've tried to make our Terms of Service readable. If you've got any questions, feel free to [ask us](mailto:support@growstuff.org), and we'll do our best to answer.
|
||||
|
||||
Growstuff Pty Ltd ("we", "us", "our", "Growstuff") present the following terms and conditions, which govern your use of the Growstuff website at [growstuff.org](http://growstuff.org), and all content, services and products available at or through the website, which we collectively refer to as "the Service".
|
||||
|
||||
To use the Service, you need to agree to these Terms of Service, along with all other policies we publish (including, but not limited to, Growstuff's Privacy Policy, API and Data Use Policy, Copyright Infringement Policy and Community Guidelines). We refer to this as "the Agreement".
|
||||
|
||||
Please read this Agreement carefully before accessing or using the Service. By accessing or using any part of the Service, you agree that you are bound by the terms and conditions of this Agreement. If you do not agree to all the terms and conditions of this Agreement, then you may not access the Service.
|
||||
|
||||
## 1. Your Account
|
||||
|
||||
If you create an account on the Service, you are responsible for maintaining the security of your account. You are responsible for all activities that occur under the account. You must take reasonable steps to guard the security of your account. We will not be liable for anything that happens if your account security is breached as a result of your failure to protect it.
|
||||
|
||||
## 2. Account Structure
|
||||
|
||||
Growstuff currently has three types of accounts:
|
||||
|
||||
* Free Accounts are available free of charge. Free accounts can access basic site functions, but do not receive access to premium features.
|
||||
* Paid Accounts are available for term-based fee and receive access to a number of premium features. When your Paid Account expires, it will revert to a Free Account until you pay for it again.
|
||||
* Permanent Accounts are reserved for those who have contributed significantly to the Growstuff project, at our discretion. They receive all features available to paid accounts, for as long as Growstuff continues to operate, without need for future payment.
|
||||
|
||||
Payments to Growstuff, for account services or for any other purpose, are refundable or transferable solely at Growstuff's discretion.
|
||||
|
||||
By using this Service, you agree to this account structure, and to Growstuff's right to change, modify, or discontinue any type of account or the features available to it at any time.
|
||||
|
||||
## 3. Content policy
|
||||
|
||||
Our content policy relates to any material you may post on the Growstuff website or through the Service, which we call "Content". This includes profile information, posts and comments, information about your food growing activity, and any other material, whether text, graphics, or any other format, which you may post on Growstuff itself or link to from Growstuff.
|
||||
|
||||
All Content posted to the Service in any way is the responsibility of the owner. If Content is deemed illegal by any law having jurisdiction over you, you agree that we may submit any necessary information to the proper authorities.
|
||||
|
||||
We claim no ownership or control over any Content that you post to the Service. You retain any intellectual property rights to the Content you post, in accordance with applicable law. By posting Content, you represent that you have the rights to reproduce that Content (and the right to allow us to serve such Content) without violation of the rights of any third party. You agree that you will bear any liability resulting from the posting of any Content that you do not have the rights to post.
|
||||
|
||||
You grant us a world-wide, royalty-free, and non-exclusive license to reproduce, modify, adapt and publish the Content, solely for the purpose of displaying, distributing and promoting the contents of your account, through any part of the Service including through our API, feeds, and external clients.
|
||||
|
||||
If you delete Content, we will use reasonable efforts to remove it from the Service, but you acknowledge that caching or references to the Content may not be made immediately unavailable.
|
||||
|
||||
### 3.1 Structured Data
|
||||
|
||||
There is a subset of Content which we refer to as "Structured Data". Structured Data is Content which represents simple facts, rather than creative effort. For instance, locations, dates, or the type and number of crops you have planted are Structured Data. Structured Data may be created explicitly by you or implicitly by the Website in response to your activity.
|
||||
|
||||
By using the Service, you acknowledge that Structured Data will be gathered and stored by Growstuff, and that any Structured Data pertaining to you or your activity may be made available for use by third parties under a Creative Commons Attribution ShareAlike (CC-BY-SA) license. You also agree that attribution for the Structured Data under the terms of the Creative Commons license will be given to Growstuff.
|
||||
|
||||
### 3.2 Content Posted on Other Websites
|
||||
|
||||
We have not reviewed, and cannot review, all of the material, including computer software, made available through the websites and webpages to which we, any user, or any provider of Content links, or that link to us. We do not have any control over those websites and webpages, and are not responsible for their contents or their use. By linking to an external website or webpage, we do not represent or imply that we endorse such website or webpage. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. We disclaim any responsibility for any harm resulting from your use of external websites and webpages, whether that link is provided by us or by any provider of Content on the Service.
|
||||
|
||||
### 3.3 How we deal with problem Content
|
||||
|
||||
You agree that by using the Service, you may be exposed to Content you find offensive or objectionable.
|
||||
|
||||
We do not pre-screen Content. However, you acknowledge that we have the right (but not the obligation), in our sole discretion, to remove or refuse to remove any Content from the Service. If such Content is reported to us, it will be our sole discretion as to what action, if any, should be taken.
|
||||
|
||||
If any Content you have submitted is reported to us as violating this Agreement, you agree that we may call upon you to change, modify, or remove that Content, within a reasonable amount of time, as defined by us. If you do not follow this directive, we may terminate your account.
|
||||
|
||||
## 4. Member Conduct
|
||||
|
||||
You agree that you will not use the Service to:
|
||||
|
||||
1. Upload, post, or otherwise transmit any Content that is harmful, threatening, abusive, hateful, invasive to the privacy and publicity rights of any person, or that violates any applicable local, state, national, or international law, including any regulation having the force of law;
|
||||
1. Upload, post, or otherwise transmit any Content that is spam, or contains unethical or unwanted commercial content designed to drive traffic to third party sites or boost the search engine rankings of third party sites, or to further unlawful acts (such as phishing) or mislead recipients as to the source of the material (such as spoofing);
|
||||
1. Maliciously impersonate any real person or entity, including but not limited to a Growstuff staff member or volunteer, or to otherwise misrepresent your affiliation with any person or entity;
|
||||
1. Upload, post or otherwise transmit any Content that you do not have a right to transmit under any law or under contractual or fiduciary relationships (such as inside information, proprietary and confidential information learned or disclosed as part of employment relationships or under nondisclosure agreements);
|
||||
1. Upload, post or otherwise transmit any Content that infringes any patent, trademark, trade secret, copyright, or other proprietary rights of any party;
|
||||
1. Interfere with or disrupt the Service or servers or networks connected to the Service, or disobey any requirements, procedures, policies or regulations of networks connected to the Service;
|
||||
1. Solicit passwords or personal identifying information for unintended, commercial or unlawful purposes from other users;
|
||||
1. Upload, post or otherwise transmit any Content that contains viruses, worms, malware, Trojan horses or other harmful or destructive content;
|
||||
1. Allow usage by others in such a way as to violate this Agreement;
|
||||
1. Make excessive or otherwise harmful automated use of the Service;
|
||||
1. Access any other person's account, or exceed the scope of the Service that you have signed up for; for example, accessing and using features you don't have a right to use.
|
||||
|
||||
You agree that you will abide by the Community Guidelines, which are currently available at [http://growstuff.org/policy/community](http://growstuff.org/policy/community).
|
||||
|
||||
## 5. Volunteers
|
||||
|
||||
We appreciate the service of volunteers in many aspects of Growstuff's operations. Volunteer activities include but are not limited to developing software, providing technical support, writing documentation, performing site administration duties, providing expert advice, research, technical writing, reviewing, categorizing, and other duties as necessary to support the operation of the Service.
|
||||
|
||||
All volunteers are expected to be of legal age, or volunteering with the consent of a legal parent or guardian.
|
||||
|
||||
By volunteering, you agree that any work created as a result of your volunteer activities shall be licensed to Growstuff on a perpetual, irrevocable, and world-wide basis, to the extent permitted by law. You agree that Growstuff may determine the basis upon which your volunteer work shall be licensed to others, including under Open Source or Creative Commons licenses that may permit the further alteration or dissemination of your work. If laws prevent such licensing, you agree never to sue Growstuff for the use of said work.
|
||||
|
||||
By volunteering, you agree that you are providing your work with no expectation of pay or future consideration by Growstuff. You also agree that you have taken reasonable diligence to ensure that the work is correct, accurate, and free of defect. You agree that you will not disclose or share any proprietary or confidential information you are provided with in the course of your volunteer work.
|
||||
|
||||
No user is required to volunteer, and users who do not volunteer will receive equal care, support, and attention.
|
||||
|
||||
## 6. Privacy Policy
|
||||
|
||||
Your use of the Website is governed by the Privacy Policy, currently located at [http://growstuff.org/policy/privacy](http://growstuff.org/policy/privacy).
|
||||
|
||||
## 7. API and Data Use Policy
|
||||
|
||||
Your use of our API and/or data is governed by our API and Data Use Policy, currently located at [http://growstuff.org/policy/api](http://growstuff.org/policy/api).
|
||||
|
||||
## 8. Copyright Infringement
|
||||
|
||||
If you believe that material located on the Website violates your copyright, you may notify us in accordance with our Copyright Policy, currently located at [http://growstuff.org/policy/copyright](http://growstuff.org/policy/copyright).
|
||||
|
||||
## 9. Resale of Services
|
||||
|
||||
You agree not to reproduce, duplicate, copy, sell, resell, or exploit any portion of the Service, use of the Service, or access to the Service, except as is permitted under our API and Data Use Policy, open source license pertaining to the Service's source code, or Creative Commons licenses pertaining to Content or other material posted on the Service.
|
||||
|
||||
## 10. Indemnity
|
||||
|
||||
You agree to indemnify and hold harmless Growstuff Pty Ltd, its contractors, its licensors, and their respective directors, officers, employees and agents from and against any and all claims and expenses, including attorneys' fees, arising out of your use of the Service, including but not limited to out of your violation of this Agreement.
|
||||
|
||||
## 11. Termination
|
||||
|
||||
Growstuff may terminate your account or otherwise restrict your use of the Service at any time if we believe you have violated this Agreement. If this occurs, you will be notified by email, and we will tell you which part of the Agreement we believe you violated. We may, at our discretion, choose to issue a warning rather than terminate your account, in which case you will also be notified by email and told which part of the Agreement we believe you violated. We will also provide you with a contact address where you may appeal our decision, however, we do not guarantee that we will change our minds.
|
||||
|
||||
You agree that any termination of your access to the Service may involve removing or discarding any content you have provided.
|
||||
|
||||
Paid accounts that are terminated for violations of this Agreement will only be refunded at our discretion, and only if such termination should come under our established criteria for issuing refunds.
|
||||
|
||||
We may, at our sole discretion, discontinue providing the Service at any time, with or without notice.
|
||||
|
||||
If you wish to terminate this Agreement, you may delete your account and cease using the Service. You agree that, upon deletion of your account, we may, but are not required to, remove any Content you have provided, at any time past the deletion of your account.
|
||||
|
||||
All provisions of this Agreement which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability.
|
||||
|
||||
## 12. Changes
|
||||
|
||||
We reserve the right, at our sole discretion, to modify or replace any part of this Agreement at any time. A history of changes to this Agreement is available via our public source code repository at [https://github.com/Growstuff/policy](https://github.com/Growstuff/policy). We will take reasonable steps to notify you of any substantial changes to this Agreement; however, it is your responsibility to check this Agreement periodically for changes. Your continued use of the Service following the posting of any changes to this Agreement constitutes acceptance of those changes.
|
||||
|
||||
We may also, in the future, offer new features or services through the Service. Such new features and/or services shall be subject to the terms and conditions of this Agreement.
|
||||
|
||||
## 13. Disclaimer of Warranties
|
||||
|
||||
This Service is provided "as is". Growstuff Pty Ltd and its suppliers and licensors hereby disclaim all warranties of any kind, express or implied, including, without limitation, the warranties of merchantability, fitness for a particular purpose and non-infringement. Neither Growstuff Pty Ltd nor its suppliers and licensors, makes any warranty that the Service will be error free or that access to the Service will be continuous or uninterrupted. You agree that any interruptions to the service will not qualify for reimbursement or compensation. You understand that you download from, or otherwise obtain content or services through, the Service at your own discretion and risk.
|
||||
|
||||
No advice or information, whether oral or written, obtained by you in any fashion shall create any warranty not expressly stated in this Agreement.
|
||||
|
||||
## 14. Limitation of Liability
|
||||
|
||||
You expressly understand and agree that in no event will Growstuff Pty Ltd or its suppliers or licensors, be liable with respect to any subject matter of this agreement under any contract, negligence, strict liability or other legal or equitable theory for: (i) any special, incidental or consequential damages; (ii) the cost of procurement or substitute products or services; (iii) interruption of use or loss or corruption of data; (iv) any statements or conduct of any third party on the service; or (v) any unauthorized access to or alterations of your Content. We shall have no liability for any failure or delay due to matters beyond our reasonable control.
|
||||
|
||||
The foregoing shall not apply to the extent prohibited by applicable law.
|
||||
|
||||
## 15. General Information
|
||||
|
||||
This Agreement constitutes the entire agreement between us and you concerning your use of the Service. This Agreement may only be modified by a written amendment signed by an authorized representative of Growstuff Pty Ltd, or by the posting of a revised version to this location. Except to the extent that applicable law (if any) provides otherwise, any dispute arising between you and Growstuff Pty Ltd regarding these Terms of Service and/or your use or access of the Service will be governed by the laws of the state of Victoria and the federal laws of Australia, excluding any conflict of law provisions. You agree to submit to the jurisdiction of the state and federal courts located in Melbourne, Australia for any disputes arising out of or relating to your use of the Service or your acceptance of this Agreement.
|
||||
|
||||
If any part of this Agreement is held invalid or unenforceable, that part will be construed to reflect the parties' original intent, and the remaining portions will remain in full force and effect. A waiver by either party of any term or condition of this Agreement or any breach thereof, in any one instance, will not waive such term or condition or any subsequent breach thereof.
|
||||
|
||||
The section titles in this Agreement are for convenience only and have no legal or contractual effect.
|
||||
|
||||
## 16. Reporting Violations
|
||||
|
||||
To report a violation of this agreement, please email [support@growstuff.org](support@growstuff.org).
|
||||
|
||||
## 17. Creative Commons
|
||||
|
||||
This Terms of Service document is based on one developed by Automattic ([http://wordpress.com/tos/](http://wordpress.com/tos/)) with amendments by Dreamwidth ([http://www.dreamwidth.org/legal/tos](http://www.dreamwidth.org/legal/tos)) and is licensed under a [Creative Commons Attribution-ShareAlike 2.5 License](http://creativecommons.org/licenses/by-sa/2.5/).
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
%a{:name => "comments"}
|
||||
- if post.comments
|
||||
%h2
|
||||
=pluralize(post.comments.size, "comment")
|
||||
=localize_plural(post.comments, Comment)
|
||||
- post.comments.post_order.each do |c|
|
||||
= render :partial => "comments/single", :locals => { :comment => c }
|
||||
|
||||
|
||||
@@ -9,13 +9,16 @@
|
||||
|
||||
.post-meta
|
||||
%p
|
||||
= (post.created_at == post.updated_at) ? 'Posted by' : 'Edited by'
|
||||
Posted by
|
||||
= link_to post.author.login_name, member_path(post.author)
|
||||
- if post.forum
|
||||
in
|
||||
= link_to post.forum, post.forum
|
||||
on
|
||||
= (post.created_at == post.updated_at) ? post.created_at : post.updated_at
|
||||
= post.created_at
|
||||
- if post.updated_at > post.created_at
|
||||
and edited at
|
||||
= post.updated_at
|
||||
|
||||
.post-body
|
||||
:growstuff_markdown
|
||||
@@ -24,7 +27,7 @@
|
||||
- unless defined?(hide_comments)
|
||||
.post-comments
|
||||
%ul.list-inline
|
||||
%li.first= link_to pluralize(post.comments.size, "comment"),
|
||||
%li.first= link_to localize_plural(post.comments, Comment),
|
||||
post_path(post, :anchor => 'comments')
|
||||
-if can? :create, Comment
|
||||
%li= link_to "Reply", new_comment_path(:post_id => post.id)
|
||||
|
||||
@@ -15,7 +15,10 @@
|
||||
%td.hidden-xs
|
||||
=link_to post.author, post.author
|
||||
%td
|
||||
= post.recent_activity.to_date.to_formatted_s(:short)
|
||||
- if post.updated_at > post.recent_activity
|
||||
= post.updated_at.to_date.to_formatted_s(:short)
|
||||
- else
|
||||
= post.recent_activity.to_date.to_formatted_s(:short)
|
||||
// once the site gets more active, can change this to include time as well
|
||||
// can't make it relative (distance_of_time_in_words) as it's cached
|
||||
%td.hidden-xs
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
= render :partial => 'shared/signin_signup', :locals => { :to => 'write a post' }
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @posts, :model => "posts"
|
||||
= page_entries_info @posts
|
||||
= will_paginate @posts
|
||||
|
||||
- unless @posts.empty?
|
||||
@@ -23,7 +23,7 @@
|
||||
= render :partial => "single", :locals => { :post => post, :subject => true }
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @posts, :model => "posts"
|
||||
= page_entries_info @posts
|
||||
= will_paginate @posts
|
||||
|
||||
%p
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
= content_for :title, @post.subject
|
||||
- content_for :opengraph do
|
||||
= tag("meta", property: "og:image", content: avatar_uri(@post.author, 200))
|
||||
= tag("meta", property: "og:description", content: "#{strip_tags(@post.body).split(' ')[0..20].join(' ')}...")
|
||||
= tag("meta", property: "og:title", content: @post.subject)
|
||||
= tag("meta", property: "og:type", content: "article")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
- unless current_member
|
||||
.alert.alert-info
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
- content_for :opengraph do
|
||||
- @scientific_name.crop.photos.each do |photo|
|
||||
= tag("meta", property: "og:image", content: photo.fullsize_url)
|
||||
|
||||
= tag("meta", property: "og:title", content: @scientific_name.scientific_name)
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
%p#notice= notice
|
||||
|
||||
= render :partial => 'crops/approval_status_message', :locals => { :crop => @scientific_name.crop }
|
||||
|
||||
@@ -16,24 +16,29 @@
|
||||
Can't find what you're looking for?
|
||||
= link_to "Request new crops.", new_crop_path
|
||||
.form-group
|
||||
= f.label :quantity, 'Quantity:', :class => 'control-label col-md-2', :placeholder => 'optional'
|
||||
= f.label :quantity, 'Quantity:', :class => 'control-label col-md-2'
|
||||
.col-md-2
|
||||
= f.number_field :quantity, :class => 'form-control', placeholder: 'optional'
|
||||
= f.number_field :quantity, :class => 'form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
.form-group
|
||||
= f.label :plant_before, 'Plant before:', :class => 'control-label col-md-2'
|
||||
.col-md-2
|
||||
= f.text_field :plant_before, :class => 'add-datepicker form-control', :value => @seed.plant_before ? @seed.plant_before.to_s(:ymd) : '', placeholder: 'optional'
|
||||
= f.text_field :plant_before, :class => 'add-datepicker form-control', :value => @seed.plant_before ? @seed.plant_before.to_s(:ymd) : ''
|
||||
= render :partial => 'shared/form_optional'
|
||||
.form-group
|
||||
= f.label :days_until_maturity_min, 'Days until maturity:', :class => 'control-label col-md-2', :placeholder => 'optional'
|
||||
= f.label :days_until_maturity_min, 'Days until maturity:', :class => 'control-label col-md-2'
|
||||
%fieldset
|
||||
.col-md-2
|
||||
= f.number_field :days_until_maturity_min, :class => 'form-control', placeholder: 'optional'
|
||||
= f.number_field :days_until_maturity_min, :class => 'form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
.col-md-1
|
||||
= f.label :days_until_maturity_max, 'to', :class => 'control-label'
|
||||
.col-md-2
|
||||
= f.number_field :days_until_maturity_max, :class => 'form-control', placeholder: 'optional'
|
||||
= f.number_field :days_until_maturity_max, :class => 'form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
.col-md-1
|
||||
= f.label :dummy, 'days', :class => 'control-label'
|
||||
|
||||
.form-group.required
|
||||
= f.label :organic, 'Organic?', :class => 'control-label col-md-2'
|
||||
.col-md-8
|
||||
@@ -49,15 +54,12 @@
|
||||
.form-group
|
||||
= f.label :description, 'Description:', :class => 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_area :description, :rows => 6, :class => 'form-control', :placeholder => 'optional'
|
||||
= f.text_area :description, :rows => 6, :class => 'form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
.form-group
|
||||
.col-md-offset-2.col-md-8
|
||||
%span.help-block
|
||||
Are you interested in trading or swapping seeds with other
|
||||
#{ENV['GROWSTUFF_SITE_NAME']} members? If you
|
||||
list your seeds as available for trade, other members can
|
||||
contact you to request seeds. You can list any conditions or
|
||||
other information in the description, above.
|
||||
= t('.trade_help', :site_name => ENV['GROWSTUFF_SITE_NAME'])
|
||||
.form-group.required
|
||||
= f.label :tradable_to, 'Will trade:', :class => 'control-label col-md-2'
|
||||
.col-md-8
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
.panel.panel-success
|
||||
.panel-heading
|
||||
%h3.panel-title
|
||||
= link_to "#{seed.owner.login_name}'s seed", seed.owner
|
||||
= link_to "#{seed.owner.login_name}'s seed", seed
|
||||
- if can? :edit, seed
|
||||
%a.pull-right{:href => edit_seed_path(seed), :role => "button", :id => "edit_seed_glyphicon"}
|
||||
%span.glyphicon.glyphicon-pencil{:title => "Edit"}
|
||||
@@ -21,6 +21,8 @@
|
||||
%dd= seed.tradable_to
|
||||
%dt From location :
|
||||
%dd= seed.owner.location
|
||||
%dt Owner :
|
||||
%dd= link_to seed.owner.login_name, seed.owner
|
||||
.panel-footer
|
||||
%dt Description
|
||||
%dd
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
= render :partial => 'shared/signin_signup', :locals => { :to => 'add seeds to your stash' }
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @seeds, :model => "seeds"
|
||||
= page_entries_info @seeds
|
||||
= will_paginate @seeds
|
||||
.row
|
||||
- if @seeds.size > 0
|
||||
@@ -30,7 +30,7 @@
|
||||
=render :partial => 'seeds/thumbnail', :locals => {:seed => seed}
|
||||
|
||||
%div.pagination
|
||||
= page_entries_info @seeds, :model => "seeds"
|
||||
= page_entries_info @seeds
|
||||
= will_paginate @seeds
|
||||
|
||||
%ul.list-inline
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user