mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-05-25 09:19:15 -04:00
Compare commits
156 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9ff468aa50 | ||
|
|
4261f16cd0 | ||
|
|
b8884beb2f | ||
|
|
bc88c4d8c7 | ||
|
|
3ac4fbcdb8 | ||
|
|
549426e3e0 | ||
|
|
25a1f0da9a | ||
|
|
3be2fc6241 | ||
|
|
837934167b | ||
|
|
d43d8ae0e7 | ||
|
|
035b2399ca | ||
|
|
1a3e976ba5 | ||
|
|
d31739f86a | ||
|
|
0f523381f0 | ||
|
|
550848a513 | ||
|
|
ae3752e021 | ||
|
|
50624fb2cb | ||
|
|
818466a142 | ||
|
|
e184503caa | ||
|
|
d00f743c47 | ||
|
|
b19a991106 | ||
|
|
88e019a19f | ||
|
|
e954ba801b | ||
|
|
be23bfc419 | ||
|
|
5e984ce04a | ||
|
|
d15eb32133 | ||
|
|
21f11a4d5d | ||
|
|
ae398f1a63 | ||
|
|
cd3cee5d5f | ||
|
|
9030e5b978 | ||
|
|
9d6ac9fd8b | ||
|
|
403a8814e1 | ||
|
|
00c34ef30c | ||
|
|
738c0d4e08 | ||
|
|
82e27f8a71 | ||
|
|
fbc203ca0d | ||
|
|
c83bfc101e | ||
|
|
22905235c1 | ||
|
|
4d3b94b7f0 | ||
|
|
9e19aae0ca | ||
|
|
d8c3f7ed34 | ||
|
|
28a6cfe25c | ||
|
|
630d539f7d | ||
|
|
4704bd89f8 | ||
|
|
076695d349 | ||
|
|
3925a54340 | ||
|
|
6c566c56d8 | ||
|
|
bcc89674d4 | ||
|
|
e1dab634a2 | ||
|
|
e06e002282 | ||
|
|
23ed7f91ba | ||
|
|
aa511aedb4 | ||
|
|
2b03381a24 | ||
|
|
6017c4ba23 | ||
|
|
a46b8ebe76 | ||
|
|
a4f8b3a0e6 | ||
|
|
1b8c413b90 | ||
|
|
7a334abf1d | ||
|
|
5c067c87b8 | ||
|
|
87bc1becb0 | ||
|
|
7c0d6c04df | ||
|
|
01415fd04f | ||
|
|
e0def646ce | ||
|
|
a52731dc4b | ||
|
|
cd2500c99a | ||
|
|
c9a197bc61 | ||
|
|
c5439c8650 | ||
|
|
6d0a7ebc8f | ||
|
|
0d1bab04d5 | ||
|
|
e6b23262da | ||
|
|
06ea3db252 | ||
|
|
8d24ffbffb | ||
|
|
cce9f513db | ||
|
|
c37ba9f041 | ||
|
|
f8c56cc217 | ||
|
|
d11e6f484a | ||
|
|
9218a03e2b | ||
|
|
da760a8a4c | ||
|
|
9ccecf0e04 | ||
|
|
5ec105ad19 | ||
|
|
5c1f5f4312 | ||
|
|
48d3a64e7b | ||
|
|
decd48a970 | ||
|
|
540ac7b034 | ||
|
|
8112133cf2 | ||
|
|
55f00ed0f8 | ||
|
|
d0999c2f9a | ||
|
|
47150a8ad8 | ||
|
|
9301688763 | ||
|
|
248b89a564 | ||
|
|
8e9ffac64e | ||
|
|
65024d8f83 | ||
|
|
8ab70a1c1c | ||
|
|
2c871abd03 | ||
|
|
8b4491d0ab | ||
|
|
93202fc13c | ||
|
|
0f520c0928 | ||
|
|
21c989989c | ||
|
|
123c34b6d1 | ||
|
|
f5e786401d | ||
|
|
6ecb919f34 | ||
|
|
c89d1ae94e | ||
|
|
9b7a7d3e8f | ||
|
|
9ebe830402 | ||
|
|
9a0adadc9a | ||
|
|
92c3976f0a | ||
|
|
01c25df8cf | ||
|
|
9ae35ca6eb | ||
|
|
43f9707c11 | ||
|
|
4fa423bcab | ||
|
|
97d0bb6752 | ||
|
|
b9edd2f89b | ||
|
|
4bd50ca433 | ||
|
|
a2dd675717 | ||
|
|
1275aa0102 | ||
|
|
f40ff18949 | ||
|
|
f25d4dbf8c | ||
|
|
4dd99f54db | ||
|
|
b8e06a1d1d | ||
|
|
f7b8113af1 | ||
|
|
b0394d1028 | ||
|
|
fa0c00aa9c | ||
|
|
a507eb47bf | ||
|
|
865f323f97 | ||
|
|
c82f47bdda | ||
|
|
72d0514e75 | ||
|
|
dc62365c7d | ||
|
|
d8d94d178c | ||
|
|
6afb12c157 | ||
|
|
a0be52fdaa | ||
|
|
6b8474e01b | ||
|
|
23ae7fcd8c | ||
|
|
179cfbf6bc | ||
|
|
b5f82a8fc8 | ||
|
|
54c01cbd82 | ||
|
|
cf9e5a6652 | ||
|
|
01c6a6da9f | ||
|
|
cc1daf8f6b | ||
|
|
a0bf815663 | ||
|
|
ce573c1e55 | ||
|
|
be2426c99f | ||
|
|
d301f2f2ae | ||
|
|
2accb727e5 | ||
|
|
16db285898 | ||
|
|
b8c0882642 | ||
|
|
cc54dc54b4 | ||
|
|
3f8ebdc477 | ||
|
|
68120c5bbe | ||
|
|
71ec9fd2d3 | ||
|
|
f11bc42507 | ||
|
|
7672b9ffc8 | ||
|
|
8d237cc2ee | ||
|
|
a875a7c883 | ||
|
|
19d65587be | ||
|
|
3fed962dcc | ||
|
|
987f50c87e |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -14,4 +14,5 @@ Pathogen:
|
||||
custom_plan.rb
|
||||
zeus.json
|
||||
.bundle
|
||||
.idea/**
|
||||
.idea/**
|
||||
public/**
|
||||
|
||||
@@ -32,7 +32,7 @@ Metrics/MethodLength:
|
||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods'
|
||||
# Set to 30 once all methods are fixed.
|
||||
# Max: 30
|
||||
Max: 104
|
||||
Max: 34
|
||||
|
||||
# Remove the following once the code style matches
|
||||
# Offense count: 59
|
||||
|
||||
@@ -55,7 +55,7 @@ Lint/Void:
|
||||
# Offense count: 55
|
||||
# Configuration parameters: CountComments, ExcludedMethods.
|
||||
Metrics/BlockLength:
|
||||
Exclude:
|
||||
Exclude:
|
||||
- '**/*'
|
||||
|
||||
# Offense count: 2
|
||||
@@ -65,19 +65,6 @@ Performance/StringReplacement:
|
||||
- 'app/models/planting.rb'
|
||||
- 'spec/rails_helper.rb'
|
||||
|
||||
# Offense count: 9
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: strict, flexible
|
||||
Rails/Date:
|
||||
Exclude:
|
||||
- 'app/controllers/harvests_controller.rb'
|
||||
- 'db/seeds.rb'
|
||||
- 'lib/tasks/growstuff.rake'
|
||||
- 'spec/controllers/plantings_controller_spec.rb'
|
||||
- 'spec/factories/planting.rb'
|
||||
- 'spec/features/plantings/planting_a_crop_spec.rb'
|
||||
- 'spec/features/shared_examples/append_date.rb'
|
||||
|
||||
# Offense count: 4
|
||||
Rails/FilePath:
|
||||
Exclude:
|
||||
@@ -90,13 +77,6 @@ Rails/OutputSafety:
|
||||
- 'app/helpers/auto_suggest_helper.rb'
|
||||
- 'app/helpers/gardens_helper.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Configuration parameters: Include.
|
||||
# Include: db/migrate/*.rb
|
||||
Rails/ReversibleMigration:
|
||||
Exclude:
|
||||
- 'db/migrate/20130215131921_rename_notification_fields.rb'
|
||||
|
||||
# Offense count: 4
|
||||
# Configuration parameters: Blacklist.
|
||||
# Blacklist: decrement!, decrement_counter, increment!, increment_counter, toggle!, touch, update_all, update_attribute, update_column, update_columns, update_counters
|
||||
@@ -148,11 +128,9 @@ Style/BarePercentLiterals:
|
||||
# IgnoredMethods: lambda, proc, it
|
||||
Style/BlockDelimiters:
|
||||
Exclude:
|
||||
- 'app/controllers/alternate_names_controller.rb'
|
||||
- 'app/controllers/members_controller.rb'
|
||||
- 'app/controllers/posts_controller.rb'
|
||||
- 'app/controllers/scientific_names_controller.rb'
|
||||
- 'spec/controllers/harvests_controller_spec.rb'
|
||||
- 'spec/controllers/order_items_controller_spec.rb'
|
||||
- 'spec/features/notifications_spec.rb'
|
||||
- 'spec/models/ability_spec.rb'
|
||||
@@ -204,12 +182,6 @@ Style/CommentAnnotation:
|
||||
Exclude:
|
||||
- 'app/controllers/crops_controller.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
Style/DefWithParentheses:
|
||||
Exclude:
|
||||
- 'spec/views/posts/_single.html.haml_spec.rb'
|
||||
|
||||
# Offense count: 10
|
||||
# Cop supports --auto-correct.
|
||||
Style/EachForSimpleLoop:
|
||||
@@ -225,7 +197,6 @@ Style/EmptyMethod:
|
||||
Exclude:
|
||||
- 'app/controllers/account_types_controller.rb'
|
||||
- 'app/controllers/accounts_controller.rb'
|
||||
- 'app/controllers/alternate_names_controller.rb'
|
||||
- 'app/controllers/gardens_controller.rb'
|
||||
- 'app/controllers/photos_controller.rb'
|
||||
- 'app/controllers/plant_parts_controller.rb'
|
||||
@@ -269,31 +240,6 @@ Style/Lambda:
|
||||
- 'spec/controllers/member_controller_spec.rb'
|
||||
- 'spec/models/photo_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
# Cop supports --auto-correct.
|
||||
Style/MethodCallWithoutArgsParentheses:
|
||||
Exclude:
|
||||
- 'spec/helpers/application_helper_spec.rb'
|
||||
- 'spec/views/plantings/new.html.haml_spec.rb'
|
||||
|
||||
# Offense count: 8
|
||||
# Cop supports --auto-correct.
|
||||
Style/MultilineBlockLayout:
|
||||
Exclude:
|
||||
- 'app/controllers/members_controller.rb'
|
||||
- 'app/controllers/posts_controller.rb'
|
||||
- 'spec/models/ability_spec.rb'
|
||||
- 'spec/models/member_spec.rb'
|
||||
- 'spec/models/planting_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: symmetrical, new_line, same_line
|
||||
Style/MultilineHashBraceLayout:
|
||||
Exclude:
|
||||
- 'app/models/planting.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
Style/MultilineIfModifier:
|
||||
@@ -307,54 +253,6 @@ Style/MultilineIfThen:
|
||||
- 'script/check_contributors_md'
|
||||
- 'script/gemfile_check'
|
||||
|
||||
# Offense count: 95
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: symmetrical, new_line, same_line
|
||||
Style/MultilineMethodCallBraceLayout:
|
||||
Exclude:
|
||||
- 'app/controllers/application_controller.rb'
|
||||
- 'app/controllers/authentications_controller.rb'
|
||||
- 'app/controllers/seeds_controller.rb'
|
||||
- 'spec/controllers/order_items_controller_spec.rb'
|
||||
- 'spec/helpers/gardens_helper_spec.rb'
|
||||
- 'spec/helpers/harvests_helper_spec.rb'
|
||||
- 'spec/helpers/plantings_helper_spec.rb'
|
||||
- 'spec/helpers/seeds_helper_spec.rb'
|
||||
- 'spec/models/ability_spec.rb'
|
||||
- 'spec/models/crop_spec.rb'
|
||||
- 'spec/models/harvest_spec.rb'
|
||||
- 'spec/models/member_spec.rb'
|
||||
- 'spec/models/order_spec.rb'
|
||||
- 'spec/models/plant_part_spec.rb'
|
||||
- 'spec/models/planting_spec.rb'
|
||||
- 'spec/models/post_spec.rb'
|
||||
- 'spec/views/account_types/edit.html.haml_spec.rb'
|
||||
- 'spec/views/account_types/new.html.haml_spec.rb'
|
||||
- 'spec/views/account_types/show.html.haml_spec.rb'
|
||||
- 'spec/views/crops/_grown_for.html.haml_spec.rb'
|
||||
- 'spec/views/crops/_planting_advice.html.haml_spec.rb'
|
||||
- 'spec/views/forums/edit.html.haml_spec.rb'
|
||||
- 'spec/views/harvests/index.html.haml_spec.rb'
|
||||
- 'spec/views/orders/show.html.haml_spec.rb'
|
||||
- 'spec/views/photos/edit.html.haml_spec.rb'
|
||||
- 'spec/views/plant_parts/edit.html.haml_spec.rb'
|
||||
- 'spec/views/plant_parts/new.html.haml_spec.rb'
|
||||
- 'spec/views/plantings/_form.html.haml_spec.rb'
|
||||
- 'spec/views/plantings/edit.html.haml_spec.rb'
|
||||
- 'spec/views/plantings/index.html.haml_spec.rb'
|
||||
- 'spec/views/plantings/new.html.haml_spec.rb'
|
||||
- 'spec/views/plantings/show.html.haml_spec.rb'
|
||||
- 'spec/views/posts/edit.html.haml_spec.rb'
|
||||
- 'spec/views/products/edit.html.haml_spec.rb'
|
||||
- 'spec/views/products/new.html.haml_spec.rb'
|
||||
- 'spec/views/roles/edit.html.haml_spec.rb'
|
||||
- 'spec/views/roles/index.html.haml_spec.rb'
|
||||
- 'spec/views/roles/new.html.haml_spec.rb'
|
||||
- 'spec/views/roles/show.html.haml_spec.rb'
|
||||
- 'spec/views/scientific_names/edit.html.haml_spec.rb'
|
||||
- 'spec/views/scientific_names/show.html.haml_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
Style/MultilineTernaryOperator:
|
||||
Exclude:
|
||||
@@ -377,7 +275,6 @@ Style/NegatedIf:
|
||||
# Offense count: 2
|
||||
Style/NestedTernaryOperator:
|
||||
Exclude:
|
||||
- 'app/controllers/harvests_controller.rb'
|
||||
- 'app/controllers/plantings_controller.rb'
|
||||
|
||||
# Offense count: 1
|
||||
@@ -425,15 +322,6 @@ Style/ParallelAssignment:
|
||||
Exclude:
|
||||
- 'app/mailers/notifier.rb'
|
||||
|
||||
# Offense count: 4
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowSafeAssignment.
|
||||
Style/ParenthesesAroundCondition:
|
||||
Exclude:
|
||||
- 'app/controllers/application_controller.rb'
|
||||
- 'app/controllers/orders_controller.rb'
|
||||
- 'app/helpers/crops_helper.rb'
|
||||
- 'config/factory_girl.rb'
|
||||
|
||||
# Offense count: 5
|
||||
# Cop supports --auto-correct.
|
||||
@@ -506,44 +394,12 @@ Style/TernaryParentheses:
|
||||
Exclude:
|
||||
- 'app/helpers/plantings_helper.rb'
|
||||
|
||||
# Offense count: 4
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline.
|
||||
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
||||
Style/TrailingCommaInArguments:
|
||||
Exclude:
|
||||
- 'db/seeds.rb'
|
||||
- 'lib/actions/oauth_signup_action.rb'
|
||||
- 'lib/tasks/growstuff.rake'
|
||||
|
||||
# Offense count: 4
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline.
|
||||
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
||||
Style/TrailingCommaInLiteral:
|
||||
Exclude:
|
||||
- 'config/environments/test.rb'
|
||||
- 'spec/rails_helper.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
Style/UnlessElse:
|
||||
Exclude:
|
||||
- 'app/controllers/omniauth_callbacks_controller.rb'
|
||||
|
||||
# Offense count: 12
|
||||
# Cop supports --auto-correct.
|
||||
Style/UnneededInterpolation:
|
||||
Exclude:
|
||||
- 'spec/features/crops/crop_wranglers_spec.rb'
|
||||
- 'spec/features/following_spec.rb'
|
||||
- 'spec/features/shared_examples/append_date.rb'
|
||||
- 'spec/models/crop_spec.rb'
|
||||
- 'spec/models/forum_spec.rb'
|
||||
- 'spec/models/member_spec.rb'
|
||||
- 'spec/models/plant_part_spec.rb'
|
||||
- 'spec/views/layouts/_header_spec.rb'
|
||||
|
||||
# Offense count: 3
|
||||
# Cop supports --auto-correct.
|
||||
Style/UnneededPercentQ:
|
||||
|
||||
31
.travis.yml
31
.travis.yml
@@ -4,12 +4,16 @@ cache:
|
||||
bundler: true
|
||||
directories:
|
||||
- travis_phantomjs
|
||||
- tmp/cache/assets/test/sprockets
|
||||
env:
|
||||
matrix:
|
||||
- GROWSTUFF_SITE_NAME="Growstuff (travis)" RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' GROWSTUFF_ELASTICSEARCH='true'
|
||||
- GROWSTUFF_SITE_NAME="Growstuff (travis)" RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' GROWSTUFF_ELASTICSEARCH='false'
|
||||
- GROWSTUFF_ELASTICSEARCH='true' RSPEC_TAG=elasticsearch
|
||||
- GROWSTUFF_ELASTICSEARCH='false' RSPEC_TAG=~elasticsearch
|
||||
- STATIC_CHECKS='true'
|
||||
global:
|
||||
secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
|
||||
- GROWSTUFF_SITE_NAME="Growstuff (travis)"
|
||||
- RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
|
||||
- secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
|
||||
rvm:
|
||||
- 2.3.3
|
||||
before_install:
|
||||
@@ -24,15 +28,20 @@ before_install:
|
||||
fi
|
||||
- phantomjs --version
|
||||
before_script:
|
||||
- bundle exec rake db:create db:migrate db:test:prepare
|
||||
- bundle exec rake assets:precompile
|
||||
- >
|
||||
if [ "$STATIC_CHECKS" != 'true' ]; then
|
||||
bundle exec rake db:create db:migrate db:test:prepare
|
||||
bundle exec rake assets:precompile
|
||||
fi
|
||||
script:
|
||||
- bundle exec rubocop --display-cop-names --rails
|
||||
- bundle exec haml-lint app/views/account_types app/views/admin app/views/alternate_names app/views/account_types app/views/comments app/views/crops app/views/forums app/views/gardens app/views/harvests app/views/notifier app/views/orders app/views/photos
|
||||
- script/gemfile_check
|
||||
- bundle exec script/check_contributors_md
|
||||
- bundle exec rake db:migrate --trace
|
||||
- bundle exec rspec spec/
|
||||
- >
|
||||
if [ "$STATIC_CHECKS" = 'true' ]; then
|
||||
bundle exec script/check_static
|
||||
else
|
||||
bundle exec rake db:migrate --trace
|
||||
bundle exec rspec --tag $RSPEC_TAG spec/
|
||||
bundle exec rake jasmine:ci
|
||||
fi
|
||||
services:
|
||||
- elasticsearch
|
||||
before_deploy:
|
||||
|
||||
@@ -7,7 +7,27 @@ When you create a pull request, please include the following:
|
||||
* Make sure you have automated tests for your work, where possible.
|
||||
* Add your name (and that of your pair partner, if any) to [CONTRIBUTORS.md](CONTRIBUTORS.md).
|
||||
|
||||
If you would like to discuss your work before submitting a pull request,
|
||||
please join any of our [Discussion
|
||||
forums](http://wiki.growstuff.org/index.php/Discussion_forums), where
|
||||
our dev team will be happy to help you.
|
||||
All pull requests should pass our automatic continuous integration and style
|
||||
checks before being merged. You can run tests locally as follows:
|
||||
|
||||
- `rake` to run all tests and static checks
|
||||
- `rake spec` to run all Ruby tests
|
||||
- `rake spec:models` to run Ruby model tests (or `rake spec:views` for view tests, etc)
|
||||
- `rake static` to run all static checks (code style, unfixed Git conflicts, etc)
|
||||
- `rake jasmine:ci` to run JavaScript unit tests in headless mode
|
||||
- `rake jasmine` to start a server for running JavaScript unit tests in a
|
||||
browser (eg for debugging). Point your browser at http://localhost:8888 to
|
||||
run the tests.
|
||||
- `rspec ./spec/path/to/my_spec.rb` to run all Ruby tests in the file `my_spec.rb`
|
||||
- `rspec ./spec/path/to/my_spec.rb:45` to run the Ruby test starting on line 45 of
|
||||
`my_spec.rb`. RSpec will output a list of command-lines in this form for all
|
||||
failing tests so you can easily re-run particular ones.
|
||||
- `rspec --only-failures` to re-run all Ruby tests that failed last time.
|
||||
|
||||
You can run `rake -T` to see a list of available Rake tasks. If you can't get
|
||||
some tests to pass, please submit a pull request anyway - we'll be happy to
|
||||
help you debug the failures.
|
||||
|
||||
If you would like to discuss an idea before submitting a pull request,
|
||||
please open a [GitHub Issue](https://github.com/growstuff/growstuff/issues),
|
||||
where our dev team will be happy to help you.
|
||||
|
||||
3
Gemfile
3
Gemfile
@@ -27,7 +27,7 @@ gem 'csv_shaper' # CSV export
|
||||
gem 'figaro' # for handling config via ENV variables
|
||||
gem 'gibbon', '~>1.2.0' # for Mailchimp newsletter subscriptions
|
||||
gem 'leaflet-markercluster-rails'
|
||||
gem 'leaflet-rails'
|
||||
gem 'leaflet-rails', '~> 0.7.7' # Newer versions break tests - see https://travis-ci.org/CloCkWeRX/growstuff/builds/200984350
|
||||
gem 'pg'
|
||||
gem 'ruby-units' # for unit conversion
|
||||
gem 'unicorn' # http server
|
||||
@@ -80,6 +80,7 @@ gem 'd3-rails'
|
||||
# See https://github.com/elastic/elasticsearch-ruby#compatibility
|
||||
gem "elasticsearch-api", "~> 2.0.0"
|
||||
gem "elasticsearch-model"
|
||||
gem "hashie", ">= 3.5.3"
|
||||
gem "elasticsearch-rails"
|
||||
|
||||
gem 'rake', '>= 10.0.0'
|
||||
|
||||
71
Gemfile.lock
71
Gemfile.lock
@@ -30,7 +30,7 @@ GEM
|
||||
activejob (4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
globalid (>= 0.3.0)
|
||||
activemerchant (1.61.0)
|
||||
activemerchant (1.63.0)
|
||||
activesupport (>= 3.2.14, < 5.1)
|
||||
builder (>= 2.1.2, < 4.0.0)
|
||||
i18n (>= 0.6.9)
|
||||
@@ -71,11 +71,11 @@ GEM
|
||||
bootstrap-sass (3.3.7)
|
||||
autoprefixer-rails (>= 5.2.1)
|
||||
sass (>= 3.3.4)
|
||||
bootstrap_form (2.5.3)
|
||||
bootstrap_form (2.6.0)
|
||||
builder (3.2.3)
|
||||
byebug (9.0.6)
|
||||
cancancan (1.15.0)
|
||||
capybara (2.10.1)
|
||||
cancancan (1.16.0)
|
||||
capybara (2.12.0)
|
||||
addressable
|
||||
mime-types (>= 1.16)
|
||||
nokogiri (>= 1.3.3)
|
||||
@@ -88,7 +88,7 @@ GEM
|
||||
capybara-screenshot (1.0.14)
|
||||
capybara (>= 1.0, < 3)
|
||||
launchy
|
||||
childprocess (0.5.9)
|
||||
childprocess (0.6.1)
|
||||
ffi (~> 1.0, >= 1.0.11)
|
||||
climate_control (0.1.0)
|
||||
cliver (0.3.2)
|
||||
@@ -148,17 +148,17 @@ GEM
|
||||
json
|
||||
thread
|
||||
thread_safe
|
||||
elasticsearch (2.0.0)
|
||||
elasticsearch-api (= 2.0.0)
|
||||
elasticsearch-transport (= 2.0.0)
|
||||
elasticsearch-api (2.0.0)
|
||||
elasticsearch (2.0.1)
|
||||
elasticsearch-api (= 2.0.1)
|
||||
elasticsearch-transport (= 2.0.1)
|
||||
elasticsearch-api (2.0.1)
|
||||
multi_json
|
||||
elasticsearch-model (0.1.9)
|
||||
activesupport (> 3)
|
||||
elasticsearch (> 0.4)
|
||||
hashie
|
||||
elasticsearch-rails (0.1.9)
|
||||
elasticsearch-transport (2.0.0)
|
||||
elasticsearch-transport (2.0.1)
|
||||
faraday
|
||||
multi_json
|
||||
erubis (2.7.0)
|
||||
@@ -175,12 +175,12 @@ GEM
|
||||
figaro (1.1.1)
|
||||
thor (~> 0.14)
|
||||
flickraw (0.9.9)
|
||||
font-awesome-sass (4.6.2)
|
||||
font-awesome-sass (4.7.0)
|
||||
sass (>= 3.2)
|
||||
formatador (0.2.5)
|
||||
friendly_id (5.0.5)
|
||||
activerecord (>= 4.0.0)
|
||||
geocoder (1.4.1)
|
||||
geocoder (1.4.3)
|
||||
gibbon (1.2.1)
|
||||
httparty
|
||||
multi_json (>= 1.9.0)
|
||||
@@ -189,7 +189,7 @@ GEM
|
||||
gravatar-ultimate (2.0.0)
|
||||
activesupport (>= 2.3.14)
|
||||
rack
|
||||
guard (2.14.0)
|
||||
guard (2.14.1)
|
||||
formatador (>= 0.2.4)
|
||||
listen (>= 2.7, < 4.0)
|
||||
lumberjack (~> 1.0)
|
||||
@@ -222,7 +222,7 @@ GEM
|
||||
rake (>= 10, < 13)
|
||||
rubocop (>= 0.47.0)
|
||||
sysexits (~> 1.1)
|
||||
hashie (3.4.6)
|
||||
hashie (3.5.3)
|
||||
heroku-api (0.4.2)
|
||||
excon (~> 0.45)
|
||||
multi_json (~> 1.8)
|
||||
@@ -234,8 +234,8 @@ GEM
|
||||
ruby_parser (~> 3.5)
|
||||
httparty (0.14.0)
|
||||
multi_xml (>= 0.5.2)
|
||||
i18n (0.7.0)
|
||||
i18n-tasks (0.9.9)
|
||||
i18n (0.8.0)
|
||||
i18n-tasks (0.9.12)
|
||||
activesupport (>= 4.0.2)
|
||||
ast (>= 2.1.0)
|
||||
easy_translate (>= 0.5.0)
|
||||
@@ -265,7 +265,7 @@ GEM
|
||||
kaminari (0.17.0)
|
||||
actionpack (>= 3.0.0)
|
||||
activesupport (>= 3.0.0)
|
||||
kgio (2.10.0)
|
||||
kgio (2.11.0)
|
||||
kramdown (1.13.2)
|
||||
launchy (2.4.3)
|
||||
addressable (~> 2.3)
|
||||
@@ -295,7 +295,7 @@ GEM
|
||||
multi_xml (0.6.0)
|
||||
multipart-post (2.0.0)
|
||||
nenv (0.3.0)
|
||||
newrelic_rpm (3.17.1.326)
|
||||
newrelic_rpm (3.18.1.330)
|
||||
nokogiri (1.6.8.1)
|
||||
mini_portile2 (~> 2.1.0)
|
||||
notiffany (0.1.1)
|
||||
@@ -332,13 +332,13 @@ GEM
|
||||
cocaine (~> 0.5.5)
|
||||
mime-types
|
||||
mimemagic (~> 0.3.0)
|
||||
parser (2.3.3.1)
|
||||
parser (2.4.0.0)
|
||||
ast (~> 2.2)
|
||||
pg (0.19.0)
|
||||
phantomjs (2.1.1.0)
|
||||
plupload-rails (1.2.1)
|
||||
rails (>= 3.1)
|
||||
poltergeist (1.11.0)
|
||||
poltergeist (1.13.0)
|
||||
capybara (~> 2.1)
|
||||
cliver (~> 0.3.1)
|
||||
websocket-driver (>= 0.2.0)
|
||||
@@ -391,9 +391,9 @@ GEM
|
||||
raindrops (0.17.0)
|
||||
rake (12.0.0)
|
||||
rb-fsevent (0.9.8)
|
||||
rb-inotify (0.9.7)
|
||||
rb-inotify (0.9.8)
|
||||
ffi (>= 0.5.0)
|
||||
redis (3.3.2)
|
||||
redis (3.3.3)
|
||||
responders (2.3.0)
|
||||
railties (>= 4.2.0, < 5.1)
|
||||
rspec (3.5.0)
|
||||
@@ -432,7 +432,7 @@ GEM
|
||||
ruby_dep (1.5.0)
|
||||
ruby_parser (3.8.4)
|
||||
sexp_processor (~> 4.1)
|
||||
rubyzip (1.2.0)
|
||||
rubyzip (1.2.1)
|
||||
sass (3.4.23)
|
||||
sass-rails (5.0.6)
|
||||
railties (>= 4.0.0, < 6)
|
||||
@@ -440,26 +440,22 @@ GEM
|
||||
sprockets (>= 2.8, < 4.0)
|
||||
sprockets-rails (>= 2.0, < 4.0)
|
||||
tilt (>= 1.1, < 3)
|
||||
selenium-webdriver (3.0.5)
|
||||
selenium-webdriver (3.0.8)
|
||||
childprocess (~> 0.5)
|
||||
rubyzip (~> 1.0)
|
||||
websocket (~> 1.0)
|
||||
sexp_processor (4.7.0)
|
||||
shellany (0.0.1)
|
||||
sidekiq (4.1.4)
|
||||
sidekiq (4.2.9)
|
||||
concurrent-ruby (~> 1.0)
|
||||
connection_pool (~> 2.2, >= 2.2.0)
|
||||
rack-protection (>= 1.5.0)
|
||||
redis (~> 3.2, >= 3.2.1)
|
||||
sinatra (>= 1.4.7)
|
||||
simplecov (0.12.0)
|
||||
docile (~> 1.1.0)
|
||||
json (>= 1.8, < 3)
|
||||
simplecov-html (~> 0.10.0)
|
||||
simplecov-html (0.10.0)
|
||||
sinatra (1.4.7)
|
||||
rack (~> 1.5)
|
||||
rack-protection (~> 1.4)
|
||||
tilt (>= 1.3, < 3)
|
||||
slop (3.6.0)
|
||||
sparkpost_rails (1.4.0)
|
||||
rails (>= 4.0, < 5.1)
|
||||
@@ -478,8 +474,8 @@ GEM
|
||||
thor (0.19.4)
|
||||
thread (0.2.2)
|
||||
thread_safe (0.3.5)
|
||||
tilt (2.0.5)
|
||||
tins (1.13.0)
|
||||
tilt (2.0.6)
|
||||
tins (1.13.2)
|
||||
trollop (1.16.2)
|
||||
tzinfo (1.2.2)
|
||||
thread_safe (~> 0.1)
|
||||
@@ -487,17 +483,17 @@ GEM
|
||||
execjs (>= 0.3.0)
|
||||
json (>= 1.8.0)
|
||||
unicode-display_width (1.1.3)
|
||||
unicorn (5.1.0)
|
||||
unicorn (5.2.0)
|
||||
kgio (~> 2.6)
|
||||
raindrops (~> 0.7)
|
||||
warden (1.2.6)
|
||||
warden (1.2.7)
|
||||
rack (>= 1.0)
|
||||
webrat (0.7.3)
|
||||
nokogiri (>= 1.2.0)
|
||||
rack (>= 1.0)
|
||||
rack-test (>= 0.5.3)
|
||||
websocket (1.2.3)
|
||||
websocket-driver (0.6.4)
|
||||
websocket (1.2.4)
|
||||
websocket-driver (0.6.5)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.2)
|
||||
will_paginate (3.1.5)
|
||||
@@ -550,6 +546,7 @@ DEPENDENCIES
|
||||
haml-i18n-extractor
|
||||
haml-rails
|
||||
haml_lint
|
||||
hashie (>= 3.5.3)
|
||||
heroku-api
|
||||
i18n-tasks
|
||||
jasmine
|
||||
@@ -558,7 +555,7 @@ DEPENDENCIES
|
||||
js-routes
|
||||
kaminari
|
||||
leaflet-markercluster-rails
|
||||
leaflet-rails
|
||||
leaflet-rails (~> 0.7.7)
|
||||
letter_opener
|
||||
memcachier
|
||||
newrelic_rpm
|
||||
|
||||
@@ -11,7 +11,7 @@ $(document).ready(function () {
|
||||
like_control.text("Unlike");
|
||||
} else {
|
||||
like_control.data("method", "post");
|
||||
like_control.attr("href", '/likes.json?post_id=' + data.id);
|
||||
like_control.attr("href", '/likes.json?post_id=' + data.id);
|
||||
like_control.text("Like");
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
class AlternateNamesController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
|
||||
# GET /alternate_names
|
||||
# GET /alternate_names.json
|
||||
def index
|
||||
@alternate_names = AlternateName.all
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.haml
|
||||
format.json { render json: @alternate_names }
|
||||
end
|
||||
respond_with(@alternate_names)
|
||||
end
|
||||
|
||||
# GET /alternate_names/new
|
||||
@@ -18,16 +15,10 @@ class AlternateNamesController < ApplicationController
|
||||
def new
|
||||
@alternate_name = AlternateName.new
|
||||
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.haml
|
||||
format.json { render json: @alternate_name }
|
||||
end
|
||||
end
|
||||
|
||||
# GET /alternate_names/1/edit
|
||||
def edit
|
||||
end
|
||||
def edit; end
|
||||
|
||||
# POST /alternate_names
|
||||
# POST /alternate_names.json
|
||||
@@ -35,28 +26,20 @@ class AlternateNamesController < ApplicationController
|
||||
params[:alternate_name][:creator_id] = current_member.id
|
||||
@alternate_name = AlternateName.new(alternate_name_params)
|
||||
|
||||
respond_to do |format|
|
||||
if @alternate_name.save
|
||||
format.html { redirect_to @alternate_name.crop, notice: 'Alternate name was successfully created.' }
|
||||
format.json { render json: @alternate_name, status: :created, location: @alternate_name }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @alternate_name.errors, status: :unprocessable_entity }
|
||||
end
|
||||
if @alternate_name.save
|
||||
redirect_to @alternate_name.crop, notice: 'Alternate name was successfully created.'
|
||||
else
|
||||
render action: "new"
|
||||
end
|
||||
end
|
||||
|
||||
# PUT /alternate_names/1
|
||||
# PUT /alternate_names/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @alternate_name.update(alternate_name_params)
|
||||
format.html { redirect_to @alternate_name.crop, notice: 'Alternate name was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @alternate_name.errors, status: :unprocessable_entity }
|
||||
end
|
||||
if @alternate_name.update(alternate_name_params)
|
||||
redirect_to @alternate_name.crop, notice: 'Alternate name was successfully updated.'
|
||||
else
|
||||
render action: "edit"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -65,13 +48,7 @@ class AlternateNamesController < ApplicationController
|
||||
def destroy
|
||||
@crop = @alternate_name.crop
|
||||
@alternate_name.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html {
|
||||
redirect_to @crop, notice: 'Alternate name was successfully deleted.'
|
||||
}
|
||||
format.json { head :no_content }
|
||||
end
|
||||
redirect_to @crop, notice: 'Alternate name was successfully deleted.'
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -7,12 +7,12 @@ class ApplicationController < ActionController::Base
|
||||
before_action :set_locale
|
||||
|
||||
def store_location
|
||||
unless (request.path.in?(["/members/sign_in",
|
||||
"/members/sign_up",
|
||||
"/members/password/new",
|
||||
"/members/password/edit",
|
||||
"/members/confirmation",
|
||||
"/members/sign_out"]) || request.xhr?)
|
||||
unless request.path.in?(["/members/sign_in",
|
||||
"/members/sign_up",
|
||||
"/members/password/new",
|
||||
"/members/password/edit",
|
||||
"/members/confirmation",
|
||||
"/members/sign_out"]) || request.xhr?
|
||||
store_location_for(:member, request.fullpath)
|
||||
end
|
||||
end
|
||||
@@ -59,8 +59,7 @@ class ApplicationController < ActionController::Base
|
||||
# profile stuff
|
||||
:bio, :location, :latitude, :longitude,
|
||||
# email settings
|
||||
:show_email, :newsletter, :send_notification_email, :send_planting_reminder
|
||||
)
|
||||
:show_email, :newsletter, :send_notification_email, :send_planting_reminder)
|
||||
end
|
||||
|
||||
devise_parameter_sanitizer.permit(:account_update) do |member|
|
||||
@@ -73,8 +72,11 @@ class ApplicationController < ActionController::Base
|
||||
# email settings
|
||||
:show_email, :newsletter, :send_notification_email, :send_planting_reminder,
|
||||
# update password
|
||||
:current_password
|
||||
)
|
||||
:current_password)
|
||||
end
|
||||
end
|
||||
|
||||
def expire_homepage
|
||||
expire_fragment("homepage_stats")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -18,7 +18,8 @@ class AuthenticationsController < ApplicationController
|
||||
.find_or_create_by(
|
||||
provider: auth['provider'],
|
||||
uid: auth['uid'],
|
||||
name: name)
|
||||
name: name
|
||||
)
|
||||
|
||||
flash[:notice] = "Authentication successful."
|
||||
else
|
||||
@@ -29,7 +30,6 @@ class AuthenticationsController < ApplicationController
|
||||
|
||||
# DELETE /authentications/1
|
||||
def destroy
|
||||
@authentication = Authentication.find(params[:id])
|
||||
@authentication.destroy
|
||||
|
||||
respond_to do |format|
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
class CommentsController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
respond_to :rss, only: :index
|
||||
|
||||
# GET /comments
|
||||
# GET /comments.json
|
||||
# GET /comments.rss
|
||||
def index
|
||||
@comments = Comment.paginate(page: params[:page])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
format.json { render json: @comments }
|
||||
format.rss { render layout: false }
|
||||
end
|
||||
respond_with(@comments)
|
||||
end
|
||||
|
||||
# GET /comments/new
|
||||
@@ -22,13 +20,10 @@ class CommentsController < ApplicationController
|
||||
|
||||
if @post
|
||||
@comments = @post.comments
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
format.json { render json: @comment }
|
||||
end
|
||||
respond_with(@comment)
|
||||
else
|
||||
redirect_to request.referer || root_url,
|
||||
alert: "Can't post a comment on a non-existent post"
|
||||
redirect_to(request.referer || root_url,
|
||||
alert: "Can't post a comment on a non-existent post")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -40,37 +35,20 @@ class CommentsController < ApplicationController
|
||||
# POST /comments
|
||||
# POST /comments.json
|
||||
def create
|
||||
params[:comment][:author_id] = current_member.id
|
||||
@comment = Comment.new(comment_params)
|
||||
|
||||
respond_to do |format|
|
||||
if @comment.save
|
||||
format.html { redirect_to @comment.post, notice: "Comment was successfully created." }
|
||||
format.json { render json: @comment, status: :created, location: @comment }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @comment.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
@comment.author = current_member
|
||||
flash[:notice] = "Comment was successfully created." if @comment.save
|
||||
respond_with(@comment.post)
|
||||
end
|
||||
|
||||
# PUT /comments/1
|
||||
# PUT /comments/1.json
|
||||
def update
|
||||
# you should never be able to change the author or post when
|
||||
# updating
|
||||
params[:comment].delete("post_id")
|
||||
params[:comment].delete("author_id")
|
||||
|
||||
respond_to do |format|
|
||||
if @comment.update(comment_params)
|
||||
format.html { redirect_to @comment.post, notice: 'Comment was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @comment.errors, status: :unprocessable_entity }
|
||||
end
|
||||
# only body can be updated
|
||||
if @comment.update(body: comment_params['body'])
|
||||
flash[:notice] = 'Comment was successfully updated.'
|
||||
end
|
||||
respond_with(@comment.post)
|
||||
end
|
||||
|
||||
# DELETE /comments/1
|
||||
@@ -78,16 +56,12 @@ class CommentsController < ApplicationController
|
||||
def destroy
|
||||
@post = @comment.post
|
||||
@comment.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to @post }
|
||||
format.json { head :no_content }
|
||||
end
|
||||
respond_with(@post)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def comment_params
|
||||
params.require(:comment).permit(:author_id, :body, :post_id)
|
||||
params.require(:comment).permit(:body, :post_id)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,86 +1,51 @@
|
||||
class ForumsController < ApplicationController
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
|
||||
# GET /forums
|
||||
# GET /forums.json
|
||||
def index
|
||||
@forums = Forum.all
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
format.json { render json: @forums }
|
||||
end
|
||||
respond_with(@forums)
|
||||
end
|
||||
|
||||
# GET /forums/1
|
||||
# GET /forums/1.json
|
||||
def show
|
||||
@forum = Forum.find(params[:id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # show.html.erb
|
||||
format.json { render json: @forum }
|
||||
end
|
||||
respond_with(@forum)
|
||||
end
|
||||
|
||||
# GET /forums/new
|
||||
# GET /forums/new.json
|
||||
def new
|
||||
@forum = Forum.new
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
format.json { render json: @forum }
|
||||
end
|
||||
respond_with(@forum)
|
||||
end
|
||||
|
||||
# GET /forums/1/edit
|
||||
def edit
|
||||
@forum = Forum.find(params[:id])
|
||||
end
|
||||
def edit; end
|
||||
|
||||
# POST /forums
|
||||
# POST /forums.json
|
||||
def create
|
||||
@forum = Forum.new(forum_params)
|
||||
|
||||
respond_to do |format|
|
||||
if @forum.save
|
||||
format.html { redirect_to @forum, notice: 'Forum was successfully created.' }
|
||||
format.json { render json: @forum, status: :created, location: @forum }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @forum.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Forum was successfully created.' if @forum.save
|
||||
respond_with(@forum)
|
||||
end
|
||||
|
||||
# PUT /forums/1
|
||||
# PUT /forums/1.json
|
||||
def update
|
||||
@forum = Forum.find(params[:id])
|
||||
|
||||
respond_to do |format|
|
||||
if @forum.update(forum_params)
|
||||
format.html { redirect_to @forum, notice: 'Forum was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @forum.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Forum was successfully updated.' if @forum.update(forum_params)
|
||||
respond_with(@forum)
|
||||
end
|
||||
|
||||
# DELETE /forums/1
|
||||
# DELETE /forums/1.json
|
||||
def destroy
|
||||
@forum = Forum.find(params[:id])
|
||||
@forum.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to forums_url, notice: 'Forum was successfully deleted' }
|
||||
format.json { head :no_content }
|
||||
end
|
||||
flash[:notice] = 'Forum was successfully deleted'
|
||||
redirect_to forums_url
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
class GardensController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
after_action :expire_homepage, only: [:create, :delete]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
|
||||
# GET /gardens
|
||||
# GET /gardens.json
|
||||
@@ -9,85 +11,52 @@ class GardensController < ApplicationController
|
||||
@show_all = params[:all] == '1'
|
||||
@gardens = gardens
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
format.json { render json: @gardens }
|
||||
end
|
||||
respond_with(@gardens)
|
||||
end
|
||||
|
||||
# GET /gardens/1
|
||||
# GET /gardens/1.json
|
||||
def show
|
||||
respond_to do |format|
|
||||
format.html # show.html.erb
|
||||
format.json { render json: @garden }
|
||||
end
|
||||
respond_with(@garden)
|
||||
end
|
||||
|
||||
# GET /gardens/new
|
||||
# GET /gardens/new.json
|
||||
def new
|
||||
@garden = Garden.new
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
format.json { render json: @garden }
|
||||
end
|
||||
respond_with(@garden)
|
||||
end
|
||||
|
||||
# GET /gardens/1/edit
|
||||
def edit
|
||||
end
|
||||
def edit; end
|
||||
|
||||
# POST /gardens
|
||||
# POST /gardens.json
|
||||
def create
|
||||
@garden.owner_id = current_member.id
|
||||
|
||||
respond_to do |format|
|
||||
if @garden.save
|
||||
format.html { redirect_to @garden, notice: I18n.t('gardens.created') }
|
||||
format.json { render json: @garden, status: :created, location: @garden }
|
||||
expire_fragment("homepage_stats")
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @garden.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = I18n.t('gardens.created') if @garden.save
|
||||
respond_with(@garden)
|
||||
end
|
||||
|
||||
# PUT /gardens/1
|
||||
# PUT /gardens/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @garden.update(garden_params)
|
||||
format.html { redirect_to @garden, notice: I18n.t('gardens.updated') }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @garden.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = I18n.t('gardens.updated') if @garden.update(garden_params)
|
||||
respond_with(@garden)
|
||||
end
|
||||
|
||||
# DELETE /gardens/1
|
||||
# DELETE /gardens/1.json
|
||||
def destroy
|
||||
@garden.destroy
|
||||
expire_fragment("homepage_stats")
|
||||
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
redirect_to gardens_by_owner_path(owner: @garden.owner), notice: I18n.t('gardens.deleted')
|
||||
end
|
||||
format.json { head :no_content }
|
||||
end
|
||||
flash[:notice] = I18n.t('gardens.deleted')
|
||||
redirect_to(gardens_by_owner_path(owner: @garden.owner))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def garden_params
|
||||
params.require(:garden).permit(:name, :slug, :owner_id, :description, :active,
|
||||
params.require(:garden).permit(:name, :slug, :description, :active,
|
||||
:location, :latitude, :longitude, :area, :area_unit)
|
||||
end
|
||||
|
||||
@@ -95,7 +64,6 @@ class GardensController < ApplicationController
|
||||
g = @owner ? @owner.gardens : Garden.all
|
||||
g = g.active unless @show_all
|
||||
g = g.includes(:owner).order(:name)
|
||||
g = g.paginate(page: params[:page])
|
||||
g
|
||||
g.paginate(page: params[:page])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,48 +1,34 @@
|
||||
class HarvestsController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
respond_to :csv, only: :index
|
||||
|
||||
# GET /harvests
|
||||
# GET /harvests.json
|
||||
def index
|
||||
@owner = Member.find_by(slug: params[:owner])
|
||||
@crop = Crop.find_by(slug: params[:crop])
|
||||
@harvests = if @owner
|
||||
@owner.harvests.includes(:owner, :crop)
|
||||
elsif @crop
|
||||
@crop.harvests.includes(:owner, :crop)
|
||||
else
|
||||
Harvest.includes(:owner, :crop)
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
format.html { @harvests = @harvests.paginate(page: params[:page]) }
|
||||
format.json { render json: @harvests }
|
||||
format.csv do
|
||||
specifics = (@owner ? "#{@owner.login_name}-" : @crop ? "#{@crop.name}-" : nil)
|
||||
@filename = "Growstuff-#{specifics}Harvests-#{Time.zone.now.to_s(:number)}.csv"
|
||||
render csv: @harvests
|
||||
end
|
||||
end
|
||||
@harvests = harvests
|
||||
@filename = csv_filename
|
||||
respond_with(@harvests)
|
||||
end
|
||||
|
||||
# GET /harvests/1
|
||||
# GET /harvests/1.json
|
||||
def show
|
||||
@planting = @harvest.planting if @harvest.planting_id
|
||||
@matching_plantings = matching_plantings if @harvest.owner == current_member
|
||||
respond_with(@harvest)
|
||||
end
|
||||
|
||||
# GET /harvests/new
|
||||
# GET /harvests/new.json
|
||||
def new
|
||||
@harvest = Harvest.new('harvested_at' => Date.today)
|
||||
@harvest = Harvest.new(harvested_at: Time.zone.today)
|
||||
@planting = Planting.find_by(slug: params[:planting_id]) if params[:planting_id]
|
||||
|
||||
# using find_by_id here because it returns nil, unlike find
|
||||
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
format.json { render json: @harvest }
|
||||
end
|
||||
@crop = Crop.find_by(id: params[:crop_id])
|
||||
respond_with(@harvest)
|
||||
end
|
||||
|
||||
# GET /harvests/1/edit
|
||||
@@ -54,41 +40,22 @@ class HarvestsController < ApplicationController
|
||||
# POST /harvests.json
|
||||
def create
|
||||
@harvest.crop_id = @harvest.planting.crop_id if @harvest.planting_id
|
||||
|
||||
respond_to do |format|
|
||||
if @harvest.save
|
||||
format.html { redirect_to @harvest, notice: I18n.t('harvests.created') }
|
||||
format.json { render json: @harvest, status: :created, location: @harvest }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @harvest.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = I18n.t('harvests.created') if @harvest.save
|
||||
respond_with(@harvest)
|
||||
end
|
||||
|
||||
# PUT /harvests/1
|
||||
# PUT /harvests/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @harvest.update(harvest_params)
|
||||
format.html { redirect_to @harvest, notice: I18n.t('harvests.updated') }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @harvest.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = I18n.t('harvests.updated') if @harvest.update(harvest_params)
|
||||
respond_with(@harvest)
|
||||
end
|
||||
|
||||
# DELETE /harvests/1
|
||||
# DELETE /harvests/1.json
|
||||
def destroy
|
||||
@harvest.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to harvests_url }
|
||||
format.json { head :no_content }
|
||||
end
|
||||
respond_with(@harvest)
|
||||
end
|
||||
|
||||
private
|
||||
@@ -100,4 +67,29 @@ class HarvestsController < ApplicationController
|
||||
:plant_part_id, :slug, :si_weight)
|
||||
.merge(owner_id: current_member.id)
|
||||
end
|
||||
|
||||
def matching_plantings
|
||||
Planting.where(crop: @harvest.crop, owner: @harvest.owner)
|
||||
.where('(planted_at IS NULL OR planted_at <= ?)', @harvest.harvested_at)
|
||||
.where('(finished_at IS NULL OR finished_at >= ?)', @harvest.harvested_at)
|
||||
end
|
||||
|
||||
def harvests
|
||||
if @owner
|
||||
@owner.harvests
|
||||
elsif @crop
|
||||
@crop.harvests
|
||||
else
|
||||
Harvest
|
||||
end.includes(:owner, :crop).paginate(page: params[:page])
|
||||
end
|
||||
|
||||
def csv_filename
|
||||
specifics = if @owner
|
||||
"#{@owner.login_name}-"
|
||||
elsif @crop
|
||||
"#{@crop.name}-"
|
||||
end
|
||||
"Growstuff-#{specifics}Harvests-#{Time.zone.now.to_s(:number)}.csv"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,71 +1,57 @@
|
||||
class LikesController < ApplicationController
|
||||
before_action :authenticate_member!, except: :index
|
||||
|
||||
before_action :authenticate_member!
|
||||
respond_to :html, :json
|
||||
|
||||
def create
|
||||
@like = Like.new
|
||||
@like.member = current_member
|
||||
@like.likeable = find_likeable
|
||||
@like = Like.new(member: current_member, likeable: find_likeable)
|
||||
return failed(@like, message: 'Unable to like') unless @like.likeable && @like.save
|
||||
|
||||
respond_to do |format|
|
||||
if @like.save
|
||||
format.html { redirect_to @like.likeable }
|
||||
format.json do
|
||||
render(
|
||||
json: {
|
||||
id: @like.likeable.id,
|
||||
liked_by_member: true,
|
||||
description: ActionController::Base.helpers.pluralize(@like.likeable.likes.count, "like"),
|
||||
url: like_path(@like, format: :json)
|
||||
},
|
||||
status: 201
|
||||
)
|
||||
end
|
||||
else
|
||||
format.html do
|
||||
flash[:error] = 'Unable to like'
|
||||
redirect_to @like.likeable
|
||||
end
|
||||
end
|
||||
end
|
||||
success(@like, liked_by_member: true, status_code: :created)
|
||||
end
|
||||
|
||||
def destroy
|
||||
like = Like.find(params[:id])
|
||||
likeable = like.likeable
|
||||
respond_to do |format|
|
||||
if like.destroy
|
||||
format.html { redirect_to likeable }
|
||||
format.json do
|
||||
render(
|
||||
json: {
|
||||
id: likeable.id,
|
||||
liked_by_member: false,
|
||||
description: ActionController::Base.helpers.pluralize(likeable.likes.count, "like"),
|
||||
url: likes_path(Like.new, "#{likeable.class.name.underscore}_id", likeable.id, format: :json)
|
||||
},
|
||||
status: 200
|
||||
)
|
||||
end
|
||||
else
|
||||
format.html do
|
||||
flash[:error] = 'Unable to unlike'
|
||||
redirect_to likeable
|
||||
end
|
||||
end
|
||||
end
|
||||
@like = Like.find_by(id: params[:id], member: current_member)
|
||||
return failed(@like, message: 'Unable to unlike') unless @like && @like.destroy
|
||||
|
||||
success(@like, liked_by_member: false, status_code: :ok)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def find_likeable
|
||||
params.each do |name, value|
|
||||
return Regexp.last_match[1].classify.constantize.find(value) if name =~ /(.+)_id$/
|
||||
Post.find(params[:post_id]) if params[:post_id]
|
||||
end
|
||||
|
||||
def render_json(like, liked_by_member: true)
|
||||
{
|
||||
id: like.likeable.id,
|
||||
liked_by_member: liked_by_member,
|
||||
description: ActionController::Base.helpers.pluralize(like.likeable.likes.count, "like"),
|
||||
url: like_path(like, format: :json)
|
||||
}
|
||||
end
|
||||
|
||||
def success(like, liked_by_member: nil, status_code: nil)
|
||||
respond_to do |format|
|
||||
format.html { redirect_to like.likeable }
|
||||
format.json do
|
||||
render(json: render_json(like, liked_by_member: liked_by_member),
|
||||
status: status_code)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def like_params
|
||||
params.require(:like).permit(:member, :likeable)
|
||||
def failed(like, message)
|
||||
respond_to do |format|
|
||||
format.json { render(json: { 'error': message }, status: :forbidden) }
|
||||
format.html do
|
||||
flash[:error] = message
|
||||
if like && like.likeable
|
||||
redirect_to like.likeable
|
||||
else
|
||||
redirect_to root_path
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -45,10 +45,11 @@ class MembersController < ApplicationController
|
||||
:latitude, :longitude
|
||||
])
|
||||
}
|
||||
format.rss { render(
|
||||
layout: false,
|
||||
locals: { member: @member }
|
||||
)}
|
||||
format.rss {
|
||||
render(
|
||||
layout: false,
|
||||
locals: { member: @member }
|
||||
)}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -2,14 +2,11 @@ class NotificationsController < ApplicationController
|
||||
include NotificationsHelper
|
||||
before_action :authenticate_member!
|
||||
load_and_authorize_resource
|
||||
respond_to :html
|
||||
|
||||
# GET /notifications
|
||||
def index
|
||||
@notifications = Notification.by_recipient(current_member).page(params[:page])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
end
|
||||
end
|
||||
|
||||
# GET /notifications/1
|
||||
@@ -17,10 +14,6 @@ class NotificationsController < ApplicationController
|
||||
@notification.read = true
|
||||
@notification.save
|
||||
@reply_link = reply_link(@notification)
|
||||
|
||||
respond_to do |format|
|
||||
format.html # show.html.erb
|
||||
end
|
||||
end
|
||||
|
||||
# GET /notifications/new
|
||||
@@ -29,35 +22,24 @@ class NotificationsController < ApplicationController
|
||||
@notification = Notification.new
|
||||
@recipient = Member.find_by(id: params[:recipient_id])
|
||||
@subject = params[:subject] || ""
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
end
|
||||
end
|
||||
|
||||
# GET /notifications/1/reply
|
||||
def reply
|
||||
@notification = Notification.new
|
||||
@sender_notification = Notification.find(params[:id])
|
||||
@sender_notification = Notification.find_by(id: params[:id], recipient: current_member)
|
||||
@sender_notification.read = true
|
||||
@sender_notification.save
|
||||
@recipient = @sender_notification.sender
|
||||
@subject = @sender_notification.subject =~ /^Re: / ?
|
||||
@sender_notification.subject :
|
||||
"Re: " + @sender_notification.subject
|
||||
|
||||
respond_to do |format|
|
||||
format.html # reply.html.haml
|
||||
end
|
||||
end
|
||||
|
||||
# DELETE /notifications/1
|
||||
def destroy
|
||||
@notification.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to notifications_url }
|
||||
end
|
||||
redirect_to notifications_url
|
||||
end
|
||||
|
||||
# POST /notifications
|
||||
@@ -66,12 +48,10 @@ class NotificationsController < ApplicationController
|
||||
@notification = Notification.new(notification_params)
|
||||
@recipient = Member.find_by(id: params[:notification][:recipient_id])
|
||||
|
||||
respond_to do |format|
|
||||
if @notification.save
|
||||
format.html { redirect_to notifications_path, notice: 'Message was successfully sent.' }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
end
|
||||
if @notification.save
|
||||
redirect_to notifications_path, notice: 'Message was successfully sent.'
|
||||
else
|
||||
render action: "new"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ class OrdersController < ApplicationController
|
||||
end
|
||||
|
||||
def complete
|
||||
if (params[:token] && params['PayerID'])
|
||||
if params[:token] && params['PayerID']
|
||||
purchase = EXPRESS_GATEWAY.purchase(
|
||||
@order.total,
|
||||
currency: Growstuff::Application.config.currency,
|
||||
|
||||
@@ -1,35 +1,25 @@
|
||||
class PlantPartsController < ApplicationController
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
|
||||
# GET /plant_parts
|
||||
# GET /plant_parts.json
|
||||
def index
|
||||
@plant_parts = PlantPart.all
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
format.json { render json: @plant_parts }
|
||||
end
|
||||
respond_with(@plant_parts)
|
||||
end
|
||||
|
||||
# GET /plant_parts/1
|
||||
# GET /plant_parts/1.json
|
||||
def show
|
||||
respond_to do |format|
|
||||
format.html # show.html.erb
|
||||
format.json { render json: @plant_part }
|
||||
end
|
||||
respond_with(@plant_part)
|
||||
end
|
||||
|
||||
# GET /plant_parts/new
|
||||
# GET /plant_parts/new.json
|
||||
def new
|
||||
@plant_part = PlantPart.new
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
format.json { render json: @plant_part }
|
||||
end
|
||||
respond_with(@plant_part)
|
||||
end
|
||||
|
||||
# GET /plant_parts/1/edit
|
||||
|
||||
@@ -1,38 +1,24 @@
|
||||
class PostsController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
respond_to :rss, only: [:index, :show]
|
||||
|
||||
# GET /posts
|
||||
# GET /posts.json
|
||||
|
||||
# GET /posts.rss
|
||||
def index
|
||||
@author = Member.find_by(slug: params[:author])
|
||||
@posts = if @author
|
||||
@author.posts.includes(:author, comments: :author).paginate(page: params[:page])
|
||||
else
|
||||
Post.includes(:author, comments: :author).paginate(page: params[:page])
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.haml
|
||||
format.json { render json: @posts }
|
||||
format.rss { render layout: false } # index.rss.builder
|
||||
end
|
||||
@posts = posts
|
||||
respond_with(@posts)
|
||||
end
|
||||
|
||||
# GET /posts/1
|
||||
# GET /posts/1.json
|
||||
# GET /posts/1.rss
|
||||
def show
|
||||
@post = Post.includes(:author, comments: :author).find(params[:id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # show.html.haml
|
||||
format.json { render json: @post }
|
||||
format.rss { render(
|
||||
layout: false,
|
||||
locals: { post: @post }
|
||||
)}
|
||||
end
|
||||
respond_with(@post)
|
||||
end
|
||||
|
||||
# GET /posts/new
|
||||
@@ -40,11 +26,7 @@ class PostsController < ApplicationController
|
||||
def new
|
||||
@post = Post.new
|
||||
@forum = Forum.find_by(id: params[:forum_id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.haml
|
||||
format.json { render json: @post }
|
||||
end
|
||||
respond_with(@post)
|
||||
end
|
||||
|
||||
# GET /posts/1/edit
|
||||
@@ -56,41 +38,22 @@ class PostsController < ApplicationController
|
||||
def create
|
||||
params[:post][:author_id] = current_member.id
|
||||
@post = Post.new(post_params)
|
||||
|
||||
respond_to do |format|
|
||||
if @post.save
|
||||
format.html { redirect_to @post, notice: 'Post was successfully created.' }
|
||||
format.json { render json: @post, status: :created, location: @post }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @post.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Post was successfully created.' if @post.save
|
||||
respond_with(@post)
|
||||
end
|
||||
|
||||
# PUT /posts/1
|
||||
# PUT /posts/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @post.update(post_params)
|
||||
format.html { redirect_to @post, notice: 'Post was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @post.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Post was successfully updated.' if @post.update(post_params)
|
||||
respond_with(@post)
|
||||
end
|
||||
|
||||
# DELETE /posts/1
|
||||
# DELETE /posts/1.json
|
||||
def destroy
|
||||
@post.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to posts_url, notice: 'Post was deleted.' }
|
||||
format.json { head :no_content }
|
||||
end
|
||||
flash[:notice] = 'Post was deleted.' if @post.destroy
|
||||
respond_with(@post)
|
||||
end
|
||||
|
||||
private
|
||||
@@ -98,4 +61,12 @@ class PostsController < ApplicationController
|
||||
def post_params
|
||||
params.require(:post).permit(:body, :subject, :author_id, :forum_id)
|
||||
end
|
||||
|
||||
def posts
|
||||
if @author
|
||||
@author.posts
|
||||
else
|
||||
Post
|
||||
end.includes(:author, comments: :author).paginate(page: params[:page])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,25 +1,19 @@
|
||||
class ScientificNamesController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
|
||||
# GET /scientific_names
|
||||
# GET /scientific_names.json
|
||||
def index
|
||||
@scientific_names = ScientificName.all
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.haml
|
||||
format.json { render json: @scientific_names }
|
||||
end
|
||||
respond_with(@scientific_names)
|
||||
end
|
||||
|
||||
# GET /scientific_names/1
|
||||
# GET /scientific_names/1.json
|
||||
def show
|
||||
respond_to do |format|
|
||||
format.html # show.html.haml
|
||||
format.json { render json: @scientific_name }
|
||||
end
|
||||
respond_with(@scientific_name)
|
||||
end
|
||||
|
||||
# GET /scientific_names/new
|
||||
@@ -27,11 +21,7 @@ class ScientificNamesController < ApplicationController
|
||||
def new
|
||||
@scientific_name = ScientificName.new
|
||||
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.haml
|
||||
format.json { render json: @scientific_name }
|
||||
end
|
||||
respond_with(@scientific_name)
|
||||
end
|
||||
|
||||
# GET /scientific_names/1/edit
|
||||
@@ -41,32 +31,18 @@ class ScientificNamesController < ApplicationController
|
||||
# POST /scientific_names
|
||||
# POST /scientific_names.json
|
||||
def create
|
||||
params[:scientific_name][:creator_id] = current_member.id
|
||||
@scientific_name = ScientificName.new(scientific_name_params)
|
||||
@scientific_name.creator = current_member
|
||||
|
||||
respond_to do |format|
|
||||
if @scientific_name.save
|
||||
format.html { redirect_to @scientific_name.crop, notice: 'Scientific name was successfully created.' }
|
||||
format.json { render json: @scientific_name, status: :created, location: @scientific_name }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @scientific_name.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Scientific name was successfully created.' if @scientific_name.save
|
||||
respond_with(@scientific_name.crop)
|
||||
end
|
||||
|
||||
# PUT /scientific_names/1
|
||||
# PUT /scientific_names/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @scientific_name.update(scientific_name_params)
|
||||
format.html { redirect_to @scientific_name.crop, notice: 'Scientific name was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @scientific_name.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Scientific name was successfully updated.' if @scientific_name.update(scientific_name_params)
|
||||
respond_with(@scientific_name.crop)
|
||||
end
|
||||
|
||||
# DELETE /scientific_names/1
|
||||
@@ -74,18 +50,13 @@ class ScientificNamesController < ApplicationController
|
||||
def destroy
|
||||
@crop = @scientific_name.crop
|
||||
@scientific_name.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html {
|
||||
redirect_to @crop, notice: 'Scientific name was successfully deleted.'
|
||||
}
|
||||
format.json { head :no_content }
|
||||
end
|
||||
flash[:notice] = 'Scientific name was successfully deleted.'
|
||||
respond_with(@crop)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def scientific_name_params
|
||||
params.require(:scientific_name).permit(:crop_id, :name, :creator_id)
|
||||
params.require(:scientific_name).permit(:crop_id, :name)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
class SeedsController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
respond_to :csv, only: :index
|
||||
respond_to :rss, only: :index
|
||||
|
||||
# GET /seeds
|
||||
# GET /seeds.json
|
||||
@@ -8,31 +11,15 @@ class SeedsController < ApplicationController
|
||||
@owner = Member.find_by(slug: params[:owner])
|
||||
@crop = Crop.find_by(slug: params[:crop])
|
||||
@seeds = seeds(owner: @owner, crop: @crop)
|
||||
@filename = csv_filename
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
format.json { render json: @seeds }
|
||||
format.rss { render layout: false } # index.rss.builder
|
||||
format.csv do
|
||||
if @owner
|
||||
@filename = "Growstuff-#{@owner}-Seeds-#{Time.zone.now.to_s(:number)}.csv"
|
||||
@seeds = @owner.seeds.includes(:owner, :crop)
|
||||
else
|
||||
@filename = "Growstuff-Seeds-#{Time.zone.now.to_s(:number)}.csv"
|
||||
@seeds = Seed.includes(:owner, :crop)
|
||||
end
|
||||
render csv: @seeds
|
||||
end
|
||||
end
|
||||
respond_with(@seeds)
|
||||
end
|
||||
|
||||
# GET /seeds/1
|
||||
# GET /seeds/1.json
|
||||
def show
|
||||
respond_to do |format|
|
||||
format.html # show.html.erb
|
||||
format.json { render json: @seed }
|
||||
end
|
||||
respond_with(@seed)
|
||||
end
|
||||
|
||||
# GET /seeds/new
|
||||
@@ -42,11 +29,7 @@ class SeedsController < ApplicationController
|
||||
|
||||
# using find_by_id here because it returns nil, unlike find
|
||||
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
format.json { render json: @seed }
|
||||
end
|
||||
respond_with(@seed)
|
||||
end
|
||||
|
||||
# GET /seeds/1/edit
|
||||
@@ -56,52 +39,34 @@ class SeedsController < ApplicationController
|
||||
# POST /seeds
|
||||
# POST /seeds.json
|
||||
def create
|
||||
params[:seed][:owner_id] = current_member.id
|
||||
@seed = Seed.new(seed_params)
|
||||
|
||||
respond_to do |format|
|
||||
if @seed.save
|
||||
format.html { redirect_to @seed, notice: "Successfully added #{@seed.crop} seed to your stash." }
|
||||
format.json { render json: @seed, status: :created, location: @seed }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @seed.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
@seed.owner = current_member
|
||||
flash[:notice] = "Successfully added #{@seed.crop} seed to your stash." if @seed.save
|
||||
respond_with(@seed)
|
||||
end
|
||||
|
||||
# PUT /seeds/1
|
||||
# PUT /seeds/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @seed.update(seed_params)
|
||||
format.html { redirect_to @seed, notice: 'Seed was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @seed.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Seed was successfully updated.' if @seed.update(seed_params)
|
||||
respond_with(@seed)
|
||||
end
|
||||
|
||||
# DELETE /seeds/1
|
||||
# DELETE /seeds/1.json
|
||||
def destroy
|
||||
@seed.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to seeds_url }
|
||||
format.json { head :no_content }
|
||||
end
|
||||
respond_with(@seed)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def seed_params
|
||||
params.require(:seed).permit(
|
||||
:owner_id, :crop_id, :description, :quantity, :plant_before,
|
||||
:crop_id, :description, :quantity, :plant_before,
|
||||
:days_until_maturity_min, :days_until_maturity_max, :organic, :gmo,
|
||||
:heirloom, :tradable_to, :slug)
|
||||
:heirloom, :tradable_to, :slug
|
||||
)
|
||||
end
|
||||
|
||||
def seeds(owner: nil, crop: nil)
|
||||
@@ -113,4 +78,12 @@ class SeedsController < ApplicationController
|
||||
Seed
|
||||
end.includes(:owner, :crop).paginate(page: params[:page])
|
||||
end
|
||||
|
||||
def csv_filename
|
||||
if @owner
|
||||
"Growstuff-#{@owner}-Seeds-#{Time.zone.now.to_s(:number)}.csv"
|
||||
else
|
||||
"Growstuff-Seeds-#{Time.zone.now.to_s(:number)}.csv"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -12,7 +12,7 @@ module CropsHelper
|
||||
return "You don't have any seeds of this crop."
|
||||
end
|
||||
|
||||
if (total_quantity != 0)
|
||||
if total_quantity != 0
|
||||
"You have #{total_quantity} #{Seed.model_name.human(count: total_quantity)} of this crop."
|
||||
else
|
||||
"You have an unknown quantity of seeds of this crop."
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
class Ability
|
||||
include CanCan::Ability
|
||||
|
||||
def initialize(member) # rubocop:disable Metrics/AbcSize
|
||||
def initialize(member) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
||||
# See the wiki for details: https://github.com/ryanb/cancan/wiki/Defining-Abilities
|
||||
|
||||
# everyone can do these things, even non-logged in
|
||||
@@ -72,11 +72,13 @@ class Ability
|
||||
can :create, Authentication
|
||||
can :destroy, Authentication, member_id: member.id
|
||||
|
||||
# anyone can create a post, or comment on a post,
|
||||
# anyone can create a post, like, or comment on a post,
|
||||
# but only the author can edit/destroy it.
|
||||
can :create, Post
|
||||
can :update, Post, author_id: member.id
|
||||
can :destroy, Post, author_id: member.id
|
||||
can :create, Like
|
||||
can :destroy, Like, member_id: member.id
|
||||
can :create, Comment
|
||||
can :update, Comment, author_id: member.id
|
||||
can :destroy, Comment, author_id: member.id
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
class Forum < ActiveRecord::Base
|
||||
extend FriendlyId
|
||||
validates :name, presence: true
|
||||
friendly_id :name, use: [:slugged, :finders]
|
||||
|
||||
has_many :posts
|
||||
|
||||
@@ -28,7 +28,8 @@ class Planting < ActiveRecord::Base
|
||||
validates :quantity,
|
||||
numericality: {
|
||||
only_integer: true,
|
||||
greater_than_or_equal_to: 0 },
|
||||
greater_than_or_equal_to: 0
|
||||
},
|
||||
allow_nil: true
|
||||
|
||||
SUNNINESS_VALUES = %w(sun semi-shade shade)
|
||||
@@ -64,15 +65,11 @@ class Planting < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def planting_slug
|
||||
if garden.present? && crop.present?
|
||||
"#{owner.login_name}-#{garden.name}-#{crop.name}"
|
||||
elsif garden.present?
|
||||
"#{owner.login_name}-#{garden.name}-null"
|
||||
elsif crop.present?
|
||||
"#{owner.login_name}-null-#{crop.name}"
|
||||
else
|
||||
"#{owner.login_name}-null-null"
|
||||
end.downcase.gsub(' ', '-')
|
||||
[
|
||||
owner.login_name,
|
||||
garden.present? ? garden.name : 'null',
|
||||
crop.present? ? crop.name : 'null'
|
||||
].join('-').tr(' ', '-').downcase
|
||||
end
|
||||
|
||||
# location = garden owner + garden name, i.e. "Skud's backyard"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
%ul#admin_links
|
||||
%li= link_to "Account types", account_types_path
|
||||
%li= link_to "Alternate names", alternate_names_path
|
||||
%li= link_to "Products", products_path
|
||||
%li= link_to "Roles", roles_path
|
||||
%li= link_to "Forums", forums_path
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
- content_for :title, "Resend confirmation instructions"
|
||||
|
||||
= form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post, :class => 'form-horizontal', :role => 'form' }) do |f|
|
||||
= form_for(resource, as: resource_name,
|
||||
url: confirmation_path(resource_name),
|
||||
html: { method: :post, class: 'form-horizontal', role: 'form' }) do |f|
|
||||
= devise_error_messages!
|
||||
|
||||
%p Enter either your login name or your email address to resend the confirmation email.
|
||||
|
||||
.form-group
|
||||
= f.label :login, :class => 'control-label col-md-2'
|
||||
= f.label :login, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_field :login, :class => 'form-control'
|
||||
= f.text_field :login, class: 'form-control'
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit "Resend confirmation instructions", :class => 'btn btn-primary'
|
||||
= f.submit "Resend confirmation instructions", class: 'btn btn-primary'
|
||||
|
||||
.form-group
|
||||
.col-md-offset-2.col-md-8
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
Your account on #{site_name} has been created. You just need to confirm
|
||||
your email address through the link below:
|
||||
|
||||
%p= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @token)
|
||||
%p= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token)
|
||||
|
||||
%p
|
||||
Once you're confirmed, you can sign in with your login name
|
||||
@@ -17,9 +17,9 @@
|
||||
We're excited to have you as a member, and hope you'll enjoy
|
||||
what #{site_name} has to offer. Take a look around the site,
|
||||
= succeed "," do
|
||||
= link_to('plant some things', url_for(:controller => '/crops', :only_path => false))
|
||||
= link_to('plant some things', url_for(controller: '/crops', only_path: false))
|
||||
and feel free to drop in on the
|
||||
= link_to 'forums', url_for(:controller => '/forums', :only_path => false)
|
||||
= link_to 'forums', url_for(controller: '/forums', only_path: false)
|
||||
if you have any questions or feedback.
|
||||
|
||||
%p
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
Someone has requested a link to reset your password on #{site_name}.
|
||||
We presume this was you, in which case you can do so through this link:
|
||||
|
||||
%p= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @token)
|
||||
%p= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token)
|
||||
|
||||
%p
|
||||
If it wasn't you, then someone's made a typo or has been messing
|
||||
@@ -17,5 +17,5 @@
|
||||
%p
|
||||
The #{site_name} team.
|
||||
%br/
|
||||
=link_to root_url, root_url
|
||||
= link_to root_url, root_url
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
forgotten your password. In either case, use the link below to unlock
|
||||
your account:
|
||||
|
||||
%p= link_to 'Unlock my account', unlock_url(@resource, :unlock_token => @token)
|
||||
%p= link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token)
|
||||
|
||||
%p
|
||||
If you have actually forgotten your password, you can
|
||||
@@ -20,4 +20,4 @@
|
||||
%p
|
||||
The #{site_name} team.
|
||||
%br/
|
||||
=link_to root_url, root_url
|
||||
= link_to root_url, root_url
|
||||
|
||||
@@ -1,21 +1,23 @@
|
||||
- content_for :title, "Change your password"
|
||||
|
||||
= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put, :class => 'form-horizontal', :role => 'form' }) do |f|
|
||||
= form_for(resource, as: resource_name,
|
||||
url: password_path(resource_name),
|
||||
html: { method: :put, class: 'form-horizontal', role: 'form' }) do |f|
|
||||
= devise_error_messages!
|
||||
= f.hidden_field :reset_password_token
|
||||
|
||||
.form-group
|
||||
= f.label :password, "New password", :class => 'control-label col-md-2'
|
||||
= f.label :password, "New password", class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.password_field :password, :class => 'form-control'
|
||||
= f.password_field :password, class: 'form-control'
|
||||
|
||||
.form-group
|
||||
= f.label :password_confirmation, "Confirm new password", :class => 'control-label col-md-2'
|
||||
= f.label :password_confirmation, "Confirm new password", class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.password_field :password_confirmation, :class => 'form-control'
|
||||
= f.password_field :password_confirmation, class: 'form-control'
|
||||
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit "Change my password", :class => 'btn btn-primary'
|
||||
= f.submit "Change my password", class: 'btn btn-primary'
|
||||
|
||||
= render "devise/shared/links"
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
- content_for :title, "Forgot your password?"
|
||||
|
||||
= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post, :class => 'form-horizontal', :role => 'form' }) do |f|
|
||||
= form_for(resource, as: resource_name,
|
||||
url: password_path(resource_name),
|
||||
html: { method: :post,
|
||||
class: 'form-horizontal', role: 'form' }) do |f|
|
||||
= devise_error_messages!
|
||||
|
||||
.form-group
|
||||
= f.label :login, :class => 'control-label col-md-2'
|
||||
= f.label :login, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_field :login, :class => 'form-control'
|
||||
= f.text_field :login, class: 'form-control'
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit "Send me reset password instructions", :class => 'btn btn-primary'
|
||||
= f.submit "Send me reset password instructions", class: 'btn btn-primary'
|
||||
|
||||
.form-group
|
||||
.col-md-offset-2.col-md-8
|
||||
|
||||
@@ -1,39 +1,47 @@
|
||||
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put, :class => 'form-horizontal' }) do |f|
|
||||
= form_for(resource, as: resource_name,
|
||||
url: registration_path(resource_name),
|
||||
html: { method: :put, class: 'form-horizontal' }) do |_f|
|
||||
%br/
|
||||
= devise_error_messages!
|
||||
|
||||
.row
|
||||
.col-md-12
|
||||
%p
|
||||
= image_tag "twitter_32.png", :size => "32x32", :alt => 'Twitter logo'
|
||||
= image_tag "twitter_32.png", size: "32x32", alt: 'Twitter logo'
|
||||
- if @twitter_auth
|
||||
You are connected to Twitter as
|
||||
= succeed "." do
|
||||
=link_to @twitter_auth.name, "http://twitter.com/#{@twitter_auth.name}"
|
||||
= link_to "Disconnect", @twitter_auth, :confirm => "Are you sure you want to remove this connection?", :method => :delete, :class => "remove"
|
||||
= link_to @twitter_auth.name, "http://twitter.com/#{@twitter_auth.name}"
|
||||
= link_to "Disconnect", @twitter_auth,
|
||||
confirm: "Are you sure you want to remove this connection?",
|
||||
method: :delete, class: "remove"
|
||||
- else
|
||||
=link_to 'Connect to Twitter', '/auth/twitter'
|
||||
= link_to 'Connect to Twitter', '/auth/twitter'
|
||||
|
||||
.row
|
||||
.col-md-12
|
||||
%p
|
||||
= image_tag "flickr_32.png", :size => "32x32", :alt => 'Flickr logo'
|
||||
= image_tag "flickr_32.png", size: "32x32", alt: 'Flickr logo'
|
||||
- if @flickr_auth
|
||||
You are connected to Flickr as
|
||||
= succeed "." do
|
||||
=link_to @flickr_auth.name, "http://flickr.com/photos/#{@flickr_auth.uid}"
|
||||
= link_to "Disconnect", @flickr_auth, :confirm => "Are you sure you want to remove this connection?", :method => :delete, :class => "remove"
|
||||
= link_to @flickr_auth.name, "http://flickr.com/photos/#{@flickr_auth.uid}"
|
||||
= link_to "Disconnect", @flickr_auth,
|
||||
confirm: "Are you sure you want to remove this connection?",
|
||||
method: :delete, class: "remove"
|
||||
- else
|
||||
=link_to 'Connect to Flickr', '/auth/flickr'
|
||||
= link_to 'Connect to Flickr', '/auth/flickr'
|
||||
|
||||
.row
|
||||
.col-md-12
|
||||
%p
|
||||
= image_tag "facebook_32.png", :size => "32x32", :alt => 'Facebook logo'
|
||||
= image_tag "facebook_32.png", size: "32x32", alt: 'Facebook logo'
|
||||
- if @facebook_auth
|
||||
You are connected to Facebook as
|
||||
= succeed "." do
|
||||
=link_to @facebook_auth.name, "http://facebook.com/profile/#{@facebook_auth.uid}"
|
||||
= link_to "Disconnect", @facebook_auth, :confirm => "Are you sure you want to remove this connection?", :method => :delete, :class => "remove"
|
||||
= link_to @facebook_auth.name, "http://facebook.com/profile/#{@facebook_auth.uid}"
|
||||
= link_to "Disconnect", @facebook_auth,
|
||||
confirm: "Are you sure you want to remove this connection?",
|
||||
method: :delete, class: "remove"
|
||||
- else
|
||||
=link_to 'Connect to Facebook', '/auth/facebook'
|
||||
= link_to 'Connect to Facebook', '/auth/facebook'
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put, :class => 'form-horizontal' }) do |f|
|
||||
= form_for(resource, as: resource_name,
|
||||
url: registration_path(resource_name),
|
||||
html: { method: :put, class: 'form-horizontal' }) do |f|
|
||||
%br/
|
||||
= devise_error_messages!
|
||||
|
||||
.form-group
|
||||
= f.label :email, :class => 'control-label col-md-2'
|
||||
= f.label :email, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.email_field :email, :class => 'form-control'
|
||||
= f.email_field :email, class: 'form-control'
|
||||
%span.help-block If you change your email address you will have to reconfirm.
|
||||
|
||||
.form-group
|
||||
@@ -32,10 +34,9 @@
|
||||
= f.check_box :newsletter
|
||||
Subscribe to the #{ENV['GROWSTUFF_SITE_NAME']} newsletter
|
||||
.help-block
|
||||
= render :partial => 'newsletter_blurb'
|
||||
= render partial: 'newsletter_blurb'
|
||||
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit "Save", :class => 'btn btn-primary'
|
||||
|
||||
=f.hidden_field(:tos_agreement, :value => true)
|
||||
= f.submit "Save", class: 'btn btn-primary'
|
||||
= f.hidden_field(:tos_agreement, value: true)
|
||||
|
||||
@@ -1,23 +1,25 @@
|
||||
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put, :class => 'form-horizontal' }) do |f|
|
||||
= form_for(resource, as: resource_name,
|
||||
url: registration_path(resource_name),
|
||||
html: { method: :put, class: 'form-horizontal' }) do |f|
|
||||
%br/
|
||||
= devise_error_messages!
|
||||
|
||||
.form-group
|
||||
= f.label :current_password, :class => 'control-label col-md-2'
|
||||
= f.label :current_password, class: 'control-label col-md-2'
|
||||
.col-md-4
|
||||
= f.password_field :current_password, :class => 'form-control'
|
||||
= f.password_field :current_password, class: 'form-control'
|
||||
|
||||
.form-group
|
||||
= f.label :password, "New password", :class => 'control-label col-md-2'
|
||||
= f.label :password, "New password", class: 'control-label col-md-2'
|
||||
.col-md-4
|
||||
= f.password_field :password, :autocomplete => "off", :class => 'form-control'
|
||||
= f.password_field :password, autocomplete: "off", class: 'form-control'
|
||||
|
||||
.form-group
|
||||
= f.label :password_confirmation, :class => 'control-label col-md-2'
|
||||
.col-md-4= f.password_field :password_confirmation, :class => 'form-control'
|
||||
= f.label :password_confirmation, class: 'control-label col-md-2'
|
||||
.col-md-4= f.password_field :password_confirmation, class: 'form-control'
|
||||
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit "Save", :class => 'btn btn-primary'
|
||||
= f.submit "Save", class: 'btn btn-primary'
|
||||
|
||||
=f.hidden_field(:tos_agreement, :value => true)
|
||||
= f.hidden_field(:tos_agreement, value: true)
|
||||
|
||||
@@ -1,23 +1,25 @@
|
||||
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put, :class => 'form-horizontal' }) do |f|
|
||||
= form_for(resource, as: resource_name,
|
||||
url: registration_path(resource_name),
|
||||
html: { method: :put, class: 'form-horizontal' }) do |f|
|
||||
%br/
|
||||
= devise_error_messages!
|
||||
|
||||
.form-group
|
||||
=f.label :location, 'Your location', :class => 'control-label col-md-2'
|
||||
= f.label :location, 'Your location', class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
=f.text_field :location, :autocomplete => "off", :class => 'form-control'
|
||||
= f.text_field :location, autocomplete: "off", class: 'form-control'
|
||||
%span.help-block This will be displayed on a map. You can be as detailed or vague as you like.
|
||||
|
||||
.form-group
|
||||
=f.label :bio, :class => 'control-label col-md-2'
|
||||
= f.label :bio, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
=f.text_area :bio, :rows => 6, :class => 'form-control'
|
||||
= f.text_area :bio, rows: 6, class: 'form-control'
|
||||
|
||||
.form-group
|
||||
%label.control-label.col-md-2
|
||||
Profile picture
|
||||
.col-md-8
|
||||
= render :partial => "members/avatar", :locals => { :member => @member }
|
||||
= render partial: "members/avatar", locals: { member: @member }
|
||||
- unless @member.preferred_avatar_uri.present?
|
||||
%p
|
||||
%br/
|
||||
@@ -27,6 +29,5 @@
|
||||
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit "Save", :class => 'btn btn-primary'
|
||||
|
||||
=f.hidden_field(:tos_agreement, :value => true)
|
||||
= f.submit "Save", class: 'btn btn-primary'
|
||||
= f.hidden_field(:tos_agreement, value: true)
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
- content_for :title, "Settings for #{current_member.login_name}"
|
||||
|
||||
%ul.nav.nav-tabs{:role => 'tablist'}
|
||||
%ul.nav.nav-tabs{ role: 'tablist' }
|
||||
%li.active
|
||||
%a{:href => '#profile', :role => 'tab', 'data-toggle' => 'tab'}
|
||||
%a{ href: '#profile', role: 'tab', 'data-toggle': 'tab' }
|
||||
Profile
|
||||
%li
|
||||
%a{:href => '#email', :role => 'tab', 'data-toggle' => 'tab'}
|
||||
%a{ href: '#email', role: 'tab', 'data-toggle': 'tab' }
|
||||
Email
|
||||
%li
|
||||
%a{:href => '#apps', :role => 'tab', 'data-toggle' => 'tab'}
|
||||
%a{ href: '#apps', role: 'tab', 'data-toggle': 'tab' }
|
||||
Apps
|
||||
%li
|
||||
%a{:href => '#password', :role => 'tab', 'data-toggle' => 'tab'}
|
||||
%a{ href: '#password', role: 'tab', 'data-toggle': 'tab' }
|
||||
Password
|
||||
|
||||
.tab-content
|
||||
.tab-pane.active#profile
|
||||
= render :partial => 'edit_profile'
|
||||
= render partial: 'edit_profile'
|
||||
.tab-pane#email
|
||||
= render :partial => 'edit_email'
|
||||
= render partial: 'edit_email'
|
||||
.tab-pane#apps
|
||||
= render :partial => 'edit_apps'
|
||||
= render partial: 'edit_apps'
|
||||
.tab-pane#password
|
||||
= render :partial => 'edit_password'
|
||||
= render partial: 'edit_password'
|
||||
|
||||
@@ -2,28 +2,30 @@
|
||||
|
||||
%p Sign up for a Growstuff account to track your veggie garden and connect with other local growers.
|
||||
|
||||
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => {:class => "form-horizontal"}) do |f|
|
||||
= form_for(resource, as: resource_name,
|
||||
url: registration_path(resource_name),
|
||||
html: { class: "form-horizontal" }) do |f|
|
||||
= devise_error_messages!
|
||||
|
||||
.form-group
|
||||
= f.label :login_name, :class => "control-label col-md-2"
|
||||
= f.label :login_name, class: "control-label col-md-2"
|
||||
.col-md-8
|
||||
= f.text_field :login_name, :class => 'form-control'
|
||||
= f.text_field :login_name, class: 'form-control'
|
||||
%span.help-inline This is the name that will show on the website.
|
||||
|
||||
.form-group
|
||||
= f.label :email, :class => "control-label col-md-2"
|
||||
= f.label :email, class: "control-label col-md-2"
|
||||
.col-md-8
|
||||
= f.email_field :email, :class => 'form-control'
|
||||
= f.email_field :email, class: 'form-control'
|
||||
%span.help-inline We'll use this address to contact you (we never spam!)
|
||||
|
||||
.form-group
|
||||
= f.label :password, :class => "control-label col-md-2"
|
||||
.col-md-8= f.password_field :password, :class => 'form-control'
|
||||
= f.label :password, class: "control-label col-md-2"
|
||||
.col-md-8= f.password_field :password, class: 'form-control'
|
||||
|
||||
.form-group
|
||||
= f.label :password_confirmation, :class => "control-label col-md-2"
|
||||
.col-md-8= f.password_field :password_confirmation, :class => 'form-control'
|
||||
= f.label :password_confirmation, class: "control-label col-md-2"
|
||||
.col-md-8= f.password_field :password_confirmation, class: 'form-control'
|
||||
|
||||
.form-group
|
||||
.col-md-offset-2.col-md-8.checkbox
|
||||
@@ -35,14 +37,14 @@
|
||||
.form-group
|
||||
.col-md-offset-2.col-md-8.checkbox
|
||||
%label
|
||||
= f.check_box :newsletter, :checked => true
|
||||
= f.check_box :newsletter, checked: true
|
||||
Subscribe to the #{ENV['GROWSTUFF_SITE_NAME']} newsletter
|
||||
.help-inline
|
||||
= render :partial => 'newsletter_blurb'
|
||||
= render partial: 'newsletter_blurb'
|
||||
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit "Sign up", :class => 'btn btn-primary'
|
||||
= f.submit "Sign up", class: 'btn btn-primary'
|
||||
|
||||
.form-group
|
||||
.col-md-offset-2.col-md-8
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
- content_for :title, "Sign in"
|
||||
|
||||
= form_for(resource, :as => resource_name, :url => session_path(resource_name), :html => {:class => "form-horizontal"}) do |f|
|
||||
= form_for(resource, as: resource_name,
|
||||
url: session_path(resource_name),
|
||||
html: { class: "form-horizontal" }) do |f|
|
||||
= devise_error_messages!
|
||||
|
||||
.form-group
|
||||
= f.label :login, :class => "control-label col-md-2"
|
||||
= f.label :login, class: "control-label col-md-2"
|
||||
.col-md-8
|
||||
= f.text_field :login, :class => 'form-control'
|
||||
= f.text_field :login, class: 'form-control'
|
||||
|
||||
.form-group
|
||||
= f.label :password, :class => "control-label col-md-2"
|
||||
= f.label :password, class: "control-label col-md-2"
|
||||
.col-md-8
|
||||
= f.password_field :password, :class => 'form-control'
|
||||
= f.password_field :password, class: 'form-control'
|
||||
|
||||
- if devise_mapping.rememberable?
|
||||
.form-group
|
||||
@@ -22,7 +24,7 @@
|
||||
|
||||
.form-group
|
||||
.form-actions.col-md-8.col-md-offset-2
|
||||
= f.submit "Sign in", :class => 'btn btn-primary'
|
||||
= f.submit "Sign in", class: 'btn btn-primary'
|
||||
|
||||
.form-group
|
||||
.col-md-8.col-md-offset-2
|
||||
|
||||
@@ -1,15 +1,19 @@
|
||||
- content_for :title, "Resend unlock instructions"
|
||||
|
||||
= form_for(resource, :as => resource_name, :url => unlock_path(resource_name), :html => { :method => :post, :class => 'form-horizontal', :role => 'form' }) do |f|
|
||||
= form_for(resource, as: resource_name,
|
||||
url: unlock_path(resource_name),
|
||||
html: { method: :post,
|
||||
class: 'form-horizontal',
|
||||
role: 'form' }) do |f|
|
||||
= devise_error_messages!
|
||||
|
||||
.form-group
|
||||
= f.label :email, :class => 'control-label col-md-2'
|
||||
= f.label :email, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.email_field :email, :class => 'form-control'
|
||||
= f.email_field :email, class: 'form-control'
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit "Resend unlock instructions", :class => 'btn btn-primary'
|
||||
= f.submit "Resend unlock instructions", class: 'btn btn-primary'
|
||||
|
||||
.form-group
|
||||
.col-md-offset-2.col-md-8
|
||||
|
||||
15
app/views/harvests/_planting.haml
Normal file
15
app/views/harvests/_planting.haml
Normal file
@@ -0,0 +1,15 @@
|
||||
- if @harvest.planting
|
||||
= link_to "#{@harvest.planting.crop.name} planted on #{@harvest.planting.planted_at}",
|
||||
planting_path(@harvest.planting)
|
||||
in
|
||||
= link_to @harvest.planting.garden, garden_path(@harvest.planting.garden)
|
||||
- elsif @matching_plantings && @harvest.owner == current_member
|
||||
Is this from one of these plantings?
|
||||
= form_for(@harvest) do |f|
|
||||
- @matching_plantings.each do |planting|
|
||||
.field
|
||||
= f.radio_button :planting_id, planting.id
|
||||
= label_tag(:planting, planting)
|
||||
= f.submit "save", class: 'btn btn-default btn-xs'
|
||||
- else
|
||||
Unknown
|
||||
@@ -25,12 +25,9 @@
|
||||
%b Harvested:
|
||||
= @harvest.harvested_at ? @harvest.harvested_at : "not specified"
|
||||
|
||||
- if @planting
|
||||
%p
|
||||
%b Planting:
|
||||
= link_to "#{@planting.crop.name} planted on #{@planting.planted_at}", planting_path(@planting)
|
||||
in
|
||||
= link_to @planting.garden, garden_path(@planting.garden)
|
||||
= render partial: 'planting'
|
||||
%p
|
||||
%b Quantity:
|
||||
= display_quantity(@harvest)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.row
|
||||
.col-md-8
|
||||
- cache cache_key_for(Crop, 'interesting'), :expires_in => 1.day do
|
||||
- cache cache_key_for(Crop, 'interesting'), expires_in: 1.day do
|
||||
%h2= t('.our_crops')
|
||||
.hidden-xs
|
||||
- Crop.interesting.first(8).each do |c|
|
||||
@@ -14,7 +14,7 @@
|
||||
.col-md-4.hidden-xs
|
||||
- cache cache_key_for(Planting) do
|
||||
%h2= t('.recently_planted')
|
||||
= render partial: 'plantings/list', locals: { :plantings => Planting.interesting.first(6) }
|
||||
= render partial: 'plantings/list', locals: { plantings: Planting.interesting.first(6) }
|
||||
|
||||
.row
|
||||
.col-md-12
|
||||
@@ -22,7 +22,7 @@
|
||||
%p{ style: 'margin-top: 11.25px' }
|
||||
%strong
|
||||
#{t('.recently_added')}:
|
||||
!= Crop.recent.limit(12).map {|c| link_to(c, c) }.join(", ")
|
||||
!= Crop.recent.limit(12).map { |c| link_to(c, c) }.join(", ")
|
||||
|
||||
%p.text-right
|
||||
= link_to "#{t('.view_all')} »", crops_path
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
- posts = Post.limit(6)
|
||||
- if posts
|
||||
= render partial: "posts/summary", locals: {posts: posts, howmany: 6 }
|
||||
= render partial: "posts/summary", locals: { posts: posts, howmany: 6 }
|
||||
|
||||
- cache cache_key_for(Forum) do
|
||||
- forums = Forum.all
|
||||
|
||||
@@ -1,30 +1,28 @@
|
||||
- seeds = Seed.interesting.first(6)
|
||||
- if seeds.present?
|
||||
|
||||
%h2= t('.title')
|
||||
|
||||
- cache cache_key_for(Seed) do
|
||||
- if seeds.size > 0
|
||||
%table.table.table-striped
|
||||
%tr
|
||||
%th= t('.owner')
|
||||
%th= t('.crop')
|
||||
%th.hidden-xs.hidden-sm= t('.description')
|
||||
%th= t('.trade_to')
|
||||
%th= t('.from')
|
||||
%th
|
||||
|
||||
%table.table.table-striped
|
||||
- seeds.each do |seed|
|
||||
%tr
|
||||
%th= t('.owner')
|
||||
%th= t('.crop')
|
||||
%th.hidden-xs.hidden-sm= t('.description')
|
||||
%th= t('.trade_to')
|
||||
%th= t('.from')
|
||||
%th
|
||||
|
||||
- seeds.each do |seed|
|
||||
%tr
|
||||
%td= link_to seed.owner.login_name, seed.owner
|
||||
%td= link_to seed.crop.name, seed.crop
|
||||
%td.hidden-xs.hidden-sm= truncate(seed.description, :length => 40, :separator => ' ')
|
||||
%td= seed.tradable? ? seed.tradable_to : ''
|
||||
%td
|
||||
- if seed.tradable?
|
||||
= seed.owner.location.blank? ? t('.unspecified') : truncate(seed.owner.location, :length => 25, :separator => ', ')
|
||||
%td= link_to t('.details'), seed, class: 'btn btn-default btn-xs'
|
||||
%td= link_to seed.owner.login_name, seed.owner
|
||||
%td= link_to seed.crop.name, seed.crop
|
||||
%td.hidden-xs.hidden-sm= truncate(seed.description, length: 40, separator: ' ')
|
||||
%td= seed.tradable? ? seed.tradable_to : ''
|
||||
%td
|
||||
- if seed.tradable? && seed.owner.location.blank?
|
||||
= t('.unspecified')
|
||||
- elsif seed.tradable?
|
||||
= truncate(seed.owner.location, length: 25, separator: ', ')
|
||||
%td= link_to t('.details'), seed, class: 'btn btn-default btn-xs'
|
||||
|
||||
%p.text-right
|
||||
= link_to "#{t('.view_all')} »", seeds_path
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
- cache("homepage_stats") do
|
||||
%p.stats
|
||||
= t('.message_html', { member: link_to(t('.member_linktext', count: Member.confirmed.size.to_i), members_path),
|
||||
number_crops: link_to(t('.number_crops_linktext', count: Crop.count.to_i), crops_path),
|
||||
number_plantings: link_to(t('.number_plantings_linktext', count: Planting.count.to_i), plantings_path),
|
||||
number_gardens: link_to(t('.number_gardens_linktext', count: Garden.count.to_i), gardens_path) })
|
||||
= t('.message_html',
|
||||
member: link_to(t('.member_linktext', count: Member.confirmed.size.to_i), members_path),
|
||||
number_crops: link_to(t('.number_crops_linktext', count: Crop.count.to_i), crops_path),
|
||||
number_plantings: link_to(t('.number_plantings_linktext', count: Planting.count.to_i), plantings_path),
|
||||
number_gardens: link_to(t('.number_gardens_linktext', count: Garden.count.to_i), gardens_path))
|
||||
|
||||
|
||||
|
||||
@@ -7,6 +7,6 @@
|
||||
!= cms_snippet_content(:footer2)
|
||||
.col-md-4#footer3
|
||||
!= cms_snippet_content(:footer3)
|
||||
%div(style="float: right;")
|
||||
%a(href="http://opendefinition.org/ossd/")
|
||||
%img(src="http://assets.okfn.org/images/ok_buttons/os_80x15_blue.png" alt="")
|
||||
%div{ style: "float: right;" }
|
||||
%a{ href: "http://opendefinition.org/ossd/" }
|
||||
%img{ src: "http://assets.okfn.org/images/ok_buttons/os_80x15_blue.png", alt: "" }
|
||||
|
||||
@@ -1,33 +1,36 @@
|
||||
.sr-only
|
||||
=link_to t(".skip"), "#skipnav"
|
||||
.navbar.navbar-default.navbar-fixed-top(role="navigation")
|
||||
= link_to t(".skip"), "#skipnav"
|
||||
.navbar.navbar-default.navbar-fixed-top{ role: "navigation" }
|
||||
.container
|
||||
.navbar-header
|
||||
%button.navbar-toggle(data-target="#navbar-collapse" data-toggle="collapse")
|
||||
%button.navbar-toggle{ 'data-target': "#navbar-collapse", 'data-toggle': "collapse" }
|
||||
%span.sr-only= t('.toggle_navigation')
|
||||
%span.icon-bar
|
||||
%span.icon-bar
|
||||
%span.icon-bar
|
||||
%a.navbar-brand.hidden-xs(href=root_path)
|
||||
= image_tag("growstuff-brand.png", :size => "200x50", :alt => ENV['GROWSTUFF_SITE_NAME'])
|
||||
%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'])
|
||||
%a.navbar-brand.hidden-xs{ href: root_path }
|
||||
= image_tag("growstuff-brand.png", size: "200x50", alt: ENV['GROWSTUFF_SITE_NAME'])
|
||||
%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'
|
||||
= form_tag crops_search_path, method: :get, id: 'navbar-search' do
|
||||
= label_tag :term, "Search crop database:", class: 'sr-only'
|
||||
.input
|
||||
.input-group
|
||||
= text_field_tag 'term', nil, :class => 'search-query input-medium form-control', :placeholder => 'Search crops'
|
||||
= 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'
|
||||
%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.navbar-right
|
||||
%li.dropdown<
|
||||
%a.dropdown-toggle{'data-toggle' => 'dropdown', :href => crops_path}
|
||||
%a.dropdown-toggle{ 'data-toggle': 'dropdown', href: crops_path }
|
||||
= t('.crops')
|
||||
%b.caret
|
||||
%ul.dropdown-menu
|
||||
@@ -36,7 +39,7 @@
|
||||
%li= link_to t('.plantings'), plantings_path
|
||||
%li= link_to t('.harvests'), harvests_path
|
||||
%li.dropdown<
|
||||
%a.dropdown-toggle{'data-toggle' => 'dropdown', :href => members_path}
|
||||
%a.dropdown-toggle{ 'data-toggle': 'dropdown', href: members_path }
|
||||
= t('.community')
|
||||
%b.caret
|
||||
%ul.dropdown-menu
|
||||
@@ -48,39 +51,40 @@
|
||||
|
||||
- if member_signed_in?
|
||||
%li.dropdown<
|
||||
%a.dropdown-toggle{'data-toggle' => 'dropdown', :href => root_path}
|
||||
- if current_member.notifications.unread_count > 0
|
||||
%a.dropdown-toggle{ 'data-toggle': 'dropdown', href: root_path }
|
||||
- if current_member.notifications.unread_count.positive?
|
||||
= t('.your_stuff', unread_count: current_member.notifications.unread_count)
|
||||
- else
|
||||
= t('.current_memberlogin_name', :current_memberlogin_name => (current_member.login_name))
|
||||
= t('.current_memberlogin_name', current_memberlogin_name: current_member.login_name)
|
||||
%b.caret
|
||||
%ul.dropdown-menu
|
||||
%li= link_to t('.profile'), member_path(current_member)
|
||||
%li= link_to t('.gardens'), gardens_by_owner_path(:owner => current_member.slug)
|
||||
%li= link_to t('.plantings'), plantings_by_owner_path(:owner => current_member.slug)
|
||||
%li= link_to t('.harvest'), harvests_by_owner_path(:owner => current_member.slug)
|
||||
%li= link_to t('.seeds'), seeds_by_owner_path(:owner => current_member.slug)
|
||||
%li= link_to t('.posts'), posts_by_author_path(:author => current_member.slug)
|
||||
%li= link_to t('.gardens'), gardens_by_owner_path(owner: current_member.slug)
|
||||
%li= link_to t('.plantings'), plantings_by_owner_path(owner: current_member.slug)
|
||||
%li= link_to t('.harvest'), harvests_by_owner_path(owner: current_member.slug)
|
||||
%li= link_to t('.seeds'), seeds_by_owner_path(owner: current_member.slug)
|
||||
%li= link_to t('.posts'), posts_by_author_path(author: current_member.slug)
|
||||
%li= link_to t('.account'), orders_path
|
||||
%li
|
||||
- if current_member.notifications.unread_count > 0
|
||||
= link_to(t('.inbox_unread', unread_count: current_member.notifications.unread_count), notifications_path)
|
||||
- if current_member.notifications.unread_count.positive?
|
||||
= link_to(t('.inbox_unread', unread_count: current_member.notifications.unread_count),
|
||||
notifications_path)
|
||||
- else
|
||||
= link_to(t('.inbox'), notifications_path)
|
||||
- if current_member.role?(:crop_wrangler) || current_member.role?(:admin)
|
||||
%li{:class => 'divider', :role => 'presentation'}
|
||||
%li.divider{ role: 'presentation' }
|
||||
- if current_member.role?(:crop_wrangler)
|
||||
%li= link_to t('.crop_wrangling'), wrangle_crops_path
|
||||
- if current_member.role?(:admin)
|
||||
%li= link_to t('.admin'), admin_path
|
||||
|
||||
|
||||
%li= link_to t('.sign_out'), destroy_member_session_path, :method => :delete
|
||||
%li= link_to t('.sign_out'), destroy_member_session_path, method: :delete
|
||||
|
||||
- else
|
||||
%li= link_to t('.sign_in'), new_member_session_path, :id => 'navbar-signin'
|
||||
%li= link_to t('.sign_up'), new_member_registration_path, :id => 'navbar-signup'
|
||||
%li= link_to t('.sign_in'), new_member_session_path, id: 'navbar-signin'
|
||||
%li= link_to t('.sign_up'), new_member_registration_path, id: 'navbar-signup'
|
||||
|
||||
|
||||
- # anchor tag for accessibility link to skip the navigation menu
|
||||
%a{:name => 'skipnav'}
|
||||
-# anchor tag for accessibility link to skip the navigation menu
|
||||
%a{ name: 'skipnav' }
|
||||
|
||||
@@ -5,24 +5,33 @@
|
||||
= 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:title",
|
||||
content: (content_for?(:title) ? yield(:title) + " - " : "") + 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" })
|
||||
= auto_discovery_link_tag(:rss, { :controller => "/posts", :format => "rss" }, { :title => "#{ ENV['GROWSTUFF_SITE_NAME'] } - Recent posts from all members" })
|
||||
= auto_discovery_link_tag(:rss, { :controller => "/crops", :format => "rss" }, { :title => "#{ ENV['GROWSTUFF_SITE_NAME'] } - Recently added crops" })
|
||||
= auto_discovery_link_tag(:rss, { :controller => "/plantings", :format => "rss" }, { :title => "#{ ENV['GROWSTUFF_SITE_NAME'] } - Recent plantings from all members" })
|
||||
- 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")
|
||||
= auto_discovery_link_tag(:rss,
|
||||
{ controller: "/posts", format: "rss" },
|
||||
title: "#{ENV['GROWSTUFF_SITE_NAME']} - Recent posts from all members")
|
||||
= auto_discovery_link_tag(:rss,
|
||||
{ controller: "/crops", format: "rss" },
|
||||
title: "#{ENV['GROWSTUFF_SITE_NAME']} - Recently added crops")
|
||||
= auto_discovery_link_tag(:rss,
|
||||
{ controller: "/plantings", format: "rss" },
|
||||
title: "#{ENV['GROWSTUFF_SITE_NAME']} - Recent plantings from all members")
|
||||
|
||||
%title
|
||||
= content_for?(:title) ? yield(:title) + " - #{ ENV['GROWSTUFF_SITE_NAME']} " : ENV['GROWSTUFF_SITE_NAME']
|
||||
= content_for?(:title) ? yield(:title) + " - #{ENV['GROWSTUFF_SITE_NAME']} " : ENV['GROWSTUFF_SITE_NAME']
|
||||
= csrf_meta_tags
|
||||
/ Le HTML5 shim, for IE6-8 support of HTML elements
|
||||
/[if lt IE 9]
|
||||
= javascript_include_tag "http://html5shim.googlecode.com/svn/trunk/html5.js"
|
||||
= stylesheet_link_tag "application", :media => "all"
|
||||
= stylesheet_link_tag "application", media: "all"
|
||||
|
||||
%link(href="/growstuff-apple-touch-icon-precomposed.png" rel="apple-touch-icon-precomposed")
|
||||
%link{ href: "/growstuff-apple-touch-icon-precomposed.png", rel: "apple-touch-icon-precomposed" }
|
||||
= favicon_link_tag 'favicon.ico'
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
!!! 5
|
||||
%html(lang="en" prefix="og: http://ogp.me/ns#")
|
||||
= render :partial => "layouts/meta"
|
||||
%html{ lang: "en", prefix: "og: http://ogp.me/ns#" }
|
||||
= render partial: "layouts/meta"
|
||||
%body
|
||||
= render :partial => "layouts/header"
|
||||
= render partial: "layouts/header"
|
||||
|
||||
#maincontainer.container
|
||||
.container#maincontainer
|
||||
.row
|
||||
.col-md-12
|
||||
- if content_for?(:title)
|
||||
@@ -17,11 +17,11 @@
|
||||
%p
|
||||
.btn-group
|
||||
= yield(:buttonbar)
|
||||
= render :partial => "shared/flash_messages", flash: flash
|
||||
= render partial: "shared/flash_messages", flash: flash
|
||||
= yield
|
||||
|
||||
%footer
|
||||
= render :partial => "layouts/footer"
|
||||
= render partial: "layouts/footer"
|
||||
/
|
||||
Javascripts
|
||||
\==================================================
|
||||
|
||||
@@ -3,17 +3,17 @@
|
||||
|
||||
- if twitter_auth
|
||||
%p
|
||||
= image_tag "twitter_32.png", :size => "32x32", alt: 'Twitter logo'
|
||||
= image_tag "twitter_32.png", size: "32x32", alt: 'Twitter logo'
|
||||
= link_to twitter_auth.name, "http://twitter.com/#{twitter_auth.name}"
|
||||
|
||||
- if flickr_auth
|
||||
%p
|
||||
= image_tag "flickr_32.png", :size => "32x32", alt: 'Flickr logo'
|
||||
= image_tag "flickr_32.png", size: "32x32", alt: 'Flickr logo'
|
||||
= link_to flickr_auth.name, "http://flickr.com/photos/#{flickr_auth.uid}"
|
||||
|
||||
- if facebook_auth
|
||||
%p
|
||||
= image_tag "facebook_32.png", :size => "32x32", alt: 'Facebook logo'
|
||||
= image_tag "facebook_32.png", size: "32x32", alt: 'Facebook logo'
|
||||
= link_to facebook_auth.name, "http://facebook.com/profile/#{facebook_auth.uid}"
|
||||
|
||||
- if member.show_email
|
||||
|
||||
@@ -10,11 +10,11 @@
|
||||
%li.navbar-right
|
||||
= link_to new_garden_path, class: 'btn' do
|
||||
Add New Garden
|
||||
.tab-content{style: "padding-top: 1em"}
|
||||
.tab-content{ style: "padding-top: 1em" }
|
||||
- first_garden = true
|
||||
- gardens.each do |g|
|
||||
|
||||
%div{ class: ['tab-pane', first_garden ? 'active' : ''], id: "garden#{g.id}"}
|
||||
%div{ class: ['tab-pane', first_garden ? 'active' : ''], id: "garden#{g.id}" }
|
||||
- first_garden = false
|
||||
|
||||
.container
|
||||
@@ -30,7 +30,7 @@
|
||||
= link_to 'tell us more.', edit_garden_path(g)
|
||||
|
||||
|
||||
- if g.photos.size > 0 or (can? :edit, g and can? :create, Photo)
|
||||
- if !g.photos.empty? || (can?(:edit, g) && can?(:create, Photo))
|
||||
.row
|
||||
%h3 Photos
|
||||
%p= localize_plural(g.photos, Photo)
|
||||
@@ -40,16 +40,16 @@
|
||||
.col-md-2.six-across
|
||||
= render partial: 'photos/thumbnail', locals: { photo: p }
|
||||
.row
|
||||
- if can? :create, Photo and can? :edit, g
|
||||
- if can?(:create, Photo) && can?(:edit, g)
|
||||
%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
|
||||
- unless g.featured_plantings.empty?
|
||||
- g.featured_plantings.each.with_index do |planting|
|
||||
.col-xs-12.col-lg-6
|
||||
= render partial: "plantings/thumbnail", locals: {:planting => planting}
|
||||
= render partial: "plantings/thumbnail", locals: { planting: planting }
|
||||
|
||||
%p
|
||||
= link_to "More about this garden...", url_for(g)
|
||||
|
||||
@@ -2,34 +2,34 @@
|
||||
|
||||
%ul.list-inline
|
||||
%li
|
||||
- unless member.plantings.empty?
|
||||
- if !member.plantings.empty?
|
||||
= link_to localize_plural(member.plantings, Planting), plantings_by_owner_path(owner: member)
|
||||
- else
|
||||
0 plantings
|
||||
%li
|
||||
- unless member.harvests.empty?
|
||||
- if !member.harvests.empty?
|
||||
= link_to localize_plural(member.harvests, Harvest), harvests_by_owner_path(owner: member)
|
||||
- else
|
||||
0 harvests
|
||||
%li
|
||||
- unless member.seeds.empty?
|
||||
- if !member.seeds.empty?
|
||||
= link_to localize_plural(member.seeds, Seed), seeds_by_owner_path(owner: member)
|
||||
- else
|
||||
0 seeds
|
||||
%li
|
||||
- unless member.posts.empty?
|
||||
- if !member.posts.empty?
|
||||
= link_to localize_plural(member.posts, Post), posts_by_author_path(author: member)
|
||||
- else
|
||||
0 posts
|
||||
|
||||
%li
|
||||
- unless member.followed.empty?
|
||||
- if !member.followed.empty?
|
||||
= link_to localize_plural(member.followed, Follow), member_follows_path(member)
|
||||
- else
|
||||
0 following
|
||||
|
||||
%li
|
||||
- unless member.followers.empty?
|
||||
- if !member.followers.empty?
|
||||
= link_to pluralize(member.followers.size, "follower"), member_followers_path(member)
|
||||
- else
|
||||
0 followers
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
%small
|
||||
%br/
|
||||
Recently planted:
|
||||
!= member.plantings.first(3).map{|p| link_to p.crop_name, p }.join(", ")
|
||||
!= member.plantings.first(3).map { |p| link_to p.crop_name, p }.join(", ")
|
||||
%p
|
||||
%small
|
||||
Joined
|
||||
@@ -21,4 +21,7 @@
|
||||
ago.
|
||||
%p
|
||||
%small
|
||||
= [localize_plural(member.gardens, Garden), localize_plural(member.plantings, Planting), localize_plural(member.seeds, Seed)].join(", ")
|
||||
= [localize_plural(member.gardens, Garden),
|
||||
localize_plural(member.plantings, Planting),
|
||||
localize_plural(member.seeds, Seed)].join(", ")
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
%p Sign up for a Growstuff account to track your veggie garden and connect with other local growers.
|
||||
|
||||
= form_for(current_member, as: 'member', url: finish_signup_path(current_member), html: { role: 'form'}) do |f|
|
||||
= form_for(current_member, as: 'member', url: finish_signup_path(current_member), html: { role: 'form' }) do |f|
|
||||
- if @show_errors && current_member.errors.any?
|
||||
.alert.alert-danger
|
||||
- current_member.errors.full_messages.each do |msg|
|
||||
@@ -31,10 +31,10 @@
|
||||
.form-group
|
||||
.col-md-offset-2.col-md-8.checkbox
|
||||
%label
|
||||
= f.check_box :newsletter, :checked => true
|
||||
= f.check_box :newsletter, checked: true
|
||||
Subscribe to the #{ENV['GROWSTUFF_SITE_NAME']} newsletter
|
||||
.help-inline
|
||||
= render partial: 'devise/registrations/newsletter_blurb'
|
||||
|
||||
.actions
|
||||
= f.submit 'Continue', class: 'btn btn-primary'
|
||||
= f.submit 'Continue', class: 'btn btn-primary'
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
= content_for :title, t(".title", site_name: "#{ENV['GROWSTUFF_SITE_NAME']}")
|
||||
= content_for :title, t(".title", site_name: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
= form_tag(members_path, method: :get, class: 'form-inline', role: 'form') do
|
||||
.form-group
|
||||
= label_tag :sort, "Sort by:", class: 'sr-only'
|
||||
= select_tag "sort", options_for_select({"Sort alphabetically" => 'alpha', "Sort by recently joined" => "recently_joined"}, @sort || 'alpha'), class: 'form-control'
|
||||
= select_tag "sort",
|
||||
options_for_select({ "Sort alphabetically": 'alpha', "Sort by recently joined": "recently_joined" },
|
||||
@sort || 'alpha'),
|
||||
class: 'form-control'
|
||||
= submit_tag "Show", class: 'btn btn-primary'
|
||||
|
||||
.pagination
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
= form_tag(nearby_members_path, method: :get, class: 'form-inline') do
|
||||
= label_tag :distance, "Find members within", class: 'control-label'
|
||||
= text_field_tag :distance, @distance, class: 'input-mini'
|
||||
= select_tag :units, options_for_select({"miles" => :mi, "km" => :km}, @units), class: 'input-small'
|
||||
= select_tag :units, options_for_select({ "miles": :mi, "km": :km }, @units), class: 'input-small'
|
||||
= label_tag :location, "of", class: 'control-label'
|
||||
= text_field_tag :location, @location
|
||||
= submit_tag "Search", class: 'btn btn-primary'
|
||||
|
||||
@@ -12,14 +12,14 @@
|
||||
= link_to 'Edit profile', edit_member_registration_path, class: 'btn btn-default'
|
||||
- if @member == current_member && !@member.paid?
|
||||
= link_to "Upgrade account", shop_path, class: 'btn btn-default'
|
||||
- if can? :create, Notification and current_member != @member
|
||||
= link_to 'Send message', new_notification_path(:recipient_id => @member.id), class: 'btn btn-default'
|
||||
- if can?(:create, Notification) && current_member != @member
|
||||
= link_to 'Send message', new_notification_path(recipient_id: @member.id), class: 'btn btn-default'
|
||||
|
||||
- if current_member and current_member != @member # must be logged in, can't follow yourself
|
||||
- if current_member && current_member != @member # must be logged in, can't follow yourself
|
||||
- follow = current_member.get_follow(@member)
|
||||
- if !follow and can? :create, Follow # not already following
|
||||
= link_to 'Follow', follows_path(:followed_id => @member.id), method: :post, class: 'btn btn-default'
|
||||
- if follow and can? :destroy, follow # already following
|
||||
- if !follow && can?(:create, Follow) # not already following
|
||||
= link_to 'Follow', follows_path(followed_id: @member.id), method: :post, class: 'btn btn-default'
|
||||
- if follow && can?(:destroy, follow) # already following
|
||||
= link_to 'Unfollow', follow_path(follow), method: :delete, class: 'btn btn-default'
|
||||
|
||||
- content_for :member_rss_login_name, @member.login_name
|
||||
@@ -35,4 +35,7 @@
|
||||
= render partial: "avatar", locals: { member: @member }
|
||||
= render partial: "account", locals: { member: @member }
|
||||
= render partial: "stats", locals: { member: @member }
|
||||
= render partial: "contact", locals: { member: @member, :twitter_auth => @twitter_auth, :flickr_auth => @flickr_auth, :facebook_auth => @facebook_auth }
|
||||
= render partial: "contact", locals: { member: @member,
|
||||
twitter_auth: @twitter_auth,
|
||||
flickr_auth: @flickr_auth,
|
||||
facebook_auth: @facebook_auth }
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
%rss{version: 2.0}
|
||||
%rss{ version: 2.0 }
|
||||
%channel
|
||||
%title #{@member.login_name}'s recent posts (#{ENV['GROWSTUFF_SITE_NAME']})
|
||||
%link= member_url(@member)
|
||||
- @posts.each do |post|
|
||||
%item
|
||||
%title #{post.subject} by #{post.author.login_name}
|
||||
%pubDate= post.created_at.to_s(:rfc822)
|
||||
%pubdate= post.created_at.to_s(:rfc822)
|
||||
%link= post_url(post)
|
||||
%guid= post_url(post)
|
||||
%description
|
||||
|
||||
@@ -10,4 +10,4 @@
|
||||
|
||||
.well
|
||||
:growstuff_markdown
|
||||
#{ strip_tags(notification.body) }
|
||||
#{ strip_tags(notification.body) }
|
||||
|
||||
@@ -15,3 +15,4 @@
|
||||
= link_to 'Plant something', new_planting_path, class: 'btn btn-primary'
|
||||
- else
|
||||
= render partial: 'shared/signin_signup', locals: { to: "track what you've planted" }
|
||||
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
.progress
|
||||
%div{ class: "progress-bar progress-bar-#{status}", role: "progressbar", style: "width: #{progress}" }
|
||||
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
planting, method: :delete,
|
||||
data: { confirm: 'Are you sure?' },
|
||||
class: 'btn btn-default btn-xs'
|
||||
|
||||
.row
|
||||
.col-xs-12.col-md-4
|
||||
%dl
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
= link_to @planting.garden, @planting.garden
|
||||
- unless @planting.owner.location.blank?
|
||||
(#{@planting.owner.location})
|
||||
|
||||
%dt Quantity:
|
||||
%dd
|
||||
= display_planting_quantity(@planting)
|
||||
|
||||
@@ -40,10 +40,13 @@
|
||||
= pluralize(post.likes.count, "like") unless post.likes.empty?
|
||||
- if member_signed_in?
|
||||
- if !post.members.include? current_member
|
||||
= link_to 'Like', likes_path(Like.new, post_id: post.id, format: :json),
|
||||
method: :post, remote: true, class: 'post-like'
|
||||
- if can?(:new, Like)
|
||||
= link_to 'Like', likes_path(post_id: post.id, format: :json),
|
||||
method: :post, remote: true, class: 'post-like'
|
||||
- else
|
||||
- like = post.likes.find_by(member: current_member)
|
||||
- if like
|
||||
= link_to 'Unlike', like_path(like, format: :json),
|
||||
- if like && can?(:destroy, like)
|
||||
= link_to 'Unlike', like_path(id: like.id, format: :json),
|
||||
method: :delete, remote: true, class: 'post-like'
|
||||
|
||||
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
= form_for @product do |f|
|
||||
- if @product.errors.any?
|
||||
#error_explanation
|
||||
%h2= "#{pluralize(@product.errors.size, "error")} prohibited this product from being saved:"
|
||||
%h2
|
||||
= pluralize(@product.errors.size, "error")
|
||||
prohibited this product from being saved:
|
||||
%ul
|
||||
- @product.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
.field
|
||||
= f.label :name
|
||||
= f.text_field :name, :class => 'form-control'
|
||||
= f.text_field :name, class: 'form-control'
|
||||
.field
|
||||
= f.label :description
|
||||
= f.text_area :description, :class => 'form-control'
|
||||
= f.text_area :description, class: 'form-control'
|
||||
.field
|
||||
= f.label :min_price, "Minimum price (in cents)"
|
||||
= f.text_field :min_price
|
||||
@@ -21,7 +23,7 @@
|
||||
.field
|
||||
= f.label :account_type
|
||||
= collection_select(:product, :account_type_id, AccountType.all, :id,
|
||||
:name, :selected => @product.account_type_id )
|
||||
:name, selected: @product.account_type_id)
|
||||
.field
|
||||
= f.label :paid_months
|
||||
= f.text_field :paid_months
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
%td= product.paid_months
|
||||
%td= link_to 'Show', product
|
||||
%td= link_to 'Edit', edit_product_path(product)
|
||||
%td= link_to 'Destroy', product, :method => :delete, :data => { :confirm => 'Are you sure?' }
|
||||
%td= link_to 'Destroy', product, method: :delete, data: { confirm: 'Are you sure?' }
|
||||
|
||||
%br
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
= form_for @scientific_name, :html => {:class => 'form-horizontal', :role => "form"} do |f|
|
||||
= form_for @scientific_name, html: { class: 'form-horizontal', role: "form" } do |f|
|
||||
- if @scientific_name.errors.any?
|
||||
#error_explanation
|
||||
%h2= "#{pluralize(@scientific_name.errors.size, "error")} prohibited this scientific_name from being saved:"
|
||||
%h2
|
||||
= pluralize(@scientific_name.errors.size, "error")
|
||||
prohibited this scientific_name from being saved:
|
||||
%ul
|
||||
- @scientific_name.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
@@ -9,17 +11,19 @@
|
||||
%p
|
||||
%span.help-block
|
||||
For detailed crop wrangling guidelines, please consult the
|
||||
=link_to "crop wrangling guide", "http://wiki.growstuff.org/index.php/Crop_wrangling"
|
||||
= link_to "crop wrangling guide", "http://wiki.growstuff.org/index.php/Crop_wrangling"
|
||||
on the Growstuff wiki.
|
||||
|
||||
.form-group
|
||||
= f.label :crop_id, :class => 'control-label col-md-2'
|
||||
= f.label :crop_id, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= collection_select(:scientific_name, :crop_id, Crop.all, :id, :name, { :selected => @scientific_name.crop_id || @crop.id }, :class => 'form-control')
|
||||
= collection_select(:scientific_name, :crop_id, Crop.all, :id,
|
||||
:name, { selected: @scientific_name.crop_id || @crop.id },
|
||||
class: 'form-control')
|
||||
.form-group
|
||||
= f.label :name, :class => 'control-label col-md-2'
|
||||
= f.label :name, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_field :name, :class => 'form-control'
|
||||
= f.text_field :name, class: 'form-control'
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit 'Save', :class => 'btn btn-primary'
|
||||
= f.submit 'Save', class: 'btn btn-primary'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
- content_for :title, "Listing scientific names"
|
||||
|
||||
- if can? :create, ScientificName
|
||||
%p= link_to 'New Scientific name', new_scientific_name_path, :class => 'btn btn-primary'
|
||||
%p= link_to 'New Scientific name', new_scientific_name_path, class: 'btn btn-primary'
|
||||
|
||||
%table
|
||||
%tr
|
||||
@@ -17,7 +17,8 @@
|
||||
%td= link_to 'Show', scientific_name
|
||||
%td
|
||||
- if can? :edit, scientific_name
|
||||
= link_to 'Edit', edit_scientific_name_path(scientific_name), :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Edit', edit_scientific_name_path(scientific_name), class: 'btn btn-default btn-xs'
|
||||
%td
|
||||
- if can? :destroy, scientific_name
|
||||
= link_to 'Delete', scientific_name, method: :delete, data: { confirm: 'Are you sure?' }, :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Delete', scientific_name, method: :delete, data: { confirm: 'Are you sure?' },
|
||||
class: 'btn btn-default btn-xs'
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
%p#notice= notice
|
||||
|
||||
= render :partial => 'crops/approval_status_message', :locals => { :crop => @scientific_name.crop }
|
||||
= render partial: 'crops/approval_status_message', locals: { crop: @scientific_name.crop }
|
||||
|
||||
%p
|
||||
%b Scientific name:
|
||||
@@ -20,6 +20,6 @@
|
||||
|
||||
|
||||
- if can? :edit, @scientific_name
|
||||
= link_to 'Edit', edit_scientific_name_path(@scientific_name), :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Edit', edit_scientific_name_path(@scientific_name), class: 'btn btn-default btn-xs'
|
||||
\|
|
||||
= link_to 'Back', scientific_names_path
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
.row
|
||||
.col-md-4
|
||||
= link_to image_tag((seed.crop.default_photo ? seed.crop.default_photo.thumbnail_url : 'placeholder_150.png'),
|
||||
alt: seed.crop.name, class: 'img'), seed.crop
|
||||
alt: seed.crop.name, class: 'img'),
|
||||
seed.crop
|
||||
.col-md-8
|
||||
%dl.dl-horizontal
|
||||
%dt Crop :
|
||||
|
||||
@@ -9,5 +9,5 @@
|
||||
%strong Paid until:
|
||||
= current_member.account.paid_until_string
|
||||
|
||||
- if !current_member.paid?
|
||||
= link_to "Upgrade and support #{ENV['GROWSTUFF_SITE_NAME']}", shop_path, :class => 'btn btn-primary'
|
||||
- unless current_member.paid?
|
||||
= link_to "Upgrade and support #{ENV['GROWSTUFF_SITE_NAME']}", shop_path, class: 'btn btn-primary'
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
%span.help-block.optional
|
||||
= I18n.t 'optional', :scope => 'forms'
|
||||
= I18n.t 'optional', scope: 'forms'
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
You can use
|
||||
=link_to 'Markdown', 'http://daringfireball.net/projects/markdown/syntax/'
|
||||
= link_to 'Markdown', 'http://daringfireball.net/projects/markdown/syntax/'
|
||||
to format your text.
|
||||
%br/
|
||||
For instance, *italic*, **bold**, or a link [like this](http://to.some.site.com/).
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
=link_to 'Sign in', new_member_session_path
|
||||
= link_to 'Sign in', new_member_session_path
|
||||
or
|
||||
=link_to 'sign up', new_member_registration_path
|
||||
= link_to 'sign up', new_member_registration_path
|
||||
to
|
||||
= succeed "." do
|
||||
= to
|
||||
|
||||
@@ -6,9 +6,9 @@ Growstuff::Application.configure do
|
||||
# preloads Rails for running tests, you may have to set it to true.
|
||||
config.eager_load = false
|
||||
|
||||
# Do not compile assets on-demand. On-demand compilation slows down the test
|
||||
# suite and causes random test failures.
|
||||
config.assets.compile = false
|
||||
# Allow lazy compilation of assets. Required for running Jasmine tests via
|
||||
# `rake spec:javascript`.
|
||||
config.assets.compile = true
|
||||
|
||||
# The test environment is used exclusively to run your application's
|
||||
# test suite. You never need to work with it otherwise. Remember that
|
||||
@@ -66,7 +66,7 @@ Geocoder::Lookup::Test.add_stub(
|
||||
"Amundsen-Scott Base, Antarctica", [
|
||||
{
|
||||
'latitude' => -90.0,
|
||||
'longitude' => 0.0,
|
||||
'longitude' => 0.0
|
||||
}
|
||||
]
|
||||
)
|
||||
@@ -89,7 +89,7 @@ Geocoder::Lookup::Test.add_stub(
|
||||
"Greenwich, UK", [
|
||||
{
|
||||
'latitude' => 51.483061,
|
||||
'longitude' => -0.004151,
|
||||
'longitude' => -0.004151
|
||||
}
|
||||
]
|
||||
)
|
||||
@@ -98,7 +98,7 @@ Geocoder::Lookup::Test.add_stub(
|
||||
"Edinburgh", [
|
||||
{
|
||||
'latitude' => 55.953252,
|
||||
'longitude' => -3.188267,
|
||||
'longitude' => -3.188267
|
||||
}
|
||||
]
|
||||
)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
ActionDispatch::Callbacks.after do
|
||||
# Reload the factories
|
||||
return unless (Rails.env.development? || Rails.env.test?)
|
||||
return unless Rails.env.development? || Rails.env.test?
|
||||
|
||||
unless FactoryGirl.factories.blank? # first init will load factories, this should only run on subsequent reloads
|
||||
FactoryGirl.factories.clear
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
class RenameNotificationFields < ActiveRecord::Migration
|
||||
def change
|
||||
change_table :notifications do |t|
|
||||
change_table :notifications do |t| # rubocop:disable Rails/ReversibleMigration
|
||||
t.rename :to_id, :recipient_id
|
||||
t.rename :from_id, :sender_id
|
||||
end
|
||||
|
||||
246
db/schema.rb
246
db/schema.rb
@@ -17,7 +17,7 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
enable_extension "plpgsql"
|
||||
|
||||
create_table "account_types", force: :cascade do |t|
|
||||
t.string "name", null: false
|
||||
t.string "name", limit: 255, null: false
|
||||
t.boolean "is_paid"
|
||||
t.boolean "is_permanent_paid"
|
||||
t.datetime "created_at"
|
||||
@@ -33,31 +33,31 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
end
|
||||
|
||||
create_table "alternate_names", force: :cascade do |t|
|
||||
t.string "name", null: false
|
||||
t.integer "crop_id", null: false
|
||||
t.integer "creator_id", null: false
|
||||
t.string "name", limit: 255, null: false
|
||||
t.integer "crop_id", null: false
|
||||
t.integer "creator_id", null: false
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
end
|
||||
|
||||
create_table "authentications", force: :cascade do |t|
|
||||
t.integer "member_id", null: false
|
||||
t.string "provider", null: false
|
||||
t.string "uid"
|
||||
t.string "token"
|
||||
t.string "secret"
|
||||
t.integer "member_id", null: false
|
||||
t.string "provider", limit: 255, null: false
|
||||
t.string "uid", limit: 255
|
||||
t.string "token", limit: 255
|
||||
t.string "secret", limit: 255
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.string "name"
|
||||
t.string "name", limit: 255
|
||||
end
|
||||
|
||||
add_index "authentications", ["member_id"], name: "index_authentications_on_member_id", using: :btree
|
||||
|
||||
create_table "comfy_cms_blocks", force: :cascade do |t|
|
||||
t.string "identifier", null: false
|
||||
t.string "identifier", limit: 255, null: false
|
||||
t.text "content"
|
||||
t.integer "blockable_id"
|
||||
t.string "blockable_type"
|
||||
t.string "blockable_type", limit: 255
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
end
|
||||
@@ -66,17 +66,17 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
add_index "comfy_cms_blocks", ["identifier"], name: "index_comfy_cms_blocks_on_identifier", using: :btree
|
||||
|
||||
create_table "comfy_cms_categories", force: :cascade do |t|
|
||||
t.integer "site_id", null: false
|
||||
t.string "label", null: false
|
||||
t.string "categorized_type", null: false
|
||||
t.integer "site_id", null: false
|
||||
t.string "label", limit: 255, null: false
|
||||
t.string "categorized_type", limit: 255, null: false
|
||||
end
|
||||
|
||||
add_index "comfy_cms_categories", ["site_id", "categorized_type", "label"], name: "index_cms_categories_on_site_id_and_cat_type_and_label", unique: true, using: :btree
|
||||
|
||||
create_table "comfy_cms_categorizations", force: :cascade do |t|
|
||||
t.integer "category_id", null: false
|
||||
t.string "categorized_type", null: false
|
||||
t.integer "categorized_id", null: false
|
||||
t.integer "category_id", null: false
|
||||
t.string "categorized_type", limit: 255, null: false
|
||||
t.integer "categorized_id", null: false
|
||||
end
|
||||
|
||||
add_index "comfy_cms_categorizations", ["category_id", "categorized_type", "categorized_id"], name: "index_cms_categorizations_on_cat_id_and_catd_type_and_catd_id", unique: true, using: :btree
|
||||
@@ -84,9 +84,9 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
create_table "comfy_cms_files", force: :cascade do |t|
|
||||
t.integer "site_id", null: false
|
||||
t.integer "block_id"
|
||||
t.string "label", null: false
|
||||
t.string "file_file_name", null: false
|
||||
t.string "file_content_type", null: false
|
||||
t.string "label", limit: 255, null: false
|
||||
t.string "file_file_name", limit: 255, null: false
|
||||
t.string "file_content_type", limit: 255, null: false
|
||||
t.integer "file_file_size", null: false
|
||||
t.string "description", limit: 2048
|
||||
t.integer "position", default: 0, null: false
|
||||
@@ -100,16 +100,16 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
add_index "comfy_cms_files", ["site_id", "position"], name: "index_comfy_cms_files_on_site_id_and_position", using: :btree
|
||||
|
||||
create_table "comfy_cms_layouts", force: :cascade do |t|
|
||||
t.integer "site_id", null: false
|
||||
t.integer "site_id", null: false
|
||||
t.integer "parent_id"
|
||||
t.string "app_layout"
|
||||
t.string "label", null: false
|
||||
t.string "identifier", null: false
|
||||
t.string "app_layout", limit: 255
|
||||
t.string "label", limit: 255, null: false
|
||||
t.string "identifier", limit: 255, null: false
|
||||
t.text "content"
|
||||
t.text "css"
|
||||
t.text "js"
|
||||
t.integer "position", default: 0, null: false
|
||||
t.boolean "is_shared", default: false, null: false
|
||||
t.integer "position", default: 0, null: false
|
||||
t.boolean "is_shared", default: false, null: false
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
end
|
||||
@@ -118,18 +118,18 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
add_index "comfy_cms_layouts", ["site_id", "identifier"], name: "index_comfy_cms_layouts_on_site_id_and_identifier", unique: true, using: :btree
|
||||
|
||||
create_table "comfy_cms_pages", force: :cascade do |t|
|
||||
t.integer "site_id", null: false
|
||||
t.integer "site_id", null: false
|
||||
t.integer "layout_id"
|
||||
t.integer "parent_id"
|
||||
t.integer "target_page_id"
|
||||
t.string "label", null: false
|
||||
t.string "slug"
|
||||
t.string "full_path", null: false
|
||||
t.string "label", limit: 255, null: false
|
||||
t.string "slug", limit: 255
|
||||
t.string "full_path", limit: 255, null: false
|
||||
t.text "content_cache"
|
||||
t.integer "position", default: 0, null: false
|
||||
t.integer "children_count", default: 0, null: false
|
||||
t.boolean "is_published", default: true, null: false
|
||||
t.boolean "is_shared", default: false, null: false
|
||||
t.integer "position", default: 0, null: false
|
||||
t.integer "children_count", default: 0, null: false
|
||||
t.boolean "is_published", default: true, null: false
|
||||
t.boolean "is_shared", default: false, null: false
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
end
|
||||
@@ -138,8 +138,8 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
add_index "comfy_cms_pages", ["site_id", "full_path"], name: "index_comfy_cms_pages_on_site_id_and_full_path", using: :btree
|
||||
|
||||
create_table "comfy_cms_revisions", force: :cascade do |t|
|
||||
t.string "record_type", null: false
|
||||
t.integer "record_id", null: false
|
||||
t.string "record_type", limit: 255, null: false
|
||||
t.integer "record_id", null: false
|
||||
t.text "data"
|
||||
t.datetime "created_at"
|
||||
end
|
||||
@@ -147,24 +147,24 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
add_index "comfy_cms_revisions", ["record_type", "record_id", "created_at"], name: "index_cms_revisions_on_rtype_and_rid_and_created_at", using: :btree
|
||||
|
||||
create_table "comfy_cms_sites", force: :cascade do |t|
|
||||
t.string "label", null: false
|
||||
t.string "identifier", null: false
|
||||
t.string "hostname", null: false
|
||||
t.string "path"
|
||||
t.string "locale", default: "en", null: false
|
||||
t.boolean "is_mirrored", default: false, null: false
|
||||
t.string "label", limit: 255, null: false
|
||||
t.string "identifier", limit: 255, null: false
|
||||
t.string "hostname", limit: 255, null: false
|
||||
t.string "path", limit: 255
|
||||
t.string "locale", limit: 255, default: "en", null: false
|
||||
t.boolean "is_mirrored", default: false, null: false
|
||||
end
|
||||
|
||||
add_index "comfy_cms_sites", ["hostname"], name: "index_comfy_cms_sites_on_hostname", using: :btree
|
||||
add_index "comfy_cms_sites", ["is_mirrored"], name: "index_comfy_cms_sites_on_is_mirrored", using: :btree
|
||||
|
||||
create_table "comfy_cms_snippets", force: :cascade do |t|
|
||||
t.integer "site_id", null: false
|
||||
t.string "label", null: false
|
||||
t.string "identifier", null: false
|
||||
t.integer "site_id", null: false
|
||||
t.string "label", limit: 255, null: false
|
||||
t.string "identifier", limit: 255, null: false
|
||||
t.text "content"
|
||||
t.integer "position", default: 0, null: false
|
||||
t.boolean "is_shared", default: false, null: false
|
||||
t.integer "position", default: 0, null: false
|
||||
t.boolean "is_shared", default: false, null: false
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
end
|
||||
@@ -181,16 +181,16 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
end
|
||||
|
||||
create_table "crops", force: :cascade do |t|
|
||||
t.string "name", null: false
|
||||
t.string "en_wikipedia_url"
|
||||
t.string "name", limit: 255, null: false
|
||||
t.string "en_wikipedia_url", limit: 255
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.string "slug"
|
||||
t.string "slug", limit: 255
|
||||
t.integer "parent_id"
|
||||
t.integer "plantings_count", default: 0
|
||||
t.integer "plantings_count", default: 0
|
||||
t.integer "creator_id"
|
||||
t.integer "requester_id"
|
||||
t.string "approval_status", default: "approved"
|
||||
t.string "approval_status", limit: 255, default: "approved"
|
||||
t.text "reason_for_rejection"
|
||||
t.text "request_notes"
|
||||
t.text "rejection_notes"
|
||||
@@ -216,29 +216,29 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
end
|
||||
|
||||
create_table "forums", force: :cascade do |t|
|
||||
t.string "name", null: false
|
||||
t.text "description", null: false
|
||||
t.integer "owner_id", null: false
|
||||
t.string "name", limit: 255, null: false
|
||||
t.text "description", null: false
|
||||
t.integer "owner_id", null: false
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.string "slug"
|
||||
t.string "slug", limit: 255
|
||||
end
|
||||
|
||||
add_index "forums", ["slug"], name: "index_forums_on_slug", unique: true, using: :btree
|
||||
|
||||
create_table "gardens", force: :cascade do |t|
|
||||
t.string "name", null: false
|
||||
t.string "name", limit: 255, null: false
|
||||
t.integer "owner_id"
|
||||
t.string "slug", null: false
|
||||
t.string "slug", limit: 255, null: false
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.text "description"
|
||||
t.boolean "active", default: true
|
||||
t.string "location"
|
||||
t.boolean "active", default: true
|
||||
t.string "location", limit: 255
|
||||
t.float "latitude"
|
||||
t.float "longitude"
|
||||
t.decimal "area"
|
||||
t.string "area_unit"
|
||||
t.string "area_unit", limit: 255
|
||||
end
|
||||
|
||||
add_index "gardens", ["owner_id"], name: "index_gardens_on_owner_id", using: :btree
|
||||
@@ -252,17 +252,17 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
add_index "gardens_photos", ["garden_id", "photo_id"], name: "index_gardens_photos_on_garden_id_and_photo_id", using: :btree
|
||||
|
||||
create_table "harvests", force: :cascade do |t|
|
||||
t.integer "crop_id", null: false
|
||||
t.integer "owner_id", null: false
|
||||
t.integer "crop_id", null: false
|
||||
t.integer "owner_id", null: false
|
||||
t.date "harvested_at"
|
||||
t.decimal "quantity"
|
||||
t.string "unit"
|
||||
t.string "unit", limit: 255
|
||||
t.text "description"
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.string "slug"
|
||||
t.string "slug", limit: 255
|
||||
t.decimal "weight_quantity"
|
||||
t.string "weight_unit"
|
||||
t.string "weight_unit", limit: 255
|
||||
t.integer "plant_part_id"
|
||||
t.float "si_weight"
|
||||
t.integer "planting_id"
|
||||
@@ -291,38 +291,38 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
add_index "likes", ["member_id"], name: "index_likes_on_member_id", using: :btree
|
||||
|
||||
create_table "members", force: :cascade do |t|
|
||||
t.string "email", default: "", null: false
|
||||
t.string "encrypted_password", default: "", null: false
|
||||
t.string "reset_password_token"
|
||||
t.string "email", limit: 255, default: "", null: false
|
||||
t.string "encrypted_password", limit: 255, default: "", null: false
|
||||
t.string "reset_password_token", limit: 255
|
||||
t.datetime "reset_password_sent_at"
|
||||
t.datetime "remember_created_at"
|
||||
t.integer "sign_in_count", default: 0
|
||||
t.integer "sign_in_count", default: 0
|
||||
t.datetime "current_sign_in_at"
|
||||
t.datetime "last_sign_in_at"
|
||||
t.string "current_sign_in_ip"
|
||||
t.string "last_sign_in_ip"
|
||||
t.string "confirmation_token"
|
||||
t.string "current_sign_in_ip", limit: 255
|
||||
t.string "last_sign_in_ip", limit: 255
|
||||
t.string "confirmation_token", limit: 255
|
||||
t.datetime "confirmed_at"
|
||||
t.datetime "confirmation_sent_at"
|
||||
t.string "unconfirmed_email"
|
||||
t.integer "failed_attempts", default: 0
|
||||
t.string "unlock_token"
|
||||
t.string "unconfirmed_email", limit: 255
|
||||
t.integer "failed_attempts", default: 0
|
||||
t.string "unlock_token", limit: 255
|
||||
t.datetime "locked_at"
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.string "login_name"
|
||||
t.string "slug"
|
||||
t.string "login_name", limit: 255
|
||||
t.string "slug", limit: 255
|
||||
t.boolean "tos_agreement"
|
||||
t.boolean "show_email"
|
||||
t.string "location"
|
||||
t.string "location", limit: 255
|
||||
t.float "latitude"
|
||||
t.float "longitude"
|
||||
t.boolean "send_notification_email", default: true
|
||||
t.boolean "send_notification_email", default: true
|
||||
t.text "bio"
|
||||
t.integer "plantings_count"
|
||||
t.boolean "newsletter"
|
||||
t.boolean "send_planting_reminder", default: true
|
||||
t.string "preferred_avatar_uri"
|
||||
t.boolean "send_planting_reminder", default: true
|
||||
t.string "preferred_avatar_uri", limit: 255
|
||||
end
|
||||
|
||||
add_index "members", ["confirmation_token"], name: "index_members_on_confirmation_token", unique: true, using: :btree
|
||||
@@ -338,10 +338,10 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
|
||||
create_table "notifications", force: :cascade do |t|
|
||||
t.integer "sender_id"
|
||||
t.integer "recipient_id", null: false
|
||||
t.string "subject"
|
||||
t.integer "recipient_id", null: false
|
||||
t.string "subject", limit: 255
|
||||
t.text "body"
|
||||
t.boolean "read", default: false
|
||||
t.boolean "read", default: false
|
||||
t.integer "post_id"
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
@@ -361,9 +361,9 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
t.datetime "updated_at"
|
||||
t.datetime "completed_at"
|
||||
t.integer "member_id"
|
||||
t.string "paypal_express_token"
|
||||
t.string "paypal_express_payer_id"
|
||||
t.string "referral_code"
|
||||
t.string "paypal_express_token", limit: 255
|
||||
t.string "paypal_express_payer_id", limit: 255
|
||||
t.string "referral_code", limit: 255
|
||||
end
|
||||
|
||||
create_table "orders_products", id: false, force: :cascade do |t|
|
||||
@@ -372,16 +372,16 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
end
|
||||
|
||||
create_table "photos", force: :cascade do |t|
|
||||
t.integer "owner_id", null: false
|
||||
t.string "thumbnail_url", null: false
|
||||
t.string "fullsize_url", null: false
|
||||
t.integer "owner_id", null: false
|
||||
t.string "thumbnail_url", limit: 255, null: false
|
||||
t.string "fullsize_url", limit: 255, null: false
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.string "title", null: false
|
||||
t.string "license_name", null: false
|
||||
t.string "license_url"
|
||||
t.string "link_url", null: false
|
||||
t.string "flickr_photo_id"
|
||||
t.string "title", limit: 255, null: false
|
||||
t.string "license_name", limit: 255, null: false
|
||||
t.string "license_url", limit: 255
|
||||
t.string "link_url", limit: 255, null: false
|
||||
t.string "flickr_photo_id", limit: 255
|
||||
end
|
||||
|
||||
create_table "photos_plantings", id: false, force: :cascade do |t|
|
||||
@@ -397,25 +397,25 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
add_index "photos_seeds", ["seed_id", "photo_id"], name: "index_photos_seeds_on_seed_id_and_photo_id", using: :btree
|
||||
|
||||
create_table "plant_parts", force: :cascade do |t|
|
||||
t.string "name"
|
||||
t.string "name", limit: 255
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.string "slug"
|
||||
t.string "slug", limit: 255
|
||||
end
|
||||
|
||||
create_table "plantings", force: :cascade do |t|
|
||||
t.integer "garden_id", null: false
|
||||
t.integer "crop_id", null: false
|
||||
t.integer "garden_id", null: false
|
||||
t.integer "crop_id", null: false
|
||||
t.date "planted_at"
|
||||
t.integer "quantity"
|
||||
t.text "description"
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.string "slug"
|
||||
t.string "sunniness"
|
||||
t.string "planted_from"
|
||||
t.string "slug", limit: 255
|
||||
t.string "sunniness", limit: 255
|
||||
t.string "planted_from", limit: 255
|
||||
t.integer "owner_id"
|
||||
t.boolean "finished", default: false
|
||||
t.boolean "finished", default: false
|
||||
t.date "finished_at"
|
||||
t.integer "days_before_maturity"
|
||||
end
|
||||
@@ -423,12 +423,12 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
add_index "plantings", ["slug"], name: "index_plantings_on_slug", unique: true, using: :btree
|
||||
|
||||
create_table "posts", force: :cascade do |t|
|
||||
t.integer "author_id", null: false
|
||||
t.string "subject", null: false
|
||||
t.text "body", null: false
|
||||
t.integer "author_id", null: false
|
||||
t.string "subject", limit: 255, null: false
|
||||
t.text "body", null: false
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.string "slug"
|
||||
t.string "slug", limit: 255
|
||||
t.integer "forum_id"
|
||||
end
|
||||
|
||||
@@ -436,9 +436,9 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
add_index "posts", ["slug"], name: "index_posts_on_slug", unique: true, using: :btree
|
||||
|
||||
create_table "products", force: :cascade do |t|
|
||||
t.string "name", null: false
|
||||
t.text "description", null: false
|
||||
t.integer "min_price", null: false
|
||||
t.string "name", limit: 255, null: false
|
||||
t.text "description", null: false
|
||||
t.integer "min_price", null: false
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.integer "account_type_id"
|
||||
@@ -447,38 +447,38 @@ ActiveRecord::Schema.define(version: 20170104035248) do
|
||||
end
|
||||
|
||||
create_table "roles", force: :cascade do |t|
|
||||
t.string "name", null: false
|
||||
t.string "name", limit: 255, null: false
|
||||
t.text "description"
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.string "slug"
|
||||
t.string "slug", limit: 255
|
||||
end
|
||||
|
||||
add_index "roles", ["slug"], name: "index_roles_on_slug", unique: true, using: :btree
|
||||
|
||||
create_table "scientific_names", force: :cascade do |t|
|
||||
t.string "name", null: false
|
||||
t.integer "crop_id", null: false
|
||||
t.string "name", limit: 255, null: false
|
||||
t.integer "crop_id", null: false
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.integer "creator_id"
|
||||
end
|
||||
|
||||
create_table "seeds", force: :cascade do |t|
|
||||
t.integer "owner_id", null: false
|
||||
t.integer "crop_id", null: false
|
||||
t.integer "owner_id", null: false
|
||||
t.integer "crop_id", null: false
|
||||
t.text "description"
|
||||
t.integer "quantity"
|
||||
t.date "plant_before"
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.string "tradable_to", default: "nowhere"
|
||||
t.string "slug"
|
||||
t.string "tradable_to", limit: 255, default: "nowhere"
|
||||
t.string "slug", limit: 255
|
||||
t.integer "days_until_maturity_min"
|
||||
t.integer "days_until_maturity_max"
|
||||
t.text "organic", default: "unknown"
|
||||
t.text "gmo", default: "unknown"
|
||||
t.text "heirloom", default: "unknown"
|
||||
t.text "organic", default: "unknown"
|
||||
t.text "gmo", default: "unknown"
|
||||
t.text "heirloom", default: "unknown"
|
||||
end
|
||||
|
||||
add_index "seeds", ["slug"], name: "index_seeds_on_slug", unique: true, using: :btree
|
||||
|
||||
@@ -98,7 +98,7 @@ def load_test_users # rubocop:disable Metrics/AbcSize
|
||||
Planting.create(
|
||||
owner_id: @user.id,
|
||||
garden_id: @user.gardens.first.id,
|
||||
planted_at: Date.today,
|
||||
planted_at: Time.zone.today,
|
||||
crop_id: Crop.find(i % Crop.all.size + 1).id,
|
||||
sunniness: select_random_item(Planting::SUNNINESS_VALUES),
|
||||
planted_from: select_random_item(Planting::PLANTED_FROM_VALUES)
|
||||
@@ -172,7 +172,7 @@ def load_products
|
||||
name: "Seed account",
|
||||
description: "Paid account, in perpetuity",
|
||||
min_price: 15000,
|
||||
account_type_id: @seed_account.id,
|
||||
account_type_id: @seed_account.id
|
||||
)
|
||||
end
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ class Growstuff::OauthSignupAction
|
||||
.create_with(
|
||||
name: name,
|
||||
token: auth['credentials']['token'],
|
||||
secret: auth['credentials']['secret'],
|
||||
secret: auth['credentials']['secret']
|
||||
)
|
||||
.find_or_create_by(
|
||||
provider: auth['provider'],
|
||||
|
||||
@@ -51,7 +51,7 @@ namespace :growstuff do
|
||||
send_on_day = 3 # wednesday
|
||||
every_n_weeks = 2 # send fortnightly
|
||||
|
||||
if Date.today.cwday == send_on_day and Date.today.cweek % every_n_weeks == 0
|
||||
if Time.zone.today.cwday == send_on_day and Time.zone.today.cweek % every_n_weeks == 0
|
||||
Member.confirmed.find_each do |m|
|
||||
Notifier.planting_reminder(m).deliver_now!
|
||||
end
|
||||
@@ -135,7 +135,7 @@ namespace :growstuff do
|
||||
"a paid account, in perpetuity. This account "\
|
||||
"type never expires.",
|
||||
min_price: 15000,
|
||||
account_type_id: @seed_account.id,
|
||||
account_type_id: @seed_account.id
|
||||
)
|
||||
|
||||
puts "Giving each member an account record..."
|
||||
@@ -303,7 +303,7 @@ namespace :growstuff do
|
||||
alternate_names.split(/,\s*/).each do |an|
|
||||
AlternateName.where(
|
||||
name: an,
|
||||
crop_id: crop.id,
|
||||
crop_id: crop.id
|
||||
).first_or_create do |x|
|
||||
x.creator = cropbot
|
||||
end
|
||||
|
||||
@@ -2,8 +2,25 @@ require 'rake'
|
||||
begin
|
||||
require 'rspec/core/rake_task'
|
||||
task(:spec).clear
|
||||
RSpec::Core::RakeTask.new(spec: ['db:create', 'db:test:prepare']) do |t|
|
||||
RSpec::Core::RakeTask.new(spec: ['db:create',
|
||||
'db:test:prepare',
|
||||
'assets:precompile']) do |t|
|
||||
t.verbose = false
|
||||
end
|
||||
rescue LoadError
|
||||
end
|
||||
|
||||
desc "Run static code-quality checks"
|
||||
task :static do
|
||||
system('script/check_static')
|
||||
end
|
||||
|
||||
namespace :spec do
|
||||
desc "Run only unit tests"
|
||||
task unit: ['jasmine:ci'] do
|
||||
suites = %w(controllers helpers lib mailers models requests routing views)
|
||||
system('rspec', *suites.collect { |s| "spec/#{s}" })
|
||||
end
|
||||
end
|
||||
|
||||
task default: [:static, :spec, 'jasmine:ci']
|
||||
|
||||
18
script/check_conflicts
Executable file
18
script/check_conflicts
Executable file
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
require 'open3'
|
||||
|
||||
# We don't want to include the literal conflict marker here, or we'll match the
|
||||
# script itself!
|
||||
conflict_marker = '<' * 5
|
||||
|
||||
# Search for checked-in files containing conflict markers
|
||||
# -l List only matching files
|
||||
# -I Ignore binary files
|
||||
_, stdout, _, wait_thr = Open3.popen3("git", "grep", "-Il", conflict_marker)
|
||||
exit_code = wait_thr.value.exitstatus
|
||||
|
||||
if exit_code.zero?
|
||||
puts "The following files appear to contain merge conflicts:"
|
||||
puts stdout.gets(nil)
|
||||
end
|
||||
@@ -4,6 +4,6 @@ require 'set'
|
||||
|
||||
changed_file_list = `git diff --name-only --diff-filter=ACMRTUXB origin/dev...`
|
||||
files = Set.new changed_file_list.split
|
||||
if (files.include? "Gemfile") && !(files.include? "Gemfile.lock") then
|
||||
abort "Looks like you committed changes to Gemfile but not Gemfile.lock"
|
||||
if (files.include? "Gemfile") && !(files.include? "Gemfile.lock")
|
||||
abort "Looks like you committed changes to Gemfile but not Gemfile.lock\n\n"
|
||||
end
|
||||
13
script/check_static
Executable file
13
script/check_static
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
checks = [
|
||||
'script/check_gemfile',
|
||||
'script/check_contributors_md',
|
||||
'script/check_conflicts',
|
||||
'rubocop --display-cop-names --rails',
|
||||
"haml-lint app/views"
|
||||
]
|
||||
|
||||
return_values = checks.collect { |t| system(t) }
|
||||
failures = return_values.count(&:!)
|
||||
abort "#{failures} static check(s) failed" unless failures.zero?
|
||||
@@ -21,7 +21,7 @@ describe CommentsController do
|
||||
|
||||
def valid_attributes
|
||||
@post = FactoryGirl.create(:post)
|
||||
{ post_id: @post.id, author_id: @member.id, body: "some text" }
|
||||
{ post_id: @post.id, body: "some text" }
|
||||
end
|
||||
|
||||
describe "GET RSS feed" do
|
||||
@@ -34,51 +34,83 @@ describe CommentsController do
|
||||
end
|
||||
|
||||
describe "GET new" do
|
||||
it "picks up post from params" do
|
||||
post = FactoryGirl.create(:post)
|
||||
get :new, post_id: post.id
|
||||
assigns(:post).should eq(post)
|
||||
end
|
||||
let(:post) { FactoryGirl.create(:post) }
|
||||
|
||||
it "assigns the old comments as @comments" do
|
||||
post = FactoryGirl.create(:post)
|
||||
old_comment = FactoryGirl.create(:comment, post: post)
|
||||
get :new, post_id: post.id
|
||||
assigns(:comments).should eq [old_comment]
|
||||
describe "with valid params" do
|
||||
before { get :new, post_id: post.id }
|
||||
|
||||
it "picks up post from params" do
|
||||
assigns(:post).should eq(post)
|
||||
end
|
||||
|
||||
let(:old_comment) { FactoryGirl.create(:comment, post: post) }
|
||||
it "assigns the old comments as @comments" do
|
||||
assigns(:comments).should eq [old_comment]
|
||||
end
|
||||
end
|
||||
|
||||
it "dies if no post specified" do
|
||||
get :new
|
||||
response.should redirect_to(root_url)
|
||||
expect(response).not_to be_success
|
||||
end
|
||||
end
|
||||
|
||||
describe "GET edit" do
|
||||
it "assigns previous comments as @comments" do
|
||||
post = FactoryGirl.create(:post)
|
||||
old_comment = FactoryGirl.create(:comment, post: post)
|
||||
comment = FactoryGirl.create(:comment, post: post, author: @member)
|
||||
get :edit, id: comment.to_param
|
||||
assigns(:comments).should eq([comment, old_comment])
|
||||
let(:post) { FactoryGirl.create(:post) }
|
||||
before { get :edit, id: comment.to_param }
|
||||
|
||||
describe "my comment" do
|
||||
let!(:comment) { FactoryGirl.create :comment, author: @member, post: post }
|
||||
let!(:old_comment) { FactoryGirl.create(:comment, post: post, created_at: Time.zone.yesterday) }
|
||||
it "assigns previous comments as @comments" do
|
||||
assigns(:comments).should eq([comment, old_comment])
|
||||
end
|
||||
end
|
||||
|
||||
describe "not my comment" do
|
||||
let(:comment) { FactoryGirl.create :comment, post: post }
|
||||
it { expect(response).not_to be_success }
|
||||
end
|
||||
end
|
||||
|
||||
describe "PUT update" do
|
||||
describe "with valid params" do
|
||||
before { put :update, id: comment.to_param, comment: valid_attributes }
|
||||
|
||||
describe "my comment" do
|
||||
let(:comment) { FactoryGirl.create :comment, author: @member }
|
||||
it "redirects to the comment's post" do
|
||||
comment = Comment.create! valid_attributes
|
||||
put :update, id: comment.to_param, comment: valid_attributes
|
||||
response.should redirect_to(comment.post)
|
||||
expect(response).to redirect_to(comment.post)
|
||||
end
|
||||
end
|
||||
describe "not my comment" do
|
||||
let(:comment) { FactoryGirl.create :comment }
|
||||
it { expect(response).not_to be_success }
|
||||
end
|
||||
describe "attempting to change post_id" do
|
||||
let(:post) { FactoryGirl.create :post, subject: 'our post' }
|
||||
let(:other_post) { FactoryGirl.create :post, subject: 'the other post' }
|
||||
let(:valid_attributes) { { post_id: other_post.id, body: "kōrero" } }
|
||||
let(:comment) { FactoryGirl.create :comment, author: @member, post: post }
|
||||
it "does not change post_id" do
|
||||
comment.reload
|
||||
expect(comment.post_id).to eq(post.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "DELETE destroy" do
|
||||
it "redirects to the post the comment was on" do
|
||||
comment = Comment.create! valid_attributes
|
||||
post = comment.post
|
||||
delete :destroy, id: comment.to_param
|
||||
response.should redirect_to(post)
|
||||
before { delete :destroy, id: comment.to_param }
|
||||
|
||||
describe "my comment" do
|
||||
let(:comment) { FactoryGirl.create :comment, author: @member }
|
||||
it "redirects to the post the comment was on" do
|
||||
expect(response).to redirect_to(comment.post)
|
||||
end
|
||||
end
|
||||
|
||||
describe "not my comment" do
|
||||
let(:comment) { FactoryGirl.create :comment }
|
||||
it { expect(response).not_to be_success }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -87,9 +87,9 @@ describe HarvestsController do
|
||||
describe "POST create" do
|
||||
describe "with valid params" do
|
||||
it "creates a new Harvest" do
|
||||
expect {
|
||||
expect do
|
||||
post :create, harvest: valid_attributes
|
||||
}.to change(Harvest, :count).by(1)
|
||||
end.to change(Harvest, :count).by(1)
|
||||
end
|
||||
|
||||
it "assigns a newly created harvest as @harvest" do
|
||||
@@ -120,11 +120,11 @@ describe HarvestsController do
|
||||
|
||||
it "re-renders the 'new' template" do
|
||||
# Trigger the behavior that occurs when invalid params are submitted
|
||||
Harvest.any_instance.stub(:save).and_return(false)
|
||||
post :create, harvest: { "crop_id" => "invalid value" }
|
||||
response.should render_template("new")
|
||||
end
|
||||
end
|
||||
|
||||
describe "not my planting" do
|
||||
let(:not_my_planting) { FactoryGirl.create(:planting) }
|
||||
let(:harvest) { FactoryGirl.create(:harvest) }
|
||||
@@ -172,18 +172,17 @@ describe HarvestsController do
|
||||
|
||||
it "re-renders the 'edit' template" do
|
||||
harvest = Harvest.create! valid_attributes
|
||||
# Trigger the behavior that occurs when invalid params are submitted
|
||||
Harvest.any_instance.stub(:save).and_return(false)
|
||||
put :update, id: harvest.to_param, harvest: { "crop_id" => "invalid value" }
|
||||
response.should render_template("edit")
|
||||
end
|
||||
end
|
||||
|
||||
describe "not my planting" do
|
||||
let(:not_my_planting) { FactoryGirl.create(:planting) }
|
||||
let(:harvest) { FactoryGirl.create(:harvest) }
|
||||
it "does not save planting_id" do
|
||||
allow(Harvest).to receive(:new).and_return(harvest)
|
||||
put :update, id: harvest.to_param, harvest: valid_attributes.merge(planting_id: not_my_planting.id)
|
||||
put :update, id: harvest.to_param,
|
||||
harvest: valid_attributes.merge(planting_id: not_my_planting.id)
|
||||
expect(harvest.planting_id).to eq(nil)
|
||||
end
|
||||
end
|
||||
@@ -192,9 +191,9 @@ describe HarvestsController do
|
||||
describe "DELETE destroy" do
|
||||
it "destroys the requested harvest" do
|
||||
harvest = Harvest.create! valid_attributes
|
||||
expect {
|
||||
expect do
|
||||
delete :destroy, id: harvest.to_param
|
||||
}.to change(Harvest, :count).by(-1)
|
||||
end.to change(Harvest, :count).by(-1)
|
||||
end
|
||||
|
||||
it "redirects to the harvests list" do
|
||||
|
||||
42
spec/controllers/likes_controller_spec.rb
Normal file
42
spec/controllers/likes_controller_spec.rb
Normal file
@@ -0,0 +1,42 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe LikesController do
|
||||
let(:like) { FactoryGirl.create :like, member: member }
|
||||
let(:member) { FactoryGirl.create(:member) }
|
||||
let(:blogpost) { FactoryGirl.create(:post) }
|
||||
let(:mypost) { FactoryGirl.create(:post, author: member) }
|
||||
|
||||
before { sign_in member }
|
||||
|
||||
describe "POST create" do
|
||||
it { expect(response.content_type).to eq "application/json" }
|
||||
before { post :create, post_id: blogpost.id, format: :json }
|
||||
it { expect(Like.last.likeable_id).to eq(blogpost.id) }
|
||||
it { expect(Like.last.likeable_type).to eq('Post') }
|
||||
it { JSON.parse(response.body)["description"] == "1 like" }
|
||||
|
||||
describe "Liking someone else's post" do
|
||||
it { expect(response.code).to eq('201') }
|
||||
end
|
||||
|
||||
describe "Liking your own post" do
|
||||
let(:blogpost) { FactoryGirl.create(:post, author: member) }
|
||||
end
|
||||
end
|
||||
|
||||
describe "DELETE destroy" do
|
||||
before { delete :destroy, id: like.id, format: :json }
|
||||
it { expect(response.content_type).to eq "application/json" }
|
||||
|
||||
describe "un-liking something i liked before" do
|
||||
it { expect(response.code).to eq('200') }
|
||||
it { JSON.parse(response.body)["description"] == "0 likes" }
|
||||
end
|
||||
|
||||
describe "Deleting someone else's like" do
|
||||
let(:like) { FactoryGirl.create :like }
|
||||
it { expect(response.code).to eq('403') }
|
||||
it { JSON.parse(response.body)["error"] == "Unable to like" }
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -23,8 +23,7 @@ describe OrderItemsController do
|
||||
@order_item = FactoryGirl.create(:order_item,
|
||||
order: @order,
|
||||
product: @product,
|
||||
price: @product.min_price
|
||||
)
|
||||
price: @product.min_price)
|
||||
end
|
||||
|
||||
describe "POST create" do
|
||||
|
||||
@@ -3,7 +3,7 @@ FactoryGirl.define do
|
||||
garden
|
||||
owner
|
||||
crop
|
||||
planted_at Date.today
|
||||
planted_at Time.zone.today
|
||||
quantity 33
|
||||
description "This is a *really* good plant."
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ feature "crop wranglers", js: true do
|
||||
click_link wrangler.login_name
|
||||
click_link 'Crop Wrangling'
|
||||
within '#recently-added-crops' do
|
||||
expect(page).to have_content "#{crops.first.creator.login_name}"
|
||||
expect(page).to have_content crops.first.creator.login_name.to_s
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ feature "follows", :js do
|
||||
scenario "has a followed member listed in the following page" do
|
||||
click_link 'Follow'
|
||||
visit member_follows_path(member)
|
||||
expect(page).to have_content "#{other_member.login_name}"
|
||||
expect(page).to have_content other_member.login_name.to_s
|
||||
end
|
||||
|
||||
scenario "does not die when passed an authenticity_token" do
|
||||
@@ -62,22 +62,22 @@ feature "follows", :js do
|
||||
scenario "has member in following list" do
|
||||
click_link 'Follow'
|
||||
visit member_follows_path(member)
|
||||
expect(page).to have_content "#{other_member.login_name}"
|
||||
expect(page).to have_content other_member.login_name.to_s
|
||||
end
|
||||
|
||||
scenario "appears in in followed member's followers list" do
|
||||
click_link 'Follow'
|
||||
visit member_followers_path(other_member)
|
||||
expect(page).to have_content "#{member.login_name}"
|
||||
expect(page).to have_content member.login_name.to_s
|
||||
end
|
||||
|
||||
scenario "removes members from following and followers lists after unfollow" do
|
||||
click_link 'Follow'
|
||||
click_link 'Unfollow'
|
||||
visit member_follows_path(member)
|
||||
expect(page).not_to have_content "#{other_member.login_name}"
|
||||
expect(page).not_to have_content other_member.login_name.to_s
|
||||
visit member_followers_path(other_member)
|
||||
expect(page).to have_content "#{member.login_name}"
|
||||
expect(page).to have_content member.login_name.to_s
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
require 'rails_helper'
|
||||
require 'custom_matchers'
|
||||
|
||||
feature "Harvesting a crop", :js do
|
||||
feature "Harvesting a crop", :js, :elasticsearch do
|
||||
let(:member) { create :member }
|
||||
let!(:maize) { create :maize }
|
||||
let!(:plant_part) { create :plant_part }
|
||||
let(:planting) { create :planting, crop: maize, owner: member }
|
||||
|
||||
background do
|
||||
login_as member
|
||||
@@ -74,20 +75,63 @@ feature "Harvesting a crop", :js do
|
||||
expect(page).to have_content "maize"
|
||||
end
|
||||
|
||||
scenario "Harvesting from planting page" do
|
||||
planting = create :planting, crop: maize, owner: member, garden: member.gardens.first
|
||||
visit planting_path(planting)
|
||||
click_link "Harvest"
|
||||
|
||||
select plant_part.name, from: 'harvest[plant_part_id]'
|
||||
click_button "Save"
|
||||
|
||||
expect(page).to have_content "Harvest was successfully created"
|
||||
expect(page).to have_content planting.garden.name
|
||||
expect(page).to have_content "maize"
|
||||
end
|
||||
|
||||
context "Editing a harvest" do
|
||||
let(:existing_harvest) { create :harvest, crop: maize, owner: member }
|
||||
let!(:other_plant_part) { create :plant_part, name: 'chocolate' }
|
||||
|
||||
background do
|
||||
visit harvest_path(existing_harvest)
|
||||
click_link "Edit"
|
||||
end
|
||||
|
||||
scenario "Saving wihout edits" do
|
||||
scenario "Saving without edits" do
|
||||
# Check that the autosuggest helper properly fills inputs with
|
||||
# existing resource's data
|
||||
click_button "Save"
|
||||
expect(page).to have_content "Harvest was successfully updated"
|
||||
expect(page).to have_content "maize"
|
||||
end
|
||||
|
||||
scenario "change plant part" do
|
||||
select other_plant_part.name, from: 'harvest[plant_part_id]'
|
||||
click_button "Save"
|
||||
expect(page).to have_content "Harvest was successfully updated"
|
||||
expect(page).to have_content other_plant_part.name
|
||||
end
|
||||
end
|
||||
|
||||
context "Viewing a harvest" do
|
||||
let(:existing_harvest) do
|
||||
create :harvest, crop: maize, owner: member,
|
||||
harvested_at: Time.zone.today
|
||||
end
|
||||
let!(:existing_planting) do
|
||||
create :planting, crop: maize, owner: member,
|
||||
planted_at: Time.zone.yesterday
|
||||
end
|
||||
|
||||
background do
|
||||
visit harvest_path(existing_harvest)
|
||||
end
|
||||
|
||||
scenario "linking to a planting" do
|
||||
expect(page).to have_content planting.to_s
|
||||
choose("harvest_planting_id_#{existing_planting.id}")
|
||||
click_button "save"
|
||||
expect(page).to have_link(href: planting_path(existing_planting))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
require "rails_helper"
|
||||
require 'custom_matchers'
|
||||
|
||||
feature "Planting a crop", :js do
|
||||
feature "Planting a crop", :js, :elasticsearch do
|
||||
let(:member) { create :member }
|
||||
let!(:maize) { create :maize }
|
||||
let(:garden) { create :garden, owner: member }
|
||||
@@ -58,7 +58,7 @@ feature "Planting a crop", :js do
|
||||
visit new_planting_path
|
||||
|
||||
@a_past_date = 15.days.ago.strftime("%Y-%m-%d")
|
||||
@right_now = Date.today.strftime("%Y-%m-%d")
|
||||
@right_now = Time.zone.today.strftime("%Y-%m-%d")
|
||||
@a_future_date = 1.year.from_now.strftime("%Y-%m-%d")
|
||||
end
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
require 'rails_helper'
|
||||
require 'custom_matchers'
|
||||
|
||||
feature "Seeds", :js do
|
||||
feature "Seeds", :js, :elasticsearch do
|
||||
let(:member) { create :member }
|
||||
let!(:maize) { create :maize }
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
shared_examples "append date" do
|
||||
let(:this_month) { Date.today.strftime("%B") }
|
||||
let(:this_year) { Date.today.strftime("%Y") }
|
||||
let(:this_month) { Time.zone.today.strftime("%B") }
|
||||
let(:this_year) { Time.zone.today.strftime("%Y") }
|
||||
|
||||
background { visit path }
|
||||
|
||||
scenario "Selecting a date with datepicker" do
|
||||
click_link link_text
|
||||
within "div.datepicker" do
|
||||
expect(page).to have_content "#{this_month}"
|
||||
expect(page).to have_content this_month.to_s
|
||||
find(".datepicker-days td.day", text: "21").click
|
||||
end
|
||||
expect(page).to have_content "Finished: #{this_month} 21, #{this_year}"
|
||||
|
||||
@@ -125,7 +125,7 @@ describe ApplicationHelper do
|
||||
expect(build_alert_classes(:info)).to include 'alert-info'
|
||||
end
|
||||
it 'works when blank' do
|
||||
expect(build_alert_classes()).to include 'alert-info'
|
||||
expect(build_alert_classes).to include 'alert-info'
|
||||
end
|
||||
it 'includes base classes' do
|
||||
expect(build_alert_classes(:info)).to include 'alert alert-dismissable'
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user