Merge branch 'dev' of gitmaco:Growstuff/growstuff into scopify

This commit is contained in:
Mackenzie Morgan committed 2016-11-29 09:58:02 -05:00
commit c93fd78aa8
349 files changed
+3528 -4301

No files matched your search

+4
View File
@@ -21,6 +21,10 @@ engines:
- javascript
fixme:
enabled: true
exclude_fingerprints: # rubocop_todo filename
- 63b8552079d106832fbe281566b6d028
- d38afbaaea3ecaa9a4cf046b07a01cec
- 57ff3968fd371d3e1f75c237d6c78acf
ratings:
paths:
- "**.rb"
+52 -1140
View File
File diff suppressed because it is too large. Load diff
+1095
View File
File diff suppressed because it is too large. Load diff
+23 -7
View File
@@ -1,6 +1,9 @@
sudo: false
language: ruby
cache: bundler
cache:
bundler: true
directories:
- travis_phantomjs
env:
matrix:
- GROWSTUFF_SITE_NAME="Growstuff (travis)" RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' GROWSTUFF_ELASTICSEARCH='true'
@@ -8,14 +11,26 @@ env:
global:
secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
rvm:
- 2.3.1
- 2.3.1
before_install:
- export PATH=$PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64/bin:$PATH
- >
if [ $(phantomjs --version) != '2.1.1' ]; then
PHANTOM_URL=https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2;
rm -rf $PWD/travis_phantomjs;
mkdir -p $PWD/travis_phantomjs;
wget $PHANTOM_URL -O $PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2;
tar -xvf $PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2 -C $PWD/travis_phantomjs;
fi
- phantomjs --version
before_script:
- psql -c 'create database growstuff_test;' -U postgres
- bundle exec rake db:create db:migrate db:test:prepare
script:
- script/gemfile_check
- bundle exec script/check_contributors_md
- bundle exec rake db:migrate --trace
- bundle exec rspec spec/
- bundle exec rubocop --display-cop-names --rails
- script/gemfile_check
- bundle exec script/check_contributors_md
- bundle exec rake db:migrate --trace
- bundle exec rspec spec/
services:
- elasticsearch
before_deploy:
@@ -28,6 +43,7 @@ deploy:
repo: Growstuff/growstuff
app:
dev: growstuff-staging
master: growstuff-prod
travis_deploy: tranquil-basin-3130
travis_containers: tranquil-basin-3130
run:
+7
View File
@@ -0,0 +1,7 @@
extends: relaxed
rules:
# 80 chars should be enough, but don't fail if a line is longer
line-length:
max: 150
level: warning
+1 -1
View File
@@ -71,4 +71,4 @@ submit the change with your pull request.
- Lucas Nogueira / [lucasnogueira](https://github.com/lucasnogueira)
- Charley Lewittes / [ctlewitt](https://github.com/ctlewitt)
- Kristine Nicole Polvoriza / [polveenomials](https://github.com/polveenomials)
- Brenda Wallace / [br3nda](http://github.com/br3nda)
- Brenda Wallace / [br3nda](https://github.com/br3nda)
+11 -6
View File
@@ -1,3 +1,4 @@
# frozen_string_literal: true
source 'https://rubygems.org'
ruby '2.3.1'
@@ -14,11 +15,11 @@ gem 'haml'
gem 'bootstrap-sass', '~> 3.3.6'
gem 'font-awesome-sass'
gem 'uglifier', '~> 2.7.2' # JavaScript compressor
gem 'uglifier', '~> 2.7.2' # JavaScript compressor
gem 'jquery-rails'
gem 'jquery-ui-rails', '~> 5.0.2'
gem 'js-routes' # provides access to Rails routes in Javascript
gem 'js-routes' # provides access to Rails routes in Javascript
gem 'flickraw'
gem 'leaflet-rails'
@@ -68,7 +69,7 @@ gem 'omniauth-flickr', '>= 0.0.15'
gem 'omniauth-facebook'
# client for Elasticsearch. Elasticsearch is a flexible
# and powerful, distributed, real-time search and analytics engine.
# and powerful, distributed, real-time search and analytics engine.
# An example of the use in the project is fuzzy crop search.
gem "elasticsearch-model"
gem "elasticsearch-rails"
@@ -80,7 +81,7 @@ group :production, :staging do
gem 'dalli'
gem 'memcachier'
gem 'rails_12factor' # supresses heroku plugin injection
gem 'bonsai-elasticsearch-rails' # Integration with Bonsa-Elasticsearch on heroku
gem 'bonsai-elasticsearch-rails' # Integration with Bonsa-Elasticsearch on heroku
gem 'sparkpost_rails'
end
@@ -109,11 +110,15 @@ group :development, :test do
gem 'capybara' # integration tests
gem 'capybara-email' # integration tests for email
gem 'capybara-screenshot' # for test debugging
gem 'poltergeist', '~> 1.6' # for headless JS testing
gem 'poltergeist' # for headless JS testing
gem 'i18n-tasks' # adds tests for finding missing and unused translations
gem 'selenium-webdriver'
gem "codeclimate-test-reporter", group: :test, require: nil
gem "active_merchant-paypal-bogus-gateway"
gem 'rubocop', require: false
end
group :test do
gem 'codeclimate-test-reporter', require: false
end
group :travis do
+45 -33
View File
@@ -24,13 +24,13 @@ GEM
actionpack
active_merchant-paypal-bogus-gateway (0.1.0)
activemerchant
active_utils (3.2.2)
active_utils (3.2.3)
activesupport (>= 3.2, < 5.1.0)
i18n
activejob (4.2.7.1)
activesupport (= 4.2.7.1)
globalid (>= 0.3.0)
activemerchant (1.60.0)
activemerchant (1.61.0)
activesupport (>= 3.2.14, < 5.1)
builder (>= 2.1.2, < 4.0.0)
i18n (>= 0.6.9)
@@ -48,7 +48,8 @@ GEM
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.4.0)
addressable (2.5.0)
public_suffix (~> 2.0, >= 2.0.2)
arel (6.0.3)
ast (2.3.0)
autoprefixer-rails (6.4.0.2)
@@ -70,11 +71,11 @@ GEM
bootstrap-sass (3.3.7)
autoprefixer-rails (>= 5.2.1)
sass (>= 3.3.4)
bootstrap_form (2.5.0)
bootstrap_form (2.5.2)
builder (3.2.2)
byebug (9.0.5)
byebug (9.0.6)
cancancan (1.15.0)
capybara (2.8.0)
capybara (2.10.1)
addressable
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
@@ -84,7 +85,7 @@ GEM
capybara-email (2.5.0)
capybara (~> 2.4)
mail
capybara-screenshot (1.0.13)
capybara-screenshot (1.0.14)
capybara (>= 1.0, < 3)
launchy
childprocess (0.5.9)
@@ -123,10 +124,10 @@ GEM
sass-rails (>= 4.0.3)
concurrent-ruby (1.0.2)
connection_pool (2.2.0)
coveralls (0.8.15)
coveralls (0.8.16)
json (>= 1.8, < 3)
simplecov (~> 0.12.0)
term-ansicolor (~> 1.3)
term-ansicolor (~> 1.3.0)
thor (~> 0.19.1)
tins (>= 1.6.0, < 2)
csv_shaper (1.3.0)
@@ -160,7 +161,7 @@ GEM
faraday
multi_json
erubis (2.7.0)
excon (0.51.0)
excon (0.54.0)
execjs (2.7.0)
factory_girl (4.7.0)
activesupport (>= 3.0.0)
@@ -222,7 +223,7 @@ GEM
httparty (0.14.0)
multi_xml (>= 0.5.2)
i18n (0.7.0)
i18n-tasks (0.9.5)
i18n-tasks (0.9.6)
activesupport (>= 4.0.2)
ast (>= 2.1.0)
easy_translate (>= 0.5.0)
@@ -242,12 +243,12 @@ GEM
railties (>= 3.2)
sprockets-rails
json (1.8.3)
jwt (1.5.4)
jwt (1.5.6)
kaminari (0.17.0)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
kgio (2.10.0)
kramdown (1.12.0)
kramdown (1.13.1)
launchy (2.4.3)
addressable (~> 2.3)
leaflet-markercluster-rails (0.7.0)
@@ -271,15 +272,14 @@ GEM
mime-types-data (3.2016.0521)
mimemagic (0.3.2)
mini_portile2 (2.1.0)
minitest (5.9.0)
minitest (5.9.1)
multi_json (1.11.3)
multi_xml (0.5.5)
multipart-post (2.0.0)
nenv (0.3.0)
newrelic_rpm (3.16.1.320)
nokogiri (1.6.8)
newrelic_rpm (3.17.1.326)
nokogiri (1.6.8.1)
mini_portile2 (~> 2.1.0)
pkg-config (~> 1.1.7)
notiffany (0.1.1)
nenv (~> 0.1)
shellany (~> 0.0)
@@ -314,23 +314,24 @@ GEM
cocaine (~> 0.5.5)
mime-types
mimemagic (~> 0.3.0)
parser (2.3.1.2)
parser (2.3.2.0)
ast (~> 2.2)
pg (0.18.4)
pkg-config (1.1.7)
pg (0.19.0)
plupload-rails (1.2.1)
rails (>= 3.1)
poltergeist (1.10.0)
poltergeist (1.11.0)
capybara (~> 2.1)
cliver (~> 0.3.1)
websocket-driver (>= 0.2.0)
powerpack (0.1.1)
pry (0.10.4)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
public_suffix (2.0.4)
quiet_assets (1.1.0)
railties (>= 3.1, < 5.0)
rack (1.6.4)
rack (1.6.5)
rack-protection (1.5.3)
rack
rack-test (0.6.3)
@@ -367,12 +368,13 @@ GEM
activesupport (= 4.2.7.1)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rainbow (2.1.0)
raindrops (0.17.0)
rake (11.2.2)
rb-fsevent (0.9.7)
rake (11.3.0)
rb-fsevent (0.9.8)
rb-inotify (0.9.7)
ffi (>= 0.5.0)
redis (3.3.1)
redis (3.3.2)
responders (2.3.0)
railties (>= 4.2.0, < 5.1)
rspec (3.5.0)
@@ -383,7 +385,7 @@ GEM
activemodel (>= 3.0)
activesupport (>= 3.0)
rspec-mocks (>= 2.99, < 4.0)
rspec-core (3.5.2)
rspec-core (3.5.4)
rspec-support (~> 3.5.0)
rspec-expectations (3.5.0)
diff-lcs (>= 1.2.0, < 2.0)
@@ -391,7 +393,7 @@ GEM
rspec-mocks (3.5.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
rspec-rails (3.5.1)
rspec-rails (3.5.2)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
@@ -400,9 +402,16 @@ GEM
rspec-mocks (~> 3.5.0)
rspec-support (~> 3.5.0)
rspec-support (3.5.0)
rubocop (0.45.0)
parser (>= 2.3.1.1, < 3.0)
powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.7)
unicode-display_width (~> 1.0, >= 1.0.1)
ruby-progressbar (1.8.1)
ruby-units (2.0.1)
ruby_dep (1.4.0)
ruby_parser (3.8.2)
ruby_parser (3.8.3)
sexp_processor (~> 4.1)
rubyzip (1.2.0)
sass (3.4.22)
@@ -444,17 +453,19 @@ GEM
sprockets (>= 3.0.0)
term-ansicolor (1.3.2)
tins (~> 1.0)
terminal-table (1.6.0)
thor (0.19.1)
terminal-table (1.7.3)
unicode-display_width (~> 1.1.1)
thor (0.19.3)
thread (0.2.2)
thread_safe (0.3.5)
tilt (2.0.5)
tins (1.12.0)
tins (1.13.0)
tzinfo (1.2.2)
thread_safe (~> 0.1)
uglifier (2.7.2)
execjs (>= 0.3.0)
json (>= 1.8.0)
unicode-display_width (1.1.1)
unicorn (5.1.0)
kgio (~> 2.6)
raindrops (~> 0.7)
@@ -530,7 +541,7 @@ DEPENDENCIES
omniauth-flickr (>= 0.0.15)
omniauth-twitter
pg
poltergeist (~> 1.6)
poltergeist
pry
quiet_assets
rails (~> 4.2.1)
@@ -538,6 +549,7 @@ DEPENDENCIES
rake (>= 10.0.0)
rspec-activemodel-mocks
rspec-rails
rubocop
ruby-units
sass-rails (~> 5.0.4)
selenium-webdriver
@@ -552,4 +564,4 @@ RUBY VERSION
ruby 2.3.1p112
BUNDLED WITH
1.12.5
1.13.6
Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

+1 -1
View File
@@ -5,7 +5,7 @@
jQuery ->
el = $('.append-date')
el.datepicker({'format': 'yyyy-mm-dd'})
el.click (e) ->
-1
View File
@@ -42,4 +42,3 @@ $ ->
element = document.getElementById(tmp)
console.log("%s",tmp)
element.remove()
+64 -64
View File
@@ -2,7 +2,7 @@
@import "bootstrap"
@import "custom_bootstrap/variables"
// this padding needs to be done before the responsive stuff is imported
body
body
// modifying this for our promotional banner. can be replaced after if
// needed.
// padding-top: $navbar-height + 15px
@@ -19,14 +19,14 @@ body
//@import "bootstrap/glyphicons"
.list-inline > li.first
.list-inline > li.first
padding-left: 0px
h2
h2
font-size: 150%
//#subtitle
//#subtitle
// color: lighten($brown, 30%)
// font-style: italic
// font-weight: normal
@@ -34,10 +34,10 @@ h2
// padding-left: 1em
// padding-top: 0px
h3
h3
font-size: 120%
.main
.main
padding-right: 1em
.navbar .navbar-form
@@ -59,24 +59,24 @@ h3
padding-left: 1em
// this is used for eg. crops and members index pages
.six-across:nth-child(6n+1)
.six-across:nth-child(6n+1)
margin-left: 0px
.three-across:nth-child(3n+1)
.three-across:nth-child(3n+1)
margin-left: 0px
clear: both
// let's condense the hero unit a little
.jumbotron
.jumbotron
padding-top: 30px
padding-bottom: 30px
// info under the main heading on homepage
.jumbotron .info
.jumbotron .info
padding-top: 15px
// signup widget on homepage
.jumbotron .signup
.jumbotron .signup
background-color: lighten($green, 40%)
border: 1px solid lighten($green, 20%)
border-radius: 6px
@@ -85,19 +85,19 @@ h3
text-align: center
// stats shown on homepage. eg. "999 members..."
p.stats
p.stats
font-weight: bold
.member-cards
.member-cards
display: flex
flex: none
flex-wrap: wrap
justify-content: space-between
.member-thumbnail
.member-thumbnail
padding: .25em
div
div
width: 5em
display: inline-block
vertical-align: top
@@ -116,7 +116,7 @@ p.stats
margin-left: auto
@media (min-width: $screen-md-min)
.planting-thumbnail
.planting-thumbnail
dl.planting-attributes
font-size: 85%
width: 100%
@@ -132,10 +132,10 @@ p.stats
width: 250px
#placesmap, #cropmap
#placesmap, #cropmap
height: 500px
#membermap
#membermap
height: 250px
.location-not-set
@@ -145,23 +145,23 @@ p.stats
background-repeat: no-repeat
background-position: center
.member-location
.member-location
font-size: small
font-style: italic
.member-location a
.member-location a
color: $brown
.photo-thumbnail
.photo-thumbnail
padding: 0
position: relative
img
width: 100%
.text
.text
display: none
color: #000
position: absolute
@@ -169,100 +169,100 @@ p.stats
background: rgba(0, 0, 0, 0.8)
width: 100%
margin: 0
p
p
padding: 5px
margin: 0
color: #fff
&:hover
.text
&:hover
.text
display: block
.thumbnail
.thumbnail
border: none
text-align: center
margin-bottom: 1.5em
.member-thumbnail
.member-thumbnail
text-align: left
img
img
height: 85px
width: 85px
max-width: 85px
.crop-thumbnail
.crop-thumbnail
height: 220px
.cropinfo
.cropinfo
display: inline-block
max-width: 100%
white-space: nowrap
line-height: 1em
padding-bottom: 2px
.cropname
.cropname
overflow: hidden
text-overflow: ellipsis
.scientificname
.scientificname
font-size: small
font-style: italic
overflow: hidden
text-overflow: ellipsis
.plantingcount
.plantingcount
font-size: small
.crop-name a
.crop-name a
padding-top: 2px
.scientific-name small
.scientific-name small
margin-bottom: -2px
li.crop-hierarchy
li.crop-hierarchy
list-style-type: disc
.navbar-brand
.navbar-brand
margin: 0px
padding: 0px
.navbar-bottom
.navbar-bottom
margin: 40px 0px 0px 0px !important
// footer
footer
#footer1, #footer2, #footer3
footer
#footer1, #footer2, #footer3
text-align: left
padding-top: 1em
padding-bottom: 2em
ul
ul
list-style-type: none
list-style-position: outside
padding-left: 0px
margin-left: 0px
a
a
color: $navbar-default-link-color
text-decoration: none
a:hover
a:hover
color: $navbar-default-link-hover-color
a:active
a:active
color: $navbar-default-link-active-color
.navbar-bottom.navbar
.navbar-bottom.navbar
border-radius: 0
// ensure footer is pushed to bottom of browser window
#maincontainer
#maincontainer
min-height: 80%
html, body
html, body
height: 100%
.crop-image, .member-image
.crop-image, .member-image
width: 100%
height: 100%
@@ -272,22 +272,22 @@ html, body
background: white
z-index: $zindex-tooltip
.alert
a
.alert
a
font-weight: 800
// Overrides applying only to mobile view. This must be at the end of the overrides file.
@media only screen and (max-width: 767px)
.sidebar
@media only screen and (max-width: 767px)
.sidebar
margin-left: 0
border-left: none
padding-left: 0
#map
#map
height: 300px
.navbar .nav > li
.navbar .nav > li
display: block
.navbar .navbar-form
@@ -305,7 +305,7 @@ $state-info-bg: lighten($green, 50%)
$state-success-text: darken($green, 10%)
$state-success-bg: lighten($green, 50%)
.hide
.hide
display: none
#add-sci_name-row, #remove-sci_name-row, #add-alt_name-row, #remove-alt_name-row
@@ -322,14 +322,14 @@ $state-success-bg: lighten($green, 50%)
#gardens_panel_body
height: 20em
.form-group.required .control-label:before
.form-group.required .control-label:before
content: "* "
color: red
.margin-bottom
.margin-bottom
margin-bottom: 1em
.red
.red
color: red
.truncate
+2 -2
View File
@@ -1,7 +1,7 @@
class AccountTypesController < ApplicationController
before_filter :authenticate_member!
load_and_authorize_resource
# GET /account_types
def index
@account_types = AccountType.all
@@ -70,7 +70,7 @@ class AccountTypesController < ApplicationController
end
end
private
private
def account_type_params
params.require(:account_type).permit(:is_paid, :is_permanent_paid, :name)
+1 -2
View File
@@ -1,7 +1,7 @@
class AccountsController < ApplicationController
before_filter :authenticate_member!
load_and_authorize_resource
# GET /accounts
def index
@accounts = Account.all
@@ -43,5 +43,4 @@ class AccountsController < ApplicationController
def account_params
params.require(:account).permit(:account_type_id, :member_id, :paid_until)
end
end
+1 -2
View File
@@ -8,7 +8,7 @@ class Admin::OrdersController < ApplicationController
def search
authorize! :manage, :all
@orders = Order.search({by: params[:search_by], for: params[:search_text]})
@orders = Order.search({ by: params[:search_by], for: params[:search_text] })
if @orders.empty?
flash[:alert] = "Couldn't find order with #{params[:search_by]} = #{params[:search_text]}"
@@ -17,6 +17,5 @@ class Admin::OrdersController < ApplicationController
respond_to do |format|
format.html # index.html.haml
end
end
end
+2 -3
View File
@@ -14,7 +14,7 @@ class ApplicationController < ActionController::Base
request.path != "/members/confirmation" &&
request.path != "/members/sign_out" &&
!request.xhr?)
store_location_for(:member, request.fullpath)
store_location_for(:member, request.fullpath)
end
end
@@ -73,10 +73,9 @@ class ApplicationController < ActionController::Base
:bio, :location, :latitude, :longitude,
# email settings
:show_email, :newsletter, :send_notification_email, :send_planting_reminder,
#update password
# update password
:current_password
)
end
end
end
@@ -10,15 +10,15 @@ class AuthenticationsController < ApplicationController
name = Growstuff::OauthSignupAction.new.determine_name(auth)
@authentication = current_member.authentications
.create_with(
name: name,
token: auth['credentials']['token'],
secret: auth['credentials']['secret']
)
.find_or_create_by(
provider: auth['provider'],
uid: auth['uid'],
name: name)
.create_with(
name: name,
token: auth['credentials']['token'],
secret: auth['credentials']['secret']
)
.find_or_create_by(
provider: auth['provider'],
uid: auth['uid'],
name: name)
flash[:notice] = "Authentication successful."
else
+1 -1
View File
@@ -89,7 +89,7 @@ class CommentsController < ApplicationController
end
end
private
private
def comment_params
params.require(:comment).permit(:author_id, :body, :post_id)
+29 -22
View File
@@ -11,11 +11,11 @@ class CropsController < ApplicationController
@sort = params[:sort]
if @sort == 'alpha'
# alphabetical order
@crops = Crop.includes(:scientific_names, {plantings: :photos})
@crops = Crop.includes(:scientific_names, { plantings: :photos })
@paginated_crops = @crops.approved.paginate(page: params[:page])
else
# default to sorting by popularity
@crops = Crop.popular.includes(:scientific_names, {plantings: :photos})
@crops = Crop.popular.includes(:scientific_names, { plantings: :photos })
@paginated_crops = @crops.approved.paginate(page: params[:page])
end
@@ -37,14 +37,14 @@ class CropsController < ApplicationController
# GET /crops/wrangle
def wrangle
@approval_status = params[:approval_status]
case @approval_status
when "pending"
@crops = Crop.pending_approval
when "rejected"
@crops = Crop.rejected
else
@crops = Crop.recent
end
@crops = case @approval_status
when "pending"
Crop.pending_approval
when "rejected"
Crop.rejected
else
Crop.recent
end
@crops = @crops.paginate(page: params[:page])
@@ -77,7 +77,7 @@ class CropsController < ApplicationController
# GET /crops/1
# GET /crops/1.json
def show
@crop = Crop.includes(:scientific_names, {plantings: :photos}).find(params[:id])
@crop = Crop.includes(:scientific_names, { plantings: :photos }).find(params[:id])
@posts = @crop.posts.paginate(page: params[:page])
respond_to do |format|
@@ -86,14 +86,14 @@ class CropsController < ApplicationController
# TODO RABL or similar one day to avoid presentation logic here
owner_structure = {
owner: {
only: [:id, :login_name, :location, :latitude, :longitude]
only: [:id, :login_name, :location, :latitude, :longitude]
}
}
render json: @crop.to_json(include: {
plantings: {
include: owner_structure
}
})
plantings: {
include: owner_structure
}
})
end
end
end
@@ -116,13 +116,11 @@ class CropsController < ApplicationController
@crop = Crop.find(params[:id])
@crop.alternate_names.build if @crop.alternate_names.blank?
@crop.scientific_names.build if @crop.scientific_names.blank?
end
# POST /crops
# POST /crops.json
def create
@crop = Crop.new(crop_params)
if current_member.has_role? :crop_wrangler
@@ -137,10 +135,10 @@ class CropsController < ApplicationController
respond_to do |format|
if @crop.save
params[:alt_name].each do |index, value|
@crop.alternate_names.create(name: value, creator_id: current_member.id)
@crop.alternate_names.create(name: value, creator_id: current_member.id)
end
params[:sci_name].each do |index, value|
@crop.scientific_names.create(scientific_name: value, creator_id: current_member.id)
@crop.scientific_names.create(scientific_name: value, creator_id: current_member.id)
end
unless current_member.has_role? :crop_wrangler
Role.crop_wranglers.each do |w|
@@ -184,7 +182,7 @@ class CropsController < ApplicationController
sci_name = @crop.scientific_names.create(scientific_name: value, creator_id: current_member.id)
end
end
if previous_status == "pending"
requester = @crop.requester
new_status = @crop.approval_status
@@ -215,6 +213,15 @@ class CropsController < ApplicationController
private
def crop_params
params.require(:crop).permit(:en_wikipedia_url, :name, :parent_id, :creator_id, :approval_status, :request_notes, :reason_for_rejection, :rejection_notes, scientific_names_attributes: [:scientific_name, :_destroy, :id])
params.require(:crop).permit(:en_wikipedia_url,
:name,
:parent_id,
:creator_id,
:approval_status,
:request_notes,
:reason_for_rejection,
:rejection_notes, scientific_names_attributes: [:scientific_name,
:_destroy,
:id])
end
end
+2 -3
View File
@@ -5,11 +5,10 @@ class FollowsController < ApplicationController
# POST /follows
def create
@follow = current_member.follows.build(followed_id: follow_params[:followed_id])
if @follow.save
flash[:notice] = "Followed #{ @follow.followed.login_name }"
flash[:notice] = "Followed #{@follow.followed.login_name}"
redirect_to :back
else
flash[:error] = "Already following or error while following."
@@ -23,7 +22,7 @@ class FollowsController < ApplicationController
unfollowed_name = @follow.followed.login_name
@follow.destroy
flash[:notice] = "Unfollowed #{ unfollowed_name }"
flash[:notice] = "Unfollowed #{unfollowed_name}"
redirect_to root_path
end
+4 -3
View File
@@ -2,7 +2,6 @@ class GardensController < ApplicationController
before_filter :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
# GET /gardens
# GET /gardens.json
def index
@@ -87,7 +86,9 @@ class GardensController < ApplicationController
expire_fragment("homepage_stats")
respond_to do |format|
format.html { redirect_to gardens_by_owner_path(owner: @garden.owner), notice: 'Garden was successfully deleted.' }
format.html do
redirect_to gardens_by_owner_path(owner: @garden.owner), notice: 'Garden was successfully deleted.'
end
format.json { head :no_content }
end
end
@@ -96,6 +97,6 @@ class GardensController < ApplicationController
def garden_params
params.require(:garden).permit(:name, :slug, :owner_id, :description, :active,
:location, :latitude, :longitude, :area, :area_unit)
:location, :latitude, :longitude, :area, :area_unit)
end
end
+9 -10
View File
@@ -1,20 +1,19 @@
class HarvestsController < ApplicationController
before_filter :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
# GET /harvests
# GET /harvests.json
def index
@owner = Member.find_by_slug(params[:owner])
@crop = Crop.find_by_slug(params[:crop])
if @owner
@harvests = @owner.harvests.includes(:owner, :crop)
elsif @crop
@harvests = @crop.harvests.includes(:owner, :crop)
else
@harvests = Harvest.includes(:owner, :crop)
end
@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]) }
@@ -33,7 +32,7 @@ class HarvestsController < ApplicationController
@harvest = Harvest.new('harvested_at' => Date.today)
# using find_by_id here because it returns nil, unlike find
@crop = Crop.find_by_id(params[:crop_id]) || Crop.new
@crop = Crop.find_by_id(params[:crop_id]) || Crop.new
respond_to do |format|
format.html # new.html.erb
@@ -96,6 +95,6 @@ class HarvestsController < ApplicationController
def harvest_params
params.require(:harvest).permit(:crop_id, :harvested_at, :description, :owner_id,
:quantity, :unit, :weight_quantity, :weight_unit, :plant_part_id, :slug, :si_weight)
:quantity, :unit, :weight_quantity, :weight_unit, :plant_part_id, :slug, :si_weight)
end
end
-2
View File
@@ -2,7 +2,6 @@ class HomeController < ApplicationController
skip_authorize_resource
def index
# we were previously generating a lot of instance variables like
# @members_count and @interesting_crops in here, but now we call
# the relevant class methods directly in the view, so that fragment
@@ -12,5 +11,4 @@ class HomeController < ApplicationController
format.html # index.html.haml
end
end
end
+17 -9
View File
@@ -7,15 +7,19 @@ class MembersController < ApplicationController
def index
@sort = params[:sort]
if @sort == 'recently_joined'
@members = Member.confirmed.recently_joined.paginate(page: params[:page])
else
@members = Member.confirmed.paginate(page: params[:page])
end
@members = if @sort == 'recently_joined'
Member.confirmed.recently_joined.paginate(page: params[:page])
else
Member.confirmed.paginate(page: params[:page])
end
respond_to do |format|
format.html # index.html.haml
format.json { render json: @members.to_json(only: [:id, :login_name, :slug, :bio, :created_at, :location, :latitude, :longitude]) }
format.json {
render json: @members.to_json(only: [
:id, :login_name, :slug, :bio, :created_at, :location, :latitude, :longitude
])
}
end
end
@@ -29,10 +33,14 @@ class MembersController < ApplicationController
# it requires a garden to be passed in @garden.
# The new garden is not persisted unless Garden#save is called.
@garden = Garden.new
respond_to do |format|
format.html # show.html.haml
format.json { render json: @member.to_json(only: [:id, :login_name, :bio, :created_at, :slug, :location, :latitude, :longitude]) }
format.json {
render json: @member.to_json(only: [
:id, :login_name, :bio, :created_at, :slug, :location, :latitude, :longitude
])
}
format.rss { render(
layout: false,
locals: { member: @member }
@@ -71,7 +79,7 @@ class MembersController < ApplicationController
end
end
def finish_signup
def finish_signup
@member = current_member
if request.patch? && params[:member]
if @member.update(member_params)
@@ -46,7 +46,6 @@ class NotificationsController < ApplicationController
@subject = @sender_notification.subject =~ /^Re: / ?
@sender_notification.subject :
"Re: " + @sender_notification.subject
respond_to do |format|
format.html # reply.html.haml
@@ -10,6 +10,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
create
end
def failure
flash[:alert] = "Authentication failed."
redirect_to request.env['omniauth.origin'] || "/"
@@ -27,7 +28,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
@authentication = action.establish_authentication(auth, member)
unless action.member_created?
sign_in_and_redirect member, event: :authentication #this will throw if @user is not activated
sign_in_and_redirect member, event: :authentication # this will throw if @user is not activated
set_flash_message(:notice, :success, kind: auth['provider']) if is_navigational_format?
else
raise "Invalid provider" unless ['facebook', 'twitter', 'flickr'].index(auth['provider'].to_s)
@@ -48,4 +49,4 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
finish_signup_path(resource)
end
end
end
end
-2
View File
@@ -49,7 +49,6 @@ class OrdersController < ApplicationController
format.html { render action: "show" }
end
end
end
def complete
@@ -78,7 +77,6 @@ class OrdersController < ApplicationController
respond_to do |format|
format.html # new.html.erb
end
end
def cancel
+2 -2
View File
@@ -1,7 +1,7 @@
class PasswordsController < Devise::PasswordsController
protected
protected
def after_resetting_password_path_for(resource)
root_path
end
end
end
+51 -35
View File
@@ -1,5 +1,5 @@
class PhotosController < ApplicationController
before_filter :authenticate_member!, except: [:index, :show]
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
# GET /photos
@@ -47,37 +47,12 @@ class PhotosController < ApplicationController
# POST /photos
# POST /photos.json
def create
@photo = Photo.find_by_flickr_photo_id(params[:photo][:flickr_photo_id]) ||
Photo.new(photo_params)
@photo.owner_id = current_member.id
@photo.set_flickr_metadata
collection = case params[:type]
when 'garden'
@photo.gardens
when 'planting'
@photo.plantings
when 'harvest'
@photo.harvests
else
nil
end
if collection && has_item_id
item = params[:type].camelcase.constantize.find_by_id(params[:id])
if item && member_owns_item(item)
collection << item unless collection.include?(item)
else
flash[:alert] = "Could not find this item owned by you"
end
else
flash[:alert] = "Missing or invalid type or id parameter"
end
find_or_create_photo_from_flickr_photo
add_photo_to_collection
respond_to do |format|
if @photo.save
format.html { redirect_to @photo, notice: 'Photo was successfully added.' }
if @photo.present? && @photo.save
format.html { redirect_to photo_path(@photo), notice: 'Photo was successfully added.' }
format.json { render json: @photo, status: :created, location: @photo }
else
format.html { render action: "new" }
@@ -108,7 +83,7 @@ class PhotosController < ApplicationController
@photo = Photo.find(params[:id])
@photo.destroy
flash[:alert] = "Photo successfully deleted."
respond_to do |format|
format.html { redirect_to photos_url }
format.json { head :no_content }
@@ -117,16 +92,57 @@ class PhotosController < ApplicationController
private
def has_item_id
def item_id?
params.key? :id
end
def member_owns_item(item)
item.owner.id == current_member.id
def flickr_photo_id_param
params[:photo][:flickr_photo_id]
end
def photo_params
params.require(:photo).permit(:flickr_photo_id, :owner_id, :title, :license_name,
:license_url, :thumbnail_url, :fullsize_url, :link_url)
:license_url, :thumbnail_url, :fullsize_url, :link_url)
end
def find_or_create_photo_from_flickr_photo
@photo = Photo.find_by(flickr_photo_id: flickr_photo_id_param)
@photo = Photo.new(photo_params) unless @photo
@photo.owner_id = current_member.id
@photo.set_flickr_metadata
@photo
end
def which_collection?
case params[:type]
when "garden" then @photo.gardens
when "harvest" then @photo.harvests
when "planting" then @photo.plantings
else raise "Invalid type"
end
end
def add_photo_to_collection
collection = which_collection?
unless collection && item_id?
flash[:alert] = "Missing or invalid type or id parameter"
return
end
item = find_item_for_photo!
collection << item unless collection.include?(item)
rescue
flash[:alert] = "Could not find this item owned by you"
end
def find_item_for_photo!
item_class = case params[:type]
when "garden" then Garden
when "harvest" then Harvest
when "planting" then Planting
else raise "Invalid type"
end
item_class.find_by!(id: params[:id], owner_id: current_member.id)
end
end
+10 -3
View File
@@ -5,7 +5,11 @@ class PlacesController < ApplicationController
respond_to do |format|
format.html
# json response is whatever we want to map here
format.json { render json: Member.located.to_json(only: [:id, :login_name, :slug, :location, :latitude, :longitude]) }
format.json do
render json: Member.located.to_json(only: [
:id, :login_name, :slug, :location, :latitude, :longitude
])
end
end
end
@@ -16,7 +20,11 @@ class PlacesController < ApplicationController
@nearby_members = Member.nearest_to(params[:place])
respond_to do |format|
format.html # show.html.haml
format.json { render json: @nearby_members.to_json(only: [:id, :login_name, :slug, :location, :latitude, :longitude]) }
format.json do
render json: @nearby_members.to_json(only: [
:id, :login_name, :slug, :location, :latitude, :longitude
])
end
end
end
@@ -35,5 +43,4 @@ class PlacesController < ApplicationController
end
end
end
end
+14 -12
View File
@@ -7,18 +7,18 @@ class PlantingsController < ApplicationController
def index
@owner = Member.find_by_slug(params[:owner])
@crop = Crop.find_by_slug(params[:crop])
if @owner
@plantings = @owner.plantings.includes(:owner, :crop, :garden).paginate(page: params[:page])
elsif @crop
@plantings = @crop.plantings.includes(:owner, :crop, :garden).paginate(page: params[:page])
else
@plantings = Planting.includes(:owner, :crop, :garden).paginate(page: params[:page])
end
@plantings = if @owner
@owner.plantings.includes(:owner, :crop, :garden).paginate(page: params[:page])
elsif @crop
@crop.plantings.includes(:owner, :crop, :garden).paginate(page: params[:page])
else
Planting.includes(:owner, :crop, :garden).paginate(page: params[:page])
end
respond_to do |format|
format.html { @plantings = @plantings.paginate(page: params[:page]) }
format.json { render json: @plantings }
format.rss { render layout: false } #index.rss.builder
format.rss { render layout: false } # index.rss.builder
format.csv do
specifics = (@owner ? "#{@owner.login_name}-" : @crop ? "#{@crop.name}-" : nil)
@filename = "Growstuff-#{specifics}Plantings-#{Time.zone.now.to_s(:number)}.csv"
@@ -71,7 +71,8 @@ class PlantingsController < ApplicationController
respond_to do |format|
if @planting.save
@planting.update_attribute(:days_before_maturity, update_days_before_maturity(@planting, planting_params[:crop_id]))
@planting.update_attribute(:days_before_maturity,
update_days_before_maturity(@planting, planting_params[:crop_id]))
format.html { redirect_to @planting, notice: 'Planting was successfully created.' }
format.json { render json: @planting, status: :created, location: @planting }
expire_fragment("homepage_stats")
@@ -90,7 +91,8 @@ class PlantingsController < ApplicationController
respond_to do |format|
if @planting.update(planting_params)
@planting.update_attribute(:days_before_maturity, update_days_before_maturity(@planting, planting_params[:crop_id]))
@planting.update_attribute(:days_before_maturity,
update_days_before_maturity(@planting, planting_params[:crop_id]))
format.html { redirect_to @planting, notice: 'Planting was successfully updated.' }
format.json { head :no_content }
else
@@ -118,8 +120,8 @@ class PlantingsController < ApplicationController
def planting_params
params.require(:planting).permit(:crop_id, :description, :garden_id, :planted_at,
:quantity, :sunniness, :planted_from, :owner_id, :finished,
:finished_at)
:quantity, :sunniness, :planted_from, :owner_id, :finished,
:finished_at)
end
def update_days_before_maturity(planting, crop_id)
+6 -6
View File
@@ -7,16 +7,16 @@ class PostsController < ApplicationController
def index
@author = Member.find_by_slug(params[:author])
if @author
@posts = @author.posts.includes(:author, { comments: :author }).paginate(page: params[:page])
else
@posts = Post.includes(:author, { comments: :author }).paginate(page: params[:page])
end
@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
format.rss { render layout: false } # index.rss.builder
end
end
+1 -1
View File
@@ -74,6 +74,6 @@ class ProductsController < ApplicationController
def product_params
params.require(:product).permit(:description, :min_price, :recommended_price, :name,
:account_type_id, :paid_months)
:account_type_id, :paid_months)
end
end
+9 -11
View File
@@ -8,23 +8,22 @@ class RegistrationsController < Devise::RegistrationsController
render "edit"
end
# we need this subclassed method so that Devise doesn't force people to
# change their password every time they want to edit their settings.
# we also check that they give their current password to change their password.
# Code copied from
# https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password
# we need this subclassed method so that Devise doesn't force people to
# change their password every time they want to edit their settings.
# we also check that they give their current password to change their password.
# Code copied from
# https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password
def update
@member = Member.find(current_member.id)
successfully_updated = if needs_password?(@member, params)
@member.update_with_password(devise_parameter_sanitizer.sanitize(:account_update))
if needs_password?(@member, params)
successfully_updated = @member.update_with_password(devise_parameter_sanitizer.sanitize(:account_update))
else
# remove the virtual current_password attribute
# update_without_password doesn't know how to ignore it
params[:member].delete(:current_password)
@member.update_without_password(devise_parameter_sanitizer.sanitize(:account_update))
successfully_updated = @member.update_without_password(devise_parameter_sanitizer.sanitize(:account_update))
end
if successfully_updated
@@ -35,12 +34,11 @@ class RegistrationsController < Devise::RegistrationsController
else
render "edit"
end
end
end
# check if we need the current password to update fields
def needs_password?(member, params)
params[:member][:password].present? ||
params[:member][:password_confirmation].present?
params[:member][:password_confirmation].present?
end
+1 -6
View File
@@ -1,14 +1,9 @@
class RobotsController < ApplicationController
DEFAULT_FILENAME = 'config/robots.txt'.freeze
def robots
filename = if subdomain && subdomain != 'www'
"config/robots.#{ subdomain }.txt"
end
filename = "config/robots.#{subdomain}.txt" if subdomain && subdomain != 'www'
file_to_render = File.exists?(filename.to_s) ? filename : DEFAULT_FILENAME
render file: file_to_render, layout: false, content_type: 'text/plain'
end
+1 -1
View File
@@ -1,7 +1,7 @@
class RolesController < ApplicationController
before_filter :authenticate_member!
load_and_authorize_resource
# GET /roles
def index
@roles = Role.all
+9 -9
View File
@@ -7,18 +7,18 @@ class SeedsController < ApplicationController
def index
@owner = Member.find_by_slug(params[:owner])
@crop = Crop.find_by_slug(params[:crop])
if @owner
@seeds = @owner.seeds.includes(:owner, :crop).paginate(page: params[:page])
elsif @crop
@seeds = @crop.seeds.includes(:owner, :crop).paginate(page: params[:page])
else
@seeds = Seed.includes(:owner, :crop).paginate(page: params[:page])
end
@seeds = if @owner
@owner.seeds.includes(:owner, :crop).paginate(page: params[:page])
elsif @crop
@crop.seeds.includes(:owner, :crop).paginate(page: params[:page])
else
Seed.includes(:owner, :crop).paginate(page: params[:page])
end
respond_to do |format|
format.html # index.html.erb
format.json { render json: @seeds }
format.rss { render layout: false } #index.rss.builder
format.rss { render layout: false } # index.rss.builder
format.csv do
if @owner
@filename = "Growstuff-#{@owner}-Seeds-#{Time.zone.now.to_s(:number)}.csv"
@@ -49,7 +49,7 @@ class SeedsController < ApplicationController
@seed = Seed.new
# using find_by_id here because it returns nil, unlike find
@crop = Crop.find_by_id(params[:crop_id]) || Crop.new
@crop = Crop.find_by_id(params[:crop_id]) || Crop.new
respond_to do |format|
format.html # new.html.erb
+13 -15
View File
@@ -1,5 +1,4 @@
module ApplicationHelper
def price_in_dollars(price)
return sprintf('%.2f', price / 100.0)
end
@@ -7,7 +6,7 @@ module ApplicationHelper
# 999 cents becomes 9.99 AUD -- for products/orders/etc
def price_with_currency(price)
return sprintf('%.2f %s', price / 100.0,
Growstuff::Application.config.currency)
Growstuff::Application.config.currency)
end
def parse_date(str)
@@ -26,20 +25,20 @@ module ApplicationHelper
def build_alert_classes(alert_type = :info)
classes = 'alert alert-dismissable '
case alert_type.to_sym
when :alert, :danger, :error, :validation_errors
classes += 'alert-danger'
when :warning, :todo
classes += 'alert-warning'
when :notice, :success
classes += 'alert-success'
when :info
classes += 'alert-info'
when :alert, :danger, :error, :validation_errors
classes += 'alert-danger'
when :warning, :todo
classes += 'alert-warning'
when :notice, :success
classes += 'alert-success'
when :info
classes += 'alert-info'
end
classes
end
# Produces a cache key for uniquely identifying cached fragments.
def cache_key_for(klass, identifier="all")
def cache_key_for(klass, identifier = "all")
count = klass.count
max_updated_at = klass.maximum(:updated_at).try(:utc).try(:to_s, :number)
"#{klass.name.downcase.pluralize}/#{identifier}-#{count}-#{max_updated_at}"
@@ -73,9 +72,9 @@ module ApplicationHelper
end
Gravatar.new(member.email).image_url({
size: size,
default: :identicon
})
size: size,
default: :identicon
})
end
# Returns a string with the quantity and the right pluralization for a
@@ -86,4 +85,3 @@ module ApplicationHelper
"#{size} #{model_name}"
end
end
+9 -6
View File
@@ -1,6 +1,5 @@
module AutoSuggestHelper
def auto_suggest(resource, source, options={})
def auto_suggest(resource, source, options = {})
if options[:default] && !options[:default].new_record?
default = options[:default]
default_id = options[:default].try(:id)
@@ -13,10 +12,14 @@ module AutoSuggestHelper
source_path = Rails.application.routes.url_helpers.send("#{source}s_search_path")
%Q{
<input id="#{source}" class="auto-suggest #{options[:class]}" type="text" value="#{default}" data-source-url="#{source_path}", placeholder="e.g. lettuce">
<noscript class="text-warning">Warning: Javascript must be available to search and match crops</noscript>
<input id="#{resource}_#{source}_id" class="auto-suggest-id" type="hidden" name="#{resource}[#{source}_id]" value="#{default_id}">
<input id="#{source}" class="auto-suggest #{options[:class]}"
type="text" value="#{default}" data-source-url="#{source_path}",
placeholder="e.g. lettuce">
<noscript class="text-warning">
Warning: Javascript must be available to search and match crops
</noscript>
<input id="#{resource}_#{source}_id" class="auto-suggest-id"
type="hidden" name="#{resource}[#{source}_id]" value="#{default_id}">
}.html_safe
end
end
+1 -1
View File
@@ -2,7 +2,7 @@ module CropsHelper
def display_seed_availability(member, crop)
total_quantity = 0
seeds = member.seeds.select {|seed| seed.crop.name == crop.name }
seeds = member.seeds.select { |seed| seed.crop.name == crop.name }
seeds.each do |seed|
total_quantity = total_quantity + seed.quantity if seed.quantity
+3 -2
View File
@@ -1,10 +1,11 @@
module GardensHelper
def display_garden_description(garden)
if garden.description.nil?
"no description provided."
else
truncate(garden.description, length: 130, separator: ' ', omission: '... ') { link_to "Read more", garden_path(garden) }
truncate(garden.description, length: 130, separator: ' ', omission: '... ') do
link_to "Read more", garden_path(garden)
end
end
end
+3 -5
View File
@@ -1,5 +1,4 @@
module HarvestsHelper
def display_quantity(harvest)
human_quantity = display_human_quantity(harvest)
weight = display_weight(harvest)
@@ -16,10 +15,10 @@ module HarvestsHelper
end
def display_human_quantity(harvest)
if ! harvest.quantity.blank? && harvest.quantity > 0
if !harvest.quantity.blank? && harvest.quantity > 0
if harvest.unit == 'individual' # just the number
number_to_human(harvest.quantity, strip_insignificant_zeros: true)
elsif ! harvest.unit.blank? # pluralize anything else
elsif !harvest.unit.blank? # pluralize anything else
return pluralize(number_to_human(harvest.quantity, strip_insignificant_zeros: true), harvest.unit)
else
return "#{number_to_human(harvest.quantity, strip_insignificant_zeros: true)} #{harvest.unit}"
@@ -30,7 +29,7 @@ module HarvestsHelper
end
def display_weight(harvest)
if ! harvest.weight_quantity.blank? && harvest.weight_quantity > 0
if !harvest.weight_quantity.blank? && harvest.weight_quantity > 0
return "#{number_to_human(harvest.weight_quantity, strip_insignificant_zeros: true)} #{harvest.weight_unit}"
else
return nil
@@ -44,5 +43,4 @@ module HarvestsHelper
harvest.description
end
end
end
-2
View File
@@ -1,5 +1,4 @@
module PlantingsHelper
def display_days_before_maturity(planting)
if planting.finished?
0
@@ -41,5 +40,4 @@ module PlantingsHelper
return "#{planting.owner}."
end
end
end
+4 -6
View File
@@ -1,11 +1,9 @@
module SeedsHelper
def display_seed_description(seed)
if seed.description.nil?
"no description provided."
if seed.description.nil?
"no description provided."
else
truncate(seed.description, length: 130, separator: ' ', omission: '... ') { link_to "Read more", seed_path(seed) }
truncate(seed.description, length: 130, separator: ' ', omission: '... ') { link_to "Read more", seed_path(seed) }
end
end
end
end
+8 -6
View File
@@ -3,7 +3,10 @@ class Notifier < ActionMailer::Base
default from: "Growstuff <noreply@growstuff.org>"
def verifier
raise "RAILS_SECRET_TOKEN environment variable not set - have you created config/application.yml?" unless ENV['RAILS_SECRET_TOKEN']
unless ENV['RAILS_SECRET_TOKEN']
raise "RAILS_SECRET_TOKEN environment variable"\
"not set - have you created config/application.yml?"
end
return ActiveSupport::MessageVerifier.new(ENV['RAILS_SECRET_TOKEN'])
end
@@ -12,7 +15,7 @@ class Notifier < ActionMailer::Base
@notification = notification
@reply_link = reply_link(@notification)
# Encrypting
# Encrypting
@signed_message = verifier.generate ({ member_id: @notification.recipient.id, type: :send_notification_email })
mail(to: @notification.recipient.email,
@@ -25,18 +28,18 @@ class Notifier < ActionMailer::Base
@plantings = @member.plantings.first(5)
@harvests = @member.harvests.first(5)
# Encrypting
# Encrypting
@signed_message = verifier.generate ({ member_id: @member.id, type: :send_planting_reminder })
if @member.send_planting_reminder
mail(to: @member.email,
subject: "What have you planted lately?")
subject: "What have you planted lately?")
end
end
def new_crop_request(member, request)
@member, @request = member, request
mail(to: @member.email, subject: "#{@request.requester.login_name} has requested #{@request.name} as a new crop")
mail(to: @member.email, subject: "#{@request.requester.login_name} has requested #{@request.name} as a new crop")
end
def crop_request_approved(member, crop)
@@ -48,5 +51,4 @@ class Notifier < ActionMailer::Base
@member, @crop = member, crop
mail(to: @member.email, subject: "#{crop.name.capitalize} has been rejected")
end
end
+2 -2
View File
@@ -22,7 +22,7 @@ class Ability
cannot :read, AccountType
# nobody should be able to view unapproved crops unless they
# are wranglers or admins
# are wranglers or admins
cannot :read, Crop
can :read, Crop, approval_status: "approved"
# scientific names should only be viewable if associated crop is approved
@@ -108,7 +108,7 @@ class Ability
can :cancel, Order, member_id: member.id, completed_at: nil
can :destroy, Order, member_id: member.id, completed_at: nil
can :create, OrderItem
can :create, OrderItem
# for now, let's not let people mess with individual order items
cannot :read, OrderItem, order: { member_id: member.id }
cannot :update, OrderItem, order: { member_id: member.id, completed_at: nil }
+1 -2
View File
@@ -8,7 +8,7 @@ class Account < ActiveRecord::Base
before_create do |account|
unless account.account_type
account.account_type = AccountType.find_or_create_by(name:
account.account_type = AccountType.find_or_create_by(name:
Growstuff::Application.config.default_account_type
)
end
@@ -21,5 +21,4 @@ class Account < ActiveRecord::Base
return paid_until.to_s
end
end
end
-1
View File
@@ -19,5 +19,4 @@ class Comment < ActiveRecord::Base
)
end
end
end
+111 -98
View File
@@ -1,4 +1,4 @@
class Crop < ActiveRecord::Base
class Crop < ActiveRecord::Base # rubocop:disable Metrics/ClassLength
extend FriendlyId
friendly_id :name, use: [:slugged, :finders]
@@ -19,13 +19,22 @@ class Crop < ActiveRecord::Base
belongs_to :parent, class_name: 'Crop'
has_many :varieties, class_name: 'Crop', foreign_key: 'parent_id'
has_and_belongs_to_many :posts
before_destroy {|crop| crop.posts.clear}
before_destroy { |crop| crop.posts.clear }
default_scope { order("lower(name) asc") }
scope :recent, -> { where(approval_status: "approved").reorder("created_at desc") }
scope :toplevel, -> { where(approval_status: "approved", parent_id: nil) }
scope :popular, -> { where(approval_status: "approved").reorder("plantings_count desc, lower(name) asc") }
scope :randomized, -> { where(approval_status: "approved").reorder('random()') } # ok on sqlite and psql, but not on mysql
scope :recent, lambda {
where(approval_status: "approved").reorder("created_at desc")
}
scope :toplevel, lambda {
where(approval_status: "approved", parent_id: nil)
}
scope :popular, lambda {
where(approval_status: "approved").reorder("plantings_count desc, lower(name) asc")
}
scope :randomized, lambda {
# ok on sqlite and psql, but not on mysql
where(approval_status: "approved").reorder('random()')
}
scope :pending_approval, -> { where(approval_status: "pending") }
scope :approved, -> { where(approval_status: "approved") }
scope :rejected, -> { where(approval_status: "rejected") }
@@ -33,7 +42,7 @@ class Crop < ActiveRecord::Base
## Wikipedia urls are only necessary when approving a crop
validates :en_wikipedia_url,
format: {
with: /\Ahttps?:\/\/en\.wikipedia\.org\/wiki/,
with: /\Ahttps?:\/\/en\.wikipedia\.org\/wiki\/[[:alnum:]%_]+\z/,
message: 'is not a valid English Wikipedia URL'
},
if: :approved?
@@ -57,24 +66,24 @@ class Crop < ActiveRecord::Base
# use Rails.env as a part of index name (eg. development_growstuff)
index_name [Rails.env, "growstuff"].join('_')
settings index: { number_of_shards: 1 },
analysis: {
tokenizer: {
gs_edgeNGram_tokenizer: {
type: "edgeNGram", # edgeNGram: NGram match from the start of a token
min_gram: 3,
max_gram: 10,
# token_chars: Elasticsearch will split on characters
# that don’t belong to any of these classes
token_chars: [ "letter", "digit" ]
}
},
analyzer: {
gs_edgeNGram_analyzer: {
tokenizer: "gs_edgeNGram_tokenizer",
filter: ["lowercase"]
}
},
} do
analysis: {
tokenizer: {
gs_edgeNGram_tokenizer: {
type: "edgeNGram", # edgeNGram: NGram match from the start of a token
min_gram: 3,
max_gram: 10,
# token_chars: Elasticsearch will split on characters
# that don’t belong to any of these classes
token_chars: ["letter", "digit"]
}
},
analyzer: {
gs_edgeNGram_analyzer: {
tokenizer: "gs_edgeNGram_tokenizer",
filter: ["lowercase"]
}
},
} do
mappings dynamic: 'false' do
indexes :id, type: 'long'
indexes :name, type: 'string', analyzer: 'gs_edgeNGram_analyzer'
@@ -94,13 +103,13 @@ class Crop < ActiveRecord::Base
end
end
def as_indexed_json(options={})
def as_indexed_json(options = {})
self.as_json(
only: [:id, :name, :approval_status],
include: {
scientific_names: { only: :scientific_name },
alternate_names: { only: :name }
})
})
end
# update the Elasticsearch index (only if we're using it in this
@@ -143,13 +152,7 @@ class Crop < ActiveRecord::Base
# key: sunniness (eg. 'sun')
# value: count of how many times it's been used by plantings
def sunniness
sunniness = Hash.new(0)
plantings.each do |p|
if !p.sunniness.blank?
sunniness[p.sunniness] += 1
end
end
return sunniness
count_uses_of_property 'sunniness'
end
# crop.planted_from
@@ -157,13 +160,7 @@ class Crop < ActiveRecord::Base
# key: propagation method (eg. 'seed')
# value: count of how many times it's been used by plantings
def planted_from
planted_from = Hash.new(0)
plantings.each do |p|
if !p.planted_from.blank?
planted_from[p.planted_from] += 1
end
end
return planted_from
count_uses_of_property 'planted_from'
end
# crop.popular_plant_parts
@@ -201,18 +198,18 @@ class Crop < ActiveRecord::Base
end
def approval_statuses
[ 'rejected', 'pending', 'approved' ]
['rejected', 'pending', 'approved']
end
def reasons_for_rejection
[ "already in database", "not edible", "not enough information", "other" ]
["already in database", "not edible", "not enough information", "other"]
end
# Crop.interesting
# returns a list of interesting crops, for use on the homepage etc
def Crop.interesting
howmany = 12 # max number to find
interesting_crops = []
howmany = 12 # max number to find
interesting_crops = []
Crop.includes(:photos).randomized.each do |c|
break if interesting_crops.size == howmany
next unless c.interesting?
@@ -221,16 +218,16 @@ class Crop < ActiveRecord::Base
return interesting_crops
end
# Crop.create_from_csv(row)
# used by db/seeds.rb and rake growstuff:import_crops
# CSV fields:
# - name (required)
# - en_wikipedia_url (required)
# - parent (name, optional)
# - scientific name (optional, can be picked up from parent if it has one)
# Crop.create_from_csv(row)
# used by db/seeds.rb and rake growstuff:import_crops
# CSV fields:
# - name (required)
# - en_wikipedia_url (required)
# - parent (name, optional)
# - scientific name (optional, can be picked up from parent if it has one)
def Crop.create_from_csv(row)
name,en_wikipedia_url,parent,scientific_names,alternate_names = row
name, en_wikipedia_url, parent, scientific_names, alternate_names = row
cropbot = Member.find_by_login_name('cropbot')
raise "cropbot account not found: run rake db:seed" unless cropbot
@@ -252,56 +249,37 @@ class Crop < ActiveRecord::Base
crop.add_scientific_names_from_csv(scientific_names)
crop.add_alternate_names_from_csv(alternate_names)
end
def add_scientific_names_from_csv(scientific_names)
names_to_add = []
if ! scientific_names.blank? # i.e. we actually passed something in, which isn't a given
if !scientific_names.blank? # i.e. we actually passed something in, which isn't a given
names_to_add = scientific_names.split(%r{,\s*})
elsif parent && parent.scientific_names.size > 0 # pick up from parent
names_to_add = parent.scientific_names.map{|s| s.scientific_name}
names_to_add = parent.scientific_names.map { |s| s.scientific_name }
else
logger.warn("Warning: no scientific name (not even on parent crop) for #{self}")
end
cropbot = Member.find_by_login_name('cropbot')
if names_to_add.size > 0
cropbot = Member.find_by_login_name('cropbot')
raise "cropbot account not found: run rake db:seed" unless cropbot
names_to_add.each do |n|
if self.scientific_names.exists?(scientific_name: n)
logger.warn("Warning: skipping duplicate scientific name #{n} for #{self}")
else
self.scientific_names.create(
scientific_name: n,
creator_id: cropbot.id
)
end
end
add_names_to_list(names_to_add, 'scientific', 'scientific_name')
end
end
def add_alternate_names_from_csv(alternate_names)
cropbot = Member.find_by_login_name('cropbot')
names_to_add = []
if ! alternate_names.blank? # i.e. we actually passed something in, which isn't a given
cropbot = Member.find_by_login_name('cropbot')
if !alternate_names.blank? # i.e. we actually passed something in, which isn't a given
raise "cropbot account not found: run rake db:seed" unless cropbot
names_to_add = alternate_names.split(%r{,\s*})
names_to_add.each do |n|
if self.alternate_names.exists?(name: n)
logger.warn("Warning: skipping duplicate alternate name #{n} for #{self}")
else
self.alternate_names.create(
name: n,
creator_id: cropbot.id
)
end
end
add_names_to_list(names_to_add, 'alternate', 'name')
end
end
@@ -317,21 +295,23 @@ class Crop < ActiveRecord::Base
def self.search(query)
if ENV['GROWSTUFF_ELASTICSEARCH'] == "true"
search_str = query.nil? ? "" : query.downcase
response = __elasticsearch__.search( {
# Finds documents which match any field, but uses the _score from
# the best field insead of adding up _score from each field.
query: {
multi_match: {
query: "#{search_str}",
analyzer: "standard",
fields: ["name", "scientific_names.scientific_name", "alternate_names.name"]
}
},
filter: {
term: {approval_status: "approved"}
},
size: 50
}
response = __elasticsearch__.search({
# Finds documents which match any field, but uses the _score from
# the best field insead of adding up _score from each field.
query: {
multi_match: {
query: "#{search_str}",
analyzer: "standard",
fields: ["name",
"scientific_names.scientific_name",
"alternate_names.name"]
}
},
filter: {
term: { approval_status: "approved" }
},
size: 50
}
)
return response.records.to_a
else
@@ -354,6 +334,40 @@ class Crop < ActiveRecord::Base
end
end
private
def add_names_to_list(names_to_add, list_name, col_name)
names_to_add.each do |n|
if name_already_exists(list_name, col_name, n)
logger.warn("Warning: skipping duplicate #{list_name} name #{n} for #{self}")
else
create_crop_in_list(list_name, col_name, n)
end
end
end
def create_crop_in_list(list_name, col_name, name)
cropbot = Member.find_by_login_name('cropbot')
create_hash = {}
create_hash['creator_id'] = "#{cropbot.id}"
create_hash["#{col_name}"] = name
self.send("#{list_name}_names").create(create_hash)
end
def name_already_exists(list_name, col_name, name)
self.send("#{list_name}_names").exists?(["#{col_name} LIKE ?", name])
end
def count_uses_of_property(col_name)
data = Hash.new(0)
plantings.each do |p|
if !p.send("#{col_name}").blank?
data[p.send("#{col_name}")] += 1
end
end
data
end
# Custom validations
def approval_status_cannot_be_changed_again
@@ -376,5 +390,4 @@ class Crop < ActiveRecord::Base
errors.add(:rejection_notes, "must be added if the reason for rejection is \"other\"")
end
end
end
-2
View File
@@ -11,6 +11,4 @@ class Follow < ActiveRecord::Base
body: "#{self.follower.login_name} just followed you on #{ENV["GROWSTUFF_SITE_NAME"]}. "
)
end
end
-1
View File
@@ -8,5 +8,4 @@ class Forum < ActiveRecord::Base
def to_s
return name
end
end
+12 -13
View File
@@ -9,14 +9,14 @@ class Garden < ActiveRecord::Base
has_and_belongs_to_many :photos
before_destroy do |garden|
photolist = garden.photos.to_a # save a temp copy of the photo list
garden.photos.clear # clear relationship b/w garden and photo
before_destroy do |garden|
photolist = garden.photos.to_a # save a temp copy of the photo list
garden.photos.clear # clear relationship b/w garden and photo
photolist.each do |photo|
photo.destroy_if_unused
end
end
photolist.each do |photo|
photo.destroy_if_unused
end
end
# set up geocoding
geocoded_by :location
@@ -33,7 +33,7 @@ class Garden < ActiveRecord::Base
validates :name,
format: {
with: /\S/
with: /\A\w+[\w ]+\z/
},
length: { maximum: 255 }
@@ -50,9 +50,9 @@ class Garden < ActiveRecord::Base
"acres" => "acre"
}
validates :area_unit, inclusion: { in: AREA_UNITS_VALUES.values,
message: "%{value} is not a valid area unit" },
allow_nil: true,
allow_blank: true
message: "%{value} is not a valid area unit" },
allow_nil: true,
allow_blank: true
after_validation :cleanup_area
@@ -76,7 +76,7 @@ class Garden < ActiveRecord::Base
seen_crops = []
plantings.each do |p|
if (! seen_crops.include?(p.crop))
if (!seen_crops.include?(p.crop))
unique_plantings.push(p)
seen_crops.push(p.crop)
end
@@ -103,5 +103,4 @@ class Garden < ActiveRecord::Base
def default_photo
return photos.first
end
end
+25 -27
View File
@@ -22,9 +22,9 @@ class Harvest < ActiveRecord::Base
validates :crop, approved: true
validates :crop, presence: {message: "must be present and exist in our database"}
validates :crop, presence: { message: "must be present and exist in our database" }
validates :plant_part, presence: {message: "must be present and exist in our database"}
validates :plant_part, presence: { message: "must be present and exist in our database" }
validates :quantity,
numericality: {
@@ -45,9 +45,9 @@ class Harvest < ActiveRecord::Base
"bushels" => "bushel"
}
validates :unit, inclusion: { in: UNITS_VALUES.values,
message: "%{value} is not a valid unit" },
allow_nil: true,
allow_blank: true
message: "%{value} is not a valid unit" },
allow_nil: true,
allow_blank: true
validates :weight_quantity,
numericality: { only_integer: false },
@@ -59,15 +59,15 @@ class Harvest < ActiveRecord::Base
"oz" => "oz"
}
validates :weight_unit, inclusion: { in: WEIGHT_UNITS_VALUES.values,
message: "%{value} is not a valid unit" },
allow_nil: true,
allow_blank: true
message: "%{value} is not a valid unit" },
allow_nil: true,
allow_blank: true
after_validation :cleanup_quantities
before_save :set_si_weight
# we're storing the harvest weight in kilograms in the db too
# we're storing the harvest weight in kilograms in the db too
# to make data manipulation easier
def set_si_weight
if self.weight_unit != nil
@@ -105,27 +105,26 @@ class Harvest < ActiveRecord::Base
string = ''
if self.quantity
string += "#{number_to_human(self.quantity.to_s, strip_insignificant_zeros: true)} "
if self.unit == 'individual'
string += 'individual '
else
if self.quantity == 1
string += "#{self.unit} of "
else
string += "#{self.unit.pluralize} of "
end
end
string += if self.unit == 'individual'
'individual '
elsif self.quantity == 1
"#{self.unit} of "
else
"#{self.unit.pluralize} of "
end
end
if self.unit != 'individual' # buckets of apricot*s*
string += "#{self.crop.name.pluralize}"
elsif self.quantity == 1
string += "#{self.crop.name}"
else
string += "#{self.crop.name.pluralize}"
end
string += if self.unit != 'individual' # buckets of apricot*s*
"#{self.crop.name.pluralize}"
elsif self.quantity == 1
"#{self.crop.name}"
else
"#{self.crop.name.pluralize}"
end
if self.weight_quantity
string += " weighing #{number_to_human(self.weight_quantity, strip_insignificant_zeros: true)} #{self.weight_unit}"
string += " weighing #{number_to_human(self.weight_quantity, strip_insignificant_zeros: true)}"\
" #{self.weight_unit}"
end
return string
@@ -134,5 +133,4 @@ class Harvest < ActiveRecord::Base
def default_photo
return photos.first || crop.default_photo
end
end
+32 -33
View File
@@ -4,7 +4,7 @@ class Member < ActiveRecord::Base
friendly_id :login_name, use: [:slugged, :finders]
has_many :posts, foreign_key: 'author_id'
has_many :posts, foreign_key: 'author_id'
has_many :comments, foreign_key: 'author_id'
has_many :forums, foreign_key: 'owner_id'
@@ -27,7 +27,6 @@ class Member < ActiveRecord::Base
has_many :photos
default_scope { order("lower(login_name) asc") }
scope :confirmed, -> { where('confirmed_at IS NOT NULL') }
scope :located, -> { where("location <> '' and latitude IS NOT NULL and longitude IS NOT NULL") }
@@ -45,8 +44,8 @@ class Member < ActiveRecord::Base
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :lockable, :timeoutable, :omniauthable
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :lockable, :timeoutable, :omniauthable
# set up geocoding
geocoded_by :location
@@ -59,7 +58,7 @@ class Member < ActiveRecord::Base
# Requires acceptance of the Terms of Service
validates_acceptance_of :tos_agreement, allow_nil: true,
accept: true
accept: true
validates :login_name,
length: {
@@ -80,12 +79,12 @@ class Member < ActiveRecord::Base
}
# Give each new member a default garden
after_create {|member| Garden.create(name: "Garden", owner_id: member.id) }
after_create { |member| Garden.create(name: "Garden", owner_id: member.id) }
# and an account record (for paid accounts etc)
# we use find_or_create to avoid accidentally creating a second one,
# which can happen sometimes especially with FactoryGirl associations
after_create {|member| Account.find_or_create_by(member_id: member.id) }
after_create { |member| Account.find_or_create_by(member_id: member.id) }
after_save :update_newsletter_subscription
@@ -159,21 +158,21 @@ class Member < ActiveRecord::Base
# Fetches a collection of photos from Flickr
# Returns a [[page of photos], total] pair.
# Total is needed for pagination.
def flickr_photos(page_num=1, set=nil)
def flickr_photos(page_num = 1, set = nil)
result = false
if set
result = flickr.photosets.getPhotos(
photoset_id: set,
page: page_num,
per_page: 30
)
else
result = flickr.people.getPhotos(
user_id: 'me',
page: page_num,
per_page: 30
)
end
result = if set
flickr.photosets.getPhotos(
photoset_id: set,
page: page_num,
per_page: 30
)
else
flickr.people.getPhotos(
user_id: 'me',
page: page_num,
per_page: 30
)
end
if result
return [result.photo, result.total]
else
@@ -183,7 +182,7 @@ class Member < ActiveRecord::Base
# Returns a hash of Flickr photosets' ids and titles
def flickr_sets
sets = Hash.new
sets = Hash.new
flickr.photosets.getList.each do |p|
sets[p.title] = p.id
end
@@ -213,7 +212,7 @@ class Member < ActiveRecord::Base
def Member.nearest_to(place)
nearby_members = []
if place
latitude, longitude = Geocoder.coordinates(place, params: {limit: 1})
latitude, longitude = Geocoder.coordinates(place, params: { limit: 1 })
if latitude && longitude
nearby_members = Member.located.sort_by { |x| x.distance_from([latitude, longitude]) }
end
@@ -235,24 +234,24 @@ class Member < ActiveRecord::Base
end
end
def newsletter_subscribe(testing=false)
def newsletter_subscribe(testing = false)
return true if (Rails.env.test? && !testing)
gb = Gibbon::API.new
res = gb.lists.subscribe({
id: Growstuff::Application.config.newsletter_list_id,
email: { email: email },
merge_vars: { login_name: login_name },
double_optin: false # they already confirmed their email with us
})
id: Growstuff::Application.config.newsletter_list_id,
email: { email: email },
merge_vars: { login_name: login_name },
double_optin: false # they already confirmed their email with us
})
end
def newsletter_unsubscribe(testing=false)
def newsletter_unsubscribe(testing = false)
return true if (Rails.env.test? && !testing)
gb = Gibbon::API.new
res = gb.lists.unsubscribe({
id: Growstuff::Application.config.newsletter_list_id,
email: { email: email }
})
id: Growstuff::Application.config.newsletter_list_id,
email: { email: email }
})
end
def already_following?(member)
-1
View File
@@ -30,5 +30,4 @@ class Notification < ActiveRecord::Base
Notifier.notify(self).deliver_later
end
end
end
+29 -30
View File
@@ -21,7 +21,7 @@ class Order < ActiveRecord::Base
sum = 0
for i in order_items do
subtotal = i.price * i.quantity
sum += subtotal
sum += subtotal
end
return sum
end
@@ -31,10 +31,10 @@ class Order < ActiveRecord::Base
items = []
order_items.each do |i|
items.push({
name: i.product.name,
quantity: i.quantity,
amount: i.price
})
name: i.product.name,
quantity: i.quantity,
amount: i.price
})
end
return items
end
@@ -66,35 +66,34 @@ class Order < ActiveRecord::Base
# search orders (used by admin/orders)
# usage: Order.search({ :by => 'member', :for => 'Skud' })
# can search by: member, order_id, paypal_token, paypal_payer_id,
def Order.search(args={})
def Order.search(args = {})
if args[:for]
case args[:by]
when "member"
member = Member.find_by_login_name(args[:for])
if member
return member.orders
end
when "order_id"
order = Order.find_by_id(args[:for])
if order
return [order]
end
when "paypal_token"
order = Order.find_by_paypal_express_token(args[:for])
if order
return [order]
end
when "paypal_payer_id"
order = Order.find_by_paypal_express_payer_id(args[:for])
if order
return [order]
end
when "referral_code"
# coerce to uppercase
return Order.where(referral_code: args[:for].upcase)
when "member"
member = Member.find_by_login_name(args[:for])
if member
return member.orders
end
when "order_id"
order = Order.find_by_id(args[:for])
if order
return [order]
end
when "paypal_token"
order = Order.find_by_paypal_express_token(args[:for])
if order
return [order]
end
when "paypal_payer_id"
order = Order.find_by_paypal_express_payer_id(args[:for])
if order
return [order]
end
when "referral_code"
# coerce to uppercase
return Order.where(referral_code: args[:for].upcase)
end
end
return []
end
end
-2
View File
@@ -34,11 +34,9 @@ class Photo < ActiveRecord::Base
fullsize_url: FlickRaw.url_z(info),
link_url: FlickRaw.url_photopage(info)
}
end
def set_flickr_metadata
self.update_attributes(flickr_metadata)
end
end
-1
View File
@@ -20,5 +20,4 @@ class PlantPart < ActiveRecord::Base
def crops
return super.reorder('name')
end
end
+11 -11
View File
@@ -32,7 +32,7 @@ class Planting < ActiveRecord::Base
validates :crop, approved: true
validates :crop, presence: {message: "must be present and exist in our database"}
validates :crop, presence: { message: "must be present and exist in our database" }
validates :quantity,
numericality: {
@@ -42,9 +42,9 @@ class Planting < ActiveRecord::Base
SUNNINESS_VALUES = %w(sun semi-shade shade)
validates :sunniness, inclusion: { in: SUNNINESS_VALUES,
message: "%{value} is not a valid sunniness value" },
allow_nil: true,
allow_blank: true
message: "%{value} is not a valid sunniness value" },
allow_nil: true,
allow_blank: true
PLANTED_FROM_VALUES = [
'seed',
@@ -60,9 +60,9 @@ class Planting < ActiveRecord::Base
'layering'
]
validates :planted_from, inclusion: { in: PLANTED_FROM_VALUES,
message: "%{value} is not a valid planting method" },
allow_nil: true,
allow_blank: true
message: "%{value} is not a valid planting method" },
allow_nil: true,
allow_blank: true
validate :finished_must_be_after_planted
@@ -104,8 +104,8 @@ class Planting < ActiveRecord::Base
if differences.compact.empty?
nil
else
differences.compact.sum/differences.compact.size
else
differences.compact.sum / differences.compact.size
end
end
@@ -120,7 +120,7 @@ class Planting < ActiveRecord::Base
return 0 if current_date < planted_at
return 100 if days > days_before_maturity
percent = (days/days_before_maturity*100).to_i
percent = (days / days_before_maturity * 100).to_i
if percent >= 100
percent = 100
@@ -132,7 +132,7 @@ class Planting < ActiveRecord::Base
# return a list of interesting plantings, for the homepage etc.
# we can't do this via a scope (as far as we know) so sadly we have to
# do it this way.
def Planting.interesting(howmany=12, require_photo=true)
def Planting.interesting(howmany = 12, require_photo = true)
interesting_plantings = []
seen_owners = Hash.new(false) # keep track of which owners we've seen already
+13 -13
View File
@@ -5,14 +5,14 @@ class Post < ActiveRecord::Base
belongs_to :forum
has_many :comments, dependent: :destroy
has_and_belongs_to_many :crops
before_destroy {|post| post.crops.clear}
before_destroy { |post| post.crops.clear }
after_save :update_crops_posts_association
# also has_many notifications, but kinda meaningless to get at them
# from this direction, so we won't set up an association for now.
after_create do
recipients = []
sender = self.author.id
sender = self.author.id
self.body.scan(Haml::Filters::GrowstuffMarkdown::MEMBER_REGEX) do |m|
# find member case-insensitively and add to list of recipients
member = Member.where('lower(login_name) = ?', $1.downcase).first
@@ -24,7 +24,7 @@ class Post < ActiveRecord::Base
recipients << member if member && !recipients.include?(member)
end
# don't send notifications to yourself
recipients.map{ |r| r.id }.each do |recipient|
recipients.map { |r| r.id }.each do |recipient|
if recipient != sender
Notification.create(
recipient_id: recipient,
@@ -44,7 +44,6 @@ class Post < ActiveRecord::Base
},
length: { maximum: 255 }
def author_date_subject
# slugs are created before created_at is set
time = created_at || Time.zone.now
@@ -70,14 +69,15 @@ class Post < ActiveRecord::Base
end
private
def update_crops_posts_association
self.crops.destroy_all
# look for crops mentioned in the post. eg. [tomato](crop)
self.body.scan(Haml::Filters::GrowstuffMarkdown::CROP_REGEX) do |m|
# find crop case-insensitively
crop = Crop.where('lower(name) = ?', $1.downcase).first
# create association
self.crops << crop if crop && !self.crops.include?(crop)
end
def update_crops_posts_association
self.crops.destroy_all
# look for crops mentioned in the post. eg. [tomato](crop)
self.body.scan(Haml::Filters::GrowstuffMarkdown::CROP_REGEX) do |m|
# find crop case-insensitively
crop = Crop.where('lower(name) = ?', $1.downcase).first
# create association
self.crops << crop if crop && !self.crops.include?(crop)
end
end
end
-1
View File
@@ -11,5 +11,4 @@ class Product < ActiveRecord::Base
def to_s
name
end
end
+16 -14
View File
@@ -9,7 +9,7 @@ class Seed < ActiveRecord::Base
validates :crop, approved: true
validates :crop, presence: {message: "must be present and exist in our database"}
validates :crop, presence: { message: "must be present and exist in our database" }
validates :quantity,
numericality: {
only_integer: true,
@@ -30,9 +30,10 @@ class Seed < ActiveRecord::Base
TRADABLE_TO_VALUES = %w(nowhere locally nationally internationally)
validates :tradable_to, inclusion: { in: TRADABLE_TO_VALUES,
message: "You may only trade seed nowhere, locally, nationally, or internationally" },
allow_nil: false,
allow_blank: false
message: "You may only trade seed nowhere, "\
"locally, nationally, or internationally" },
allow_nil: false,
allow_blank: false
ORGANIC_VALUES = [
'certified organic',
@@ -40,9 +41,10 @@ class Seed < ActiveRecord::Base
'conventional/non-organic',
'unknown']
validates :organic, inclusion: { in: ORGANIC_VALUES,
message: "You must say whether the seeds are organic or not, or that you don't know" },
allow_nil: false,
allow_blank: false
message: "You must say whether the seeds "\
"are organic or not, or that you don't know" },
allow_nil: false,
allow_blank: false
GMO_VALUES = [
'certified GMO-free',
@@ -50,15 +52,16 @@ class Seed < ActiveRecord::Base
'GMO',
'unknown']
validates :gmo, inclusion: { in: GMO_VALUES,
message: "You must say whether the seeds are genetically modified or not, or that you don't know" },
allow_nil: false,
allow_blank: false
message: "You must say whether the seeds are "\
"genetically modified or not, or that you don't know" },
allow_nil: false,
allow_blank: false
HEIRLOOM_VALUES = %w(heirloom hybrid unknown)
validates :heirloom, inclusion: { in: HEIRLOOM_VALUES,
message: "You must say whether the seeds are heirloom, hybrid, or unknown" },
allow_nil: false,
allow_blank: false
message: "You must say whether the seeds are heirloom, hybrid, or unknown" },
allow_nil: false,
allow_blank: false
def tradable?
if self.tradable_to == 'nowhere'
@@ -89,7 +92,6 @@ class Seed < ActiveRecord::Base
end
return interesting_seeds
end
def seed_slug
+1 -1
View File
@@ -21,7 +21,7 @@
= f.label :name, :class => 'control-label col-md-2'
.col-md-8
= 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'
+1 -1
View File
@@ -1,6 +1,6 @@
= content_for :title, @comment.post.subject
- content_for :opengraph do
= tag("meta", property: "og:image", content: avatar_uri(@comment.post.author, 200))
= tag("meta", property: "og:image", content: avatar_uri(@comment.post.author, 200))
= tag("meta", property: "og:image:user_generated", content: "true")
= tag("meta", property: "og:title", content: @comment.post.subject)
= tag("meta", property: "og:description", content: strip_tags(@comment.post.body).split(' ')[0..20].join(' '))
+2 -2
View File
@@ -48,7 +48,7 @@
Scientific names
= button_tag "+", :id => "add-sci_name-row", :type => "button"
= button_tag "-", :id => "remove-sci_name-row", :type => "button"
.form-group#scientific_names
- @crop.scientific_names.each.with_index do |sci, index|
.template.col-md-12{ :id => "sci_template[#{index+1}]" }
@@ -64,7 +64,7 @@
= button_tag "+", :id => "add-alt_name-row", :type => "button"
= button_tag "-", :id => "remove-alt_name-row", :type => "button"
.form-group#alternate_names
.form-group#alternate_names
- @crop.alternate_names.each.with_index do |alt, index|
.template.col-md-12{ :id => "alt_template[#{index+1}]" }
.col-md-2
+2 -2
View File
@@ -1,7 +1,7 @@
- content_for :title, (can?(:wrangle, @crop) ? "New crop" : "Suggest a crop")
- content_for :title, (can?(:wrangle, @crop) ? "New crop" : "Suggest a crop")
- unless can? :wrangler, @crop
%p Thanks for taking the time to suggest a crop! Our crop database is managed by volunteers, and we appreciate your help. Here are some things to consider when suggesting a new crop:
%ul
+3 -3
View File
@@ -2,7 +2,7 @@
- content_for :subtitle, @crop.default_scientific_name
- content_for :opengraph do
- @crop.photos.each do |photo|
= tag("meta", property: "og:image", content: photo.fullsize_url)
= tag("meta", property: "og:image", content: photo.fullsize_url)
= tag("meta", property: "og:title", content: @crop.name)
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
@@ -92,9 +92,9 @@
%h4 Learn more about #{ @crop.name.pluralize }
%ul
%li= link_to 'Wikipedia (English)', @crop.en_wikipedia_url, target: "_blank", rel: "noopener noreferrer"
%li
%li
= link_to "OpenFarm - Growing guide", "https://openfarm.cc/en/crops/#{URI.escape @crop.name}", target: "_blank", rel: "noopener noreferrer"
%li
%li
= link_to "Gardenate - Planting reminders", "http://www.gardenate.com/plant/#{URI.escape @crop.name}", target: "_blank", rel: "noopener noreferrer"
- if current_member && current_member.location
%li
+1 -1
View File
@@ -24,7 +24,7 @@
%li{:class => @approval_status == "rejected" ? 'active' : ''}
= link_to "Rejected", wrangle_crops_path(:approval_status => "rejected")
%h2
%h2
- if @approval_status == "pending"
Requested Crops
- elsif @approval_status == "rejected"
+1 -1
View File
@@ -1,4 +1,4 @@
- content_for :title, t('.title')
- content_for :title, t('.title')
- if can? :create, Forum
%p
+5 -5
View File
@@ -1,7 +1,7 @@
.panel.panel-success
.panel-heading
%h3.panel-title
= link_to "#{garden.owner.login_name}'s garden", garden.owner
= link_to "#{garden.owner.login_name}'s garden", garden
- if can? :edit, garden
%a.pull-right{:href => edit_garden_path(garden), :role => "button", :id => "edit_garden_glyphicon"}
%span.glyphicon.glyphicon-pencil{:title => "Edit"}
@@ -11,17 +11,17 @@
= link_to image_tag((garden.default_photo ? garden.default_photo.thumbnail_url : 'placeholder_150.png'), :alt => garden.name, :class => 'img'), garden
.col-md-8
%dl.dl-horizontal
%dt Name :
%dt Name :
%dd= link_to garden.name, garden
%dt Location :
%dt Location :
%dd
- if garden.location.blank?
not specified
- else
= link_to garden.location, place_path(garden.location, anchor: "gardens")
%dt Area :
%dt Area :
%dd= garden.area.nil? ? "not specified" : pluralize(garden.area, garden.area_unit)
%dt Active? :
%dt Active? :
%dd= garden.active ? "Yes" : "No"
.col-md-12
%b
+2 -2
View File
@@ -40,8 +40,8 @@
%p No description available yet.
- if can? :edit, @garden
%p
Why not
%p
Why not
= link_to 'tell us more.', edit_garden_path(@garden)
- if @garden.photos.size > 0 or (can? :edit, @garden and can? :create, Photo)
+4 -4
View File
@@ -11,13 +11,13 @@
= link_to image_tag((harvest.default_photo ? harvest.default_photo.thumbnail_url : 'placeholder_150.png'), :alt => harvest.crop.name, :class => 'img'), harvest.crop
.col-md-8
%dl.dl-horizontal
%dt Crop :
%dt Crop :
%dd= link_to harvest.crop.name, harvest.crop
%dt Plant part :
%dt Plant part :
%dd= link_to harvest.plant_part, harvest.plant_part
%dt Quantity :
%dt Quantity :
%dd= display_quantity(harvest)
%dt Harvest date :
%dt Harvest date :
%dd= harvest.harvested_at
.panel-footer
%dt Description
+3 -3
View File
@@ -1,7 +1,7 @@
=content_for :title, "#{@harvest.crop} harvested by #{@harvest.owner}"
- content_for :opengraph do
- @harvest.photos.each do |photo|
= tag("meta", property: "og:image", content: photo.fullsize_url)
= tag("meta", property: "og:image", content: photo.fullsize_url)
= tag("meta", property: "og:image:user_generated", content: "true")
= tag("meta", property: "og:title", content: "#{@harvest.crop} harvested by #{@harvest.owner}")
= tag("meta", property: "og:type", content: "website")
@@ -17,8 +17,8 @@
= link_to "view all #{@harvest.owner}'s harvests", harvests_by_owner_path(:owner => @harvest.owner.slug)
%p
%b Plant part:
- if @harvest.plant_part
= link_to @harvest.plant_part, @harvest.plant_part
- if @harvest.plant_part
= link_to @harvest.plant_part, @harvest.plant_part
- else
not specified
%p
+1 -1
View File
@@ -2,7 +2,7 @@
%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_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) })
+3 -3
View File
@@ -7,7 +7,7 @@
- first_garden = false
= link_to g.name, "#garden#{g.id}", 'data-toggle' => 'tab'
- if current_member == member
%li.navbar-right
%li.navbar-right
= link_to new_garden_path, class: 'btn' do
Add New Garden
.tab-content{style: "padding-top: 1em"}
@@ -25,8 +25,8 @@
%p No description available yet.
- if can? :edit, g
%p
Why not
%p
Why not
= link_to 'tell us more.', edit_garden_path(g)
+3 -3
View File
@@ -1,9 +1,9 @@
- content_for :title, @member.login_name
- content_for :subtitle, @member.location
- content_for :opengraph do
= tag("meta", property: "og:image", content: avatar_uri(@member, 200))
= tag("meta", property: "og:image:user_generated", content: "true")
= tag("meta", property: "og:title", content: @member.login_name)
= tag("meta", property: "og:image", content: avatar_uri(@member, 200))
= tag("meta", property: "og:image:user_generated", content: "true")
= tag("meta", property: "og:title", content: @member.login_name)
= tag("meta", property: "og:type", content: "profile")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
+3 -3
View File
@@ -7,10 +7,10 @@
.row
.col-md-12
- @followers.each do |f|
.col-md-4.three-across
.thumbnail
.col-md-4.three-across
.thumbnail
= render :partial => "members/thumbnail", :locals => { :member => f }
%div.pagination
= page_entries_info @followers
= will_paginate @followers
+2 -2
View File
@@ -7,8 +7,8 @@
.row
.col-md-12
- @follows.each do |f|
.col-md-4.three-across
.thumbnail
.col-md-4.three-across
.thumbnail
= render :partial => "members/thumbnail", :locals => { :member => f }
%div.pagination
@@ -2,7 +2,7 @@
%p Hello #{@member.login_name},
%p
%p
#{@request.requester.login_name} has requested a new crop on #{site_name}.
%ul
+2 -2
View File
@@ -1,6 +1,6 @@
-content_for :title, "#{ENV['GROWSTUFF_SITE_NAME']} community near #{@place}"
- content_for :opengraph do
= tag("meta", property: "og:title", content: "#{ENV['GROWSTUFF_SITE_NAME']} community near #{@place}")
= tag("meta", property: "og:title", content: "#{ENV['GROWSTUFF_SITE_NAME']} community near #{@place}")
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
@@ -34,7 +34,7 @@
#plantings
%h3= "Recent plantings near #{@place}"
- plantings = []
- @nearby_members.first(10).each do |member|
+1 -1
View File
@@ -1,6 +1,6 @@
- content_for :title, @plant_part.name.titlecase
- content_for :opengraph do
= tag("meta", property: "og:title", content: @plant_part.name.titlecase)
= tag("meta", property: "og:title", content: @plant_part.name.titlecase)
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
+1 -1
View File
@@ -13,7 +13,7 @@
%dd= link_to planting.garden.name, planting.garden
%dt Planted on:
%dd= planting.planted_at
%dt Quantity:
%dt Quantity:
%dd= "#{display_planting_quantity(planting)}"
%dt Finished on:
%dd= "#{display_finished(planting)}"
+1 -1
View File
@@ -1,4 +1,4 @@
- content_for :title, @owner ? t('.title.owner_plantings', owner: @owner) : @crop ? t('.title.crop_plantings', crop: @crop.name) : t('.title.default')
- content_for :title, @owner ? t('.title.owner_plantings', owner: @owner) : @crop ? t('.title.crop_plantings', crop: @crop.name) : t('.title.default')
- if @owner
= link_to "View #{@owner}'s profile >>", member_path(@owner)
+5 -5
View File
@@ -1,10 +1,10 @@
=content_for :title, "#{@planting.crop} in #{@planting.location}"
- content_for :opengraph do
- @planting.crop.photos.each do |photo|
= tag("meta", property: "og:image", content: photo.fullsize_url)
= tag("meta", property: "og:title", content: "#{@planting.crop} in #{@planting.location}")
= tag("meta", property: "og:image", content: photo.fullsize_url)
= tag("meta", property: "og:title", content: "#{@planting.crop} in #{@planting.location}")
- if @planting.description
= tag("meta", property: "og:description", content: @planting.description)
= tag("meta", property: "og:description", content: @planting.description)
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
@@ -31,11 +31,11 @@
%dt Quantity:
%dd
="#{display_planting_quantity(@planting)}"
- if !@planting.planted_from.blank?
%dt Planted from:
%dd= "#{display_planted_from(@planting)}"
%dt Sun or shade?
%dd
- sunniness = @planting.sunniness.blank? ? "not specified" : @planting.sunniness
+4 -4
View File
@@ -1,8 +1,8 @@
= content_for :title, @post.subject
- content_for :opengraph do
= tag("meta", property: "og:image", content: avatar_uri(@post.author, 200))
= tag("meta", property: "og:description", content: "#{strip_tags(@post.body).split(' ')[0..20].join(' ')}...")
= tag("meta", property: "og:title", content: @post.subject)
= tag("meta", property: "og:image", content: avatar_uri(@post.author, 200))
= tag("meta", property: "og:description", content: "#{strip_tags(@post.body).split(' ')[0..20].join(' ')}...")
= tag("meta", property: "og:title", content: @post.subject)
= tag("meta", property: "og:type", content: "article")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
@@ -18,7 +18,7 @@
= link_to 'hundreds of different crops', crops_url
and a community from all around the world.
= render :partial => "shared/signin_signup",
= render :partial => "shared/signin_signup",
:locals => { :to => "or to start using #{ENV["GROWSTUFF_SITE_NAME"]} to track what you're planting and harvesting" }
= render :partial => "single", :locals => { :post => @post, :subject => false, :hide_comments => true }
+1 -1
View File
@@ -2,7 +2,7 @@
- @scientific_name.crop.photos.each do |photo|
= tag("meta", property: "og:image", content: photo.fullsize_url)
= tag("meta", property: "og:title", content: @scientific_name.scientific_name)
= tag("meta", property: "og:title", content: @scientific_name.scientific_name)
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
+5 -5
View File
@@ -11,15 +11,15 @@
= 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
.col-md-8
%dl.dl-horizontal
%dt Crop :
%dt Crop :
%dd= link_to seed.crop.name, seed.crop
%dt Plant before :
%dt Plant before :
%dd= seed.plant_before
%dt Quantity :
%dt Quantity :
%dd= seed.quantity
%dt Will trade to :
%dt Will trade to :
%dd= seed.tradable_to
%dt From location :
%dt From location :
%dd= seed.owner.location
%dt Owner :
%dd= link_to seed.owner.login_name, seed.owner
+1 -1
View File
@@ -73,5 +73,5 @@
= link_to @seed.owner.location, place_path(@seed.owner.location, anchor: "seeds")
%p
%small
Or
Or
= link_to "purchase seeds via Ebay", "http://rover.ebay.com/rover/1/705-53470-19255-0/1?icep_ff3=9&pub=5575213277&toolid=10001&campid=5337940151&customid=&icep_uq=#{URI.escape @seed.crop.name}&icep_sellerId=&icep_ex_kw=&icep_sortBy=12&icep_catId=181003&icep_minPrice=&icep_maxPrice=&ipn=psmain&icep_vectorid=229515&kwid=902099&mtid=824&kw=lg", target: "_blank", rel: "noopener noreferrer"
-2
View File
@@ -81,5 +81,3 @@
or
=link_to "sign up", new_member_registration_path
to purchase.
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env ruby
APP_PATH = File.expand_path('../../config/application', __FILE__)
APP_PATH = File.expand_path('../../config/application', __FILE__)
require_relative '../config/boot'
require 'rails/commands'
-2
View File
@@ -16,10 +16,8 @@ images_dir = "app/assets/images"
# To disable debugging comments that display the original location of your selectors. Uncomment:
# line_comments = false
# If you prefer the indented syntax, you might want to regenerate this
# project again passing --syntax sass, or you can uncomment this:
preferred_syntax = :sass
# and then run:
# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass
+1 -1
View File
@@ -1,4 +1,4 @@
# This file is used by Rack-based servers to start the application.
require ::File.expand_path('../config/environment', __FILE__)
require ::File.expand_path('../config/environment', __FILE__)
run Growstuff::Application
+2 -3
View File
@@ -82,7 +82,6 @@ module Growstuff
g.javascripts false
end
# Growstuff-specific configuration variables
config.currency = 'AUD'
config.bot_email = "noreply@growstuff.org"
@@ -90,7 +89,7 @@ module Growstuff
config.user_agent_email = "info@growstuff.org"
Gibbon::API.api_key = ENV['GROWSTUFF_MAILCHIMP_APIKEY'] || 'notarealkey'
# API key can't be blank or tests fail
# API key can't be blank or tests fail
Gibbon::API.timeout = 10
Gibbon::API.throws_exceptions = false
config.newsletter_list_id = ENV['GROWSTUFF_MAILCHIMP_NEWSLETTER_ID']
@@ -108,4 +107,4 @@ module Growstuff
config.active_record.raise_in_transactional_callbacks = true
end
end
end
-6
View File
@@ -1,16 +1,10 @@
development:
adapter: postgresql
database: growstuff_dev
host: localhost
user: postgres
password: postgres
test:
adapter: postgresql
database: growstuff_test
host: localhost
user: postgres
password: postgres
production:
adapter: postgresql
+6 -6
View File
@@ -31,7 +31,7 @@ Growstuff::Application.configure do
# Expands the lines which load the assets
config.assets.debug = true
# Asset digests allow you to set far-future HTTP expiration dates on all assets,
# Asset digests allow you to set far-future HTTP expiration dates on all assets,
# yet still be able to expire them through the digest params.
config.assets.digest = true
@@ -48,11 +48,11 @@ Growstuff::Application.configure do
config.action_mailer.delivery_method = :letter_opener
config.action_mailer.smtp_settings = {
port: '587',
address: 'smtp.mandrillapp.com',
user_name: ENV['GROWSTUFF_MANDRILL_USERNAME'],
password: ENV['GROWSTUFF_MANDRILL_APIKEY'],
authentication: :login
port: '587',
address: 'smtp.mandrillapp.com',
user_name: ENV['GROWSTUFF_MANDRILL_USERNAME'],
password: ENV['GROWSTUFF_MANDRILL_APIKEY'],
authentication: :login
}
config.host = 'localhost:8080'
+6 -6
View File
@@ -70,12 +70,12 @@ Growstuff::Application.configure do
config.action_mailer.default_url_options = { host: 'growstuff.org' }
ActionMailer::Base.smtp_settings = {
port: ENV['SPARKPOST_SMTP_PORT'],
address: ENV['SPARKPOST_SMTP_HOST'],
user_name: ENV['SPARKPOST_SMTP_USERNAME'],
password: ENV['SPARKPOST_SMTP_PASSWORD'],
authentication: :login,
enable_starttls_auto: true
port: ENV['SPARKPOST_SMTP_PORT'],
address: ENV['SPARKPOST_SMTP_HOST'],
user_name: ENV['SPARKPOST_SMTP_USERNAME'],
password: ENV['SPARKPOST_SMTP_PASSWORD'],
authentication: :login,
enable_starttls_auto: true
}
ActionMailer::Base.delivery_method = :smtp
+7 -7
View File
@@ -2,7 +2,7 @@ Growstuff::Application.configure do
# Settings specified here will take precedence over those in config/application.rb
config.action_controller.action_on_unpermitted_parameters = :raise
# Eager load code on boot. This eager loads most of Rails and
# your application in memory, allowing both threaded web servers
# and those relying on copy on write to perform better.
@@ -72,12 +72,12 @@ Growstuff::Application.configure do
config.action_mailer.default_url_options = { host: 'staging.growstuff.org' }
ActionMailer::Base.smtp_settings = {
port: ENV['SPARKPOST_SMTP_PORT'],
address: ENV['SPARKPOST_SMTP_HOST'],
user_name: ENV['SPARKPOST_SMTP_USERNAME'],
password: ENV['SPARKPOST_SMTP_PASSWORD'],
authentication: :login,
enable_starttls_auto: true
port: ENV['SPARKPOST_SMTP_PORT'],
address: ENV['SPARKPOST_SMTP_HOST'],
user_name: ENV['SPARKPOST_SMTP_USERNAME'],
password: ENV['SPARKPOST_SMTP_PASSWORD'],
authentication: :login,
enable_starttls_auto: true
}
ActionMailer::Base.delivery_method = :smtp
+16 -17
View File
@@ -26,7 +26,7 @@ Growstuff::Application.configure do
config.action_dispatch.show_exceptions = true
# Disable request forgery protection in test environment
config.action_controller.allow_forgery_protection = false
config.action_controller.allow_forgery_protection = false
# Tell Action Mailer not to deliver emails to the real world.
# The :test delivery method accumulates sent emails in the
@@ -38,7 +38,7 @@ Growstuff::Application.configure do
# Raises error for missing translations
# config.action_view.raise_on_missing_translations = true
# Growstuff config
config.action_mailer.default_url_options = { host: 'localhost:8080' }
@@ -54,7 +54,6 @@ Growstuff::Application.configure do
::STANDARD_GATEWAY = ActiveMerchant::Billing::PaypalBogusGateway.new
::EXPRESS_GATEWAY = ActiveMerchant::Billing::PaypalBogusGateway.new
end
end
Geocoder.configure(lookup: :test)
@@ -101,7 +100,7 @@ Geocoder::Lookup::Test.add_stub(
)
# Unknown location
Geocoder::Lookup::Test.add_stub( "Tatooine", [])
Geocoder::Lookup::Test.add_stub("Tatooine", [])
Capybara.configure do |config|
config.always_include_port = true
@@ -110,16 +109,16 @@ end
OmniAuth.config.test_mode = true
# Fake the omniauth
OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new({
provider: 'facebook',
uid: '123545',
info: {
name: "John Testerson",
nickname: 'JohnnyT',
email: 'example.oauth.facebook@example.com',
image: 'http://findicons.com/files/icons/1072/face_avatars/300/i04.png'
},
credentials: {
token: "token",
secret: "donttell"
}
})
provider: 'facebook',
uid: '123545',
info: {
name: "John Testerson",
nickname: 'JohnnyT',
email: 'example.oauth.facebook@example.com',
image: 'http://findicons.com/files/icons/1072/face_avatars/300/i04.png'
},
credentials: {
token: "token",
secret: "donttell"
}
})
@@ -9,7 +9,7 @@ ComfortableMexicanSofa.configure do |config|
# Module responsible for authentication. You can replace it with your own.
# It simply needs to have #authenticate method. See http_auth.rb for reference.
config.admin_auth = 'CmsDeviseAuth'
config.admin_auth = 'CmsDeviseAuth'
# Module responsible for authorization on admin side. It should have #authorize
# method that returns true or false based on params and loaded instance
@@ -91,7 +91,6 @@ ComfortableMexicanSofa.configure do |config|
# Reveal partials that can be overwritten in the admin area.
# Default is false.
# config.reveal_cms_partials = false
end
module CmsDeviseAuth
+6 -5
View File
@@ -1,3 +1,4 @@
# rubocop:disable Metrics/LineLength
# Use this hook to configure devise mailer, warden hooks and so forth.
# Many of these configuration options can be set straight in your model.
Devise.setup do |config|
@@ -25,7 +26,7 @@ Devise.setup do |config|
# session. If you need permissions, you should implement that in a before filter.
# You can also supply a hash where the value is a boolean determining whether
# or not authentication should be aborted when the value is not present.
config.authentication_keys = [ :login ]
config.authentication_keys = [:login]
# Configure parameters from the request object used for authentication. Each entry
# given should be a request method and it will automatically be passed to the
@@ -37,12 +38,12 @@ Devise.setup do |config|
# Configure which authentication keys should be case-insensitive.
# These keys will be downcased upon creating or modifying a user and when used
# to authenticate or find a user. Default is :email.
config.case_insensitive_keys = [ :email ]
config.case_insensitive_keys = [:email]
# Configure which authentication keys should have whitespace stripped.
# These keys will have whitespace before and after removed upon creating or
# modifying a user and when used to authenticate or find a user. Default is :email.
config.strip_whitespace_keys = [ :email, :login_name ]
config.strip_whitespace_keys = [:email, :login_name]
# Tell if authentication through request.params is enabled. True by default.
# It can be set to an array that will enable params authentication only for the
@@ -101,7 +102,7 @@ Devise.setup do |config|
config.reconfirmable = true
# Defines which key will be used when confirming an account
config.confirmation_keys = [ :login ]
config.confirmation_keys = [:login]
# ==> Configuration for :rememberable
# The time the user will be remembered without asking for credentials again.
@@ -157,7 +158,7 @@ Devise.setup do |config|
# ==> Configuration for :recoverable
#
# Defines which key will be used when recovering the password for an account
config.reset_password_keys = [ :login ]
config.reset_password_keys = [:login]
# Time interval you can reset your password with a reset password key.
# Don't put a too small interval or your users won't have the time to
Loaded 100 of 349 files, more files were not shown because too many files have changed in this diff. Show more