New registration completed and tested
This commit is contained in:
parent
6eddbe0a69
commit
eed9bd8b40
1
.gitignore
vendored
1
.gitignore
vendored
@ -70,6 +70,7 @@ brakeman.html
|
||||
/app/assets/stylesheets/web-fonts/*
|
||||
/app/assets/stylesheets/translations/*
|
||||
/app/assets/stylesheets/editor/*
|
||||
/app/assets/stylesheets/admin/*
|
||||
|
||||
# Ignore test artifacts
|
||||
/config/locales/data/html_records/*
|
||||
|
@ -715,10 +715,39 @@ button,
|
||||
}
|
||||
}
|
||||
|
||||
ul.menu {
|
||||
list-style: none;
|
||||
margin-top: 0;
|
||||
padding-left: 0;
|
||||
|
||||
li {
|
||||
display: inline;
|
||||
padding: 0;
|
||||
|
||||
@include after {
|
||||
content: '|';
|
||||
margin: 0 0.333em 0 0.5em;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
@include after {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.back-to {
|
||||
float: left;
|
||||
margin-right: 0.5em;
|
||||
font-size: 1.2em;
|
||||
@include font-family(secondary);
|
||||
}
|
||||
|
||||
#action-message {
|
||||
display: none;
|
||||
text-align: center;
|
||||
margin-bottom: 1em;
|
||||
margin-bottom: 3em;
|
||||
|
||||
&.error, &.complete, &.warning {
|
||||
display: block;
|
||||
|
@ -79,14 +79,10 @@ class ConferencesController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
view_context.add_stylesheet 'quill.css'
|
||||
view_context.add_javascript :quill
|
||||
view_context.add_inline_script :editor
|
||||
|
||||
# get the current step
|
||||
@step = current_registration_step(@this_conference, current_user)
|
||||
|
||||
if @step == :payment_form && params[:token].present?
|
||||
if @step == :payment_form && (params[:token].present? || @test_token.present?)
|
||||
result = paypal_payment_confirm(@this_conference, current_user, params)
|
||||
data_to_instance_variables(result)
|
||||
@confirm_payment = true
|
||||
@ -101,7 +97,7 @@ class ConferencesController < ApplicationController
|
||||
if request.xhr?
|
||||
render json: [{
|
||||
globalSelector: '#step-content',
|
||||
html: render_to_string(partial: "registration_steps/#{@step}"),
|
||||
html: view_context.step_message + render_to_string(partial: "registration_steps/#{@step}"),
|
||||
scrollTo: '#action-message .message, #step-content'
|
||||
}]
|
||||
end
|
||||
|
@ -129,22 +129,25 @@ module RegistrationHelper
|
||||
end
|
||||
end
|
||||
|
||||
message = if @update_message.present? && @update_status.present?
|
||||
columns(medium: 12, class: @update_status, id: 'action-message') do
|
||||
content_tag(:div, (_"articles.conference_registration.#{@update_status}.#{@update_message}", :s), class: :message).html_safe
|
||||
end
|
||||
else
|
||||
''
|
||||
end
|
||||
actions = columns(medium: 12, class: [:actions, :center]) do
|
||||
content_tag(:div, actions.html_safe, class: :buttons).html_safe
|
||||
end
|
||||
|
||||
form_tag(register_path(conference.slug), class: 'js-xhr') do
|
||||
message.html_safe +
|
||||
form_tag(register_path(conference.slug), class: @no_ajax ? nil : 'js-xhr') do
|
||||
content.html_safe +
|
||||
(hidden_field_tag :step, step).html_safe +
|
||||
actions.html_safe
|
||||
end.html_safe
|
||||
end
|
||||
|
||||
def step_message
|
||||
if @update_message.present? && @update_status.present?
|
||||
return row do
|
||||
columns(medium: 12, class: @update_status, id: 'action-message') do
|
||||
content_tag(:div, (_"articles.conference_registration.#{@update_status}.#{@update_message}", :s), class: :message).html_safe
|
||||
end.html_safe
|
||||
end.html_safe
|
||||
end
|
||||
return ''
|
||||
end
|
||||
end
|
||||
|
@ -1,3 +1,2 @@
|
||||
- @main_title_t ||= (@this_conference.title)
|
||||
-# @page_title ||= (@this_conference.title)
|
||||
- @main_title_t ||= _!(@this_conference.title)
|
||||
= render partial: 'application/header', locals: { page_group: :conferences, page_key: page_key, image_file: @this_conference.poster_url }
|
||||
|
@ -6,8 +6,20 @@
|
||||
= warning
|
||||
%article
|
||||
- if logged_in?
|
||||
#step-content= render "registration_steps/#{@step}"
|
||||
- add_stylesheet 'quill.css'
|
||||
- add_javascript :quill
|
||||
- add_inline_script :editor
|
||||
#step-content
|
||||
= step_message
|
||||
= render "registration_steps/#{@step}"
|
||||
- else
|
||||
= row do
|
||||
= columns(medium: 12) do
|
||||
%h2=_'articles.conference_registration.headings.Registration_Details'
|
||||
%p= _'articles.conference_registration.paragraphs.Registration_Details'
|
||||
%h3=_'articles.conference_registration.headings.Verify_Account'
|
||||
%p=_'articles.conference_registration.paragraphs.Verify_Account'
|
||||
|
||||
= row do
|
||||
= columns(medium: 12) do
|
||||
= render "application/login"
|
||||
|
16
app/views/registration_steps/_group_ride.html.haml
Normal file
16
app/views/registration_steps/_group_ride.html.haml
Normal file
@ -0,0 +1,16 @@
|
||||
= row do
|
||||
= columns(medium: 12) do
|
||||
= registration_step_header_title
|
||||
- if @info.present?
|
||||
= @info
|
||||
- else
|
||||
= registration_step_header_description
|
||||
= row do
|
||||
= columns(medium: 12) do
|
||||
= save_registration_step do
|
||||
.registration-step-options
|
||||
.options
|
||||
- [:yes, :maybe, :no].each do |option|
|
||||
- class_name = [:unstyled]
|
||||
- class_name << :selected if @will_attend == option
|
||||
= button option, value: option, class: class_name
|
@ -15,7 +15,10 @@
|
||||
= radiobuttons :currency, (@currencies.map { |c| [(_"currencies.#{c}.displayName-count-other"), c] }), @currency
|
||||
.options.graded-options{class: "option-count-#{@amounts.size}"}
|
||||
- @amounts.each_with_index do |option, i|
|
||||
= button (number_to_currency option, unit: '$'), value: option, name: :value, class: [:unstyled, "option-#{i + 1}"], data: { noxhr: 1 }
|
||||
= button (number_to_currency option, unit: '$'), value: option, name: :value, class: [:unstyled, "option-#{i + 1}"]
|
||||
.custom-option
|
||||
-# if Rails.env.test?
|
||||
=# text_field_tag :custom_value, nil
|
||||
-# else
|
||||
= number_field_tag :custom_value, 50.0, step: 0.05, min: 0.05
|
||||
= button :custom_amount, name: :custom_amount, value: :custom, class: :unstyled, data: { noxhr: 1 }
|
||||
= button :custom_amount, name: :custom_amount, value: :custom, class: :unstyled
|
||||
|
@ -26,7 +26,10 @@
|
||||
- when :html
|
||||
.scroller= richtext(data[:value].html_safe)
|
||||
- else
|
||||
= data[:value]
|
||||
- if data[:key].present?
|
||||
=_"#{data[:key]}.#{data[:value]}"
|
||||
- else
|
||||
= data[:value]
|
||||
- else
|
||||
%p.centered=_'articles.conference_registration.paragraphs.registration_cancelled', :p
|
||||
- if @allow_cancel_attendance
|
||||
|
@ -1,6 +1,11 @@
|
||||
= render 'conferences/page_header', page_key: 'Workshops'
|
||||
|
||||
%article
|
||||
= row do
|
||||
= columns(medium: 12) do
|
||||
.back-to=_'articles.conference_registration.headings.Back_to'
|
||||
%ul.menu
|
||||
%li=link_to (_'articles.conference_registration.headings.Your_Registration'), :register
|
||||
= row do
|
||||
= columns(medium: 12) do
|
||||
%h2=_'articles.workshops.headings.Workshops'
|
||||
|
@ -1,7 +1,13 @@
|
||||
= render 'conferences/page_header', page_key: 'Conference_Registration'
|
||||
|
||||
%article
|
||||
= render 'workshops/show', :workshop => @workshop, :translations_available_for_editing => @translations_available_for_editing, :preview => false
|
||||
= row do
|
||||
= columns(medium: 12) do
|
||||
.back-to=_'articles.conference_registration.headings.Back_to'
|
||||
%ul.menu
|
||||
%li=link_to (_'articles.conference_registration.headings.Workshops'), :workshops
|
||||
%li=link_to (_'articles.conference_registration.headings.Your_Registration'), :register
|
||||
= render 'workshops/show', workshop: @workshop, translations_available_for_editing: @translations_available_for_editing, preview: false
|
||||
= row do
|
||||
= columns(medium: 12) do
|
||||
.actions.next-prev
|
||||
|
@ -1572,19 +1572,39 @@ en:
|
||||
conference_registration:
|
||||
complete:
|
||||
payment_processed: Thank you for your payment!
|
||||
companion_registered: Your companion has completed their registration, we will do our best to keep you together
|
||||
error:
|
||||
generic: An unexpected error occurred
|
||||
payment_cancelled: Your payment was cancelled
|
||||
payment_error: An error occurred processing your payment
|
||||
arrival_date_required: Please select a date
|
||||
departure_date_required: Please select a date
|
||||
arrival_date_required: Select a date
|
||||
departure_date_required: Select a date
|
||||
phone_required: A valid phone number is required
|
||||
bed_space_required: Please enter the amount of bed or couch space you have to offer
|
||||
bed_floor_required: Please enter the amount of floor space you have to offer
|
||||
bed_tent_required: Please enter the amount of tent space you have to offer
|
||||
info_required: Please provide your guets with information about you and your home
|
||||
bed_space_required: Enter the amount of bed or couch space you have to offer
|
||||
floor_space_required: Enter the amount of floor space you have to offer
|
||||
tent_space_required: Enter the amount of tent space you have to offer
|
||||
info_required: Provide your guests with information about you and your home
|
||||
policy_required: Read each statement carefully and check the box once to signify that you aggree to uphold the agreement
|
||||
name_required: Provide us with a name that you identify with
|
||||
language_required: Select at least one language that you can speak
|
||||
location_required: Enter a location
|
||||
city_not_found: We could not find a city or town that matches your query
|
||||
org_name_required: Enter the name of your organization
|
||||
address_required: Enter an address
|
||||
email_required: An email address is required
|
||||
org_email_matches_personal_email: This email address matches your personal email address, we ask that you enter your organization's email address instead
|
||||
mailing_address_required: Enter your organization's mailing address
|
||||
end_date_before_start: You have selected an end date that is before your start date
|
||||
departure_date_before_arrival: You have selected a departure date that is before your arrival
|
||||
companion_email_required: Enter an email address
|
||||
companion_already_has_companion: This person already has a companion
|
||||
amount_required: Enter a positive amount
|
||||
payment_denied: Your payment was denied, please check your account and try again
|
||||
warning:
|
||||
payment_pending: Thank you! Your payment is currently pending.
|
||||
payment_pending: Thank you! Your payment is currently pending
|
||||
companion_unregistered: Your companion has not yet registerred, please ensure that they do to guarantee you are housed together
|
||||
step_names:
|
||||
group_ride: Group ride?
|
||||
hosting_other: Other
|
||||
hosting_info: House Info
|
||||
hosting_end_date: End Date
|
||||
@ -1619,6 +1639,8 @@ en:
|
||||
name: Name
|
||||
languages: Languages spoken
|
||||
headings:
|
||||
Back_to: 'Back to:'
|
||||
group_ride: Do you plan to attend the group ride?
|
||||
hosting_other: Information for organizers
|
||||
hosting_info: House Info and Rules
|
||||
hosting_end_date: Housing End Date
|
||||
@ -1716,8 +1738,9 @@ en:
|
||||
info: Info
|
||||
companion: Companion
|
||||
paragraphs:
|
||||
group_ride: There will be a group ride before the conference, do you plan to attend?
|
||||
registration_cancelled: You have cancelled your registration. If you reconsider, please re-open your registration using the button below but keep in mind that you may lose out of your housing or bike if you wait too long.
|
||||
hosting_other: Please enter ay information you would like organizers to consider when selecting guests. If you have restrictions on guests that you would lke to stay at your home or if you have pets or other factors that might cause guests to be uncomfortable or not able to stay at your home, please list them here.
|
||||
hosting_other: Please enter any information you would like organizers to consider when selecting guests. If you have restrictions on guests that you would lke to stay at your home or if you have pets or other factors that might cause guests to be uncomfortable or not able to stay at your home, please list them here.
|
||||
hosting_info: Please fill out your house rules, contact instructions, and any other pertinent information about your home or neighbourhood. Your summary will only be visible to conference organizers and your guests.
|
||||
hosting_end_date: What is the latest date that you are will to have guests stay at you home?
|
||||
hosting_start_date: What is the earliest date that you are will to have guests stay at you home?
|
||||
@ -1732,11 +1755,11 @@ en:
|
||||
confirm_payment: Thank you, please confirm your payment of %{amount} %{currency}.
|
||||
review: Your registration is complete, please review and modify your data as necessary.
|
||||
payment_form: Please select one of the predefined options below or enter a custom amount.
|
||||
org_select: Please select the organization tat you will be representing. This information will be used to help us contact and invite your organization next year and to populate the list of known organizations that will be displayed on bikecollectives.org. If you are involved with multiple oganizations, please select one for now, you will be able to add more organizations at a later date.
|
||||
org_select: Please select the organization that you will be representing. This information will be used to help us contact and invite your organization next year and to populate the list of known organizations that will be displayed on bikecollectives.org. If you are involved with multiple oganizations, please select one for now, you will be able to add more organizations at a later date.
|
||||
payment_type: Registration is by donation but it enables us to pay for spaces, food, equipment, and more. If you can, paying now via PayPal enables us to prepare for the conference without risk of paying out of pocket. Otherwise, pleging to pay on arrival will help us to get a rough idea of what we can and cannot afford.
|
||||
housing_other: Is there anything else that you would like to let us know?
|
||||
housing_allergies: Let us know if you have any allergies that we should be made aware of.
|
||||
housing_food: Please let us know your eating habits by selecting the option that best describes te type of food tat you eat. We will use this to decide the best types of meals to prepare and how much food we will need.
|
||||
housing_food: Please let us know your eating habits by selecting the option that best describes the type of food that you eat. We will use this to decide the best types of meals to prepare and how much food we will need.
|
||||
housing_bike: In order for us to get an idea of how many bikes we will need to prepare, please let us know if you would like to borrow a bike from us.
|
||||
housing_companion_email: What is your companion's email address?
|
||||
housing_companion_check: Are you coming with a significant other or someone who you absolutely must be housed with? Please note, your companion must also register if you want to be housed together.
|
||||
@ -2073,6 +2096,7 @@ en:
|
||||
forms:
|
||||
labels:
|
||||
generic:
|
||||
territory: State/Province
|
||||
payment_type:
|
||||
paypal: Online
|
||||
on_arrival: In person
|
||||
@ -2150,13 +2174,14 @@ en:
|
||||
payment_on_arrival: I can pledge to pay on arrival
|
||||
payment_none: Not now
|
||||
food_meat: I eat meat and dairy
|
||||
food_vegetarian: I am a vegetarian
|
||||
food_vegan: I am a vegan
|
||||
food_vegetarian: I am vegetarian
|
||||
food_vegan: I am vegan
|
||||
housing_none: I don't need a place to stay
|
||||
housing_tent: I would like a place to tent
|
||||
housing_house: Yes, I would like to place to stay
|
||||
'yes': 'Yes'
|
||||
'no': 'No'
|
||||
maybe: Maybe
|
||||
review: Complete
|
||||
back: Back
|
||||
upload: Upload
|
||||
|
@ -11,7 +11,7 @@
|
||||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 20170422222529) do
|
||||
ActiveRecord::Schema.define(version: 20170602051457) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
@ -183,6 +183,7 @@ ActiveRecord::Schema.define(version: 20170422222529) do
|
||||
t.boolean "is_public"
|
||||
t.boolean "is_featured"
|
||||
t.json "provider_conditions"
|
||||
t.text "group_ride_info"
|
||||
end
|
||||
|
||||
create_table "delayed_jobs", force: :cascade do |t|
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -16,6 +16,10 @@ Given /^(?:(?:that )?there is )?an? (upcoming|past)( regional)? conference(?: in
|
||||
TestState.last_conference.save!
|
||||
end
|
||||
|
||||
Given /^there is an organization named '(.+)' in (.+)$/ do |org_name, location|
|
||||
TestState.last_organization = create_org(org_name, location)
|
||||
end
|
||||
|
||||
Given /^(?:the conference |it )has no (poster|date)$/i do |field|
|
||||
if field == 'date'
|
||||
TestState.last_conference.start_date = nil
|
||||
@ -33,7 +37,7 @@ Given /^(?:the conference |it )?is not (featured|public)$/i do |field|
|
||||
end
|
||||
|
||||
Given /^the conference accepts housing providers that live within (\d+)(mi|km)$/i do |number, unit|
|
||||
TestState.last_conference.provider_conditions = {'distance' => {'number' => number.to_i, 'unit' => unit}}
|
||||
TestState.last_conference.provider_conditions = { 'distance' => {'number' => number.to_i, 'unit' => unit } }
|
||||
TestState.last_conference.save!
|
||||
end
|
||||
|
||||
|
@ -64,6 +64,10 @@ Then /^(?:I )?(un)?check '(.+)'$/i do |uncheck, text|
|
||||
end
|
||||
end
|
||||
|
||||
Then /^(?:I )?(un)?check ([^']+)$/i do |uncheck, name|
|
||||
find("input[type=\"checkbox\"][name$=\"[#{name.gsub(/\s/, '_')}]\"]").click
|
||||
end
|
||||
|
||||
Then /^(?:my )?'(.+)' should (not )?be checked$/i do |text, negate|
|
||||
label = find('.check-box-field label', text: text)
|
||||
find("##{label[:for]}", visible: false).send(negate ? :should_not : :should, be_checked)
|
||||
@ -74,8 +78,8 @@ Then /^(?:I )?(?:select|choose|want) (?:an? |the )?'(.+?)'$/i do |value|
|
||||
option.first(:xpath, './/..').set(option.value)
|
||||
end
|
||||
|
||||
Then /^(?:I )?fill in (.+?) with '(.+)'$/i do |field, value|
|
||||
field = field.gsub(/^\s*(my|the)\s*(.+)$/, '\2')
|
||||
Then /^(?:I )?fill in (.+?) with '(.*)'$/i do |field, value|
|
||||
field = field.gsub(/^\s*(my|the)?\s*(.+)$/, '\2').gsub(/\s/, '_')
|
||||
find(selector_for(field)).set value
|
||||
|
||||
if /email/ =~ field && !(/organization/ =~ field)
|
||||
@ -88,7 +92,12 @@ Then /^(?:I )?enter (?:my |an? |some |the )?(.+?)(?: as '(.+)')?$/i do |field, v
|
||||
|
||||
sel = selector_for(field)
|
||||
element = first(sel, visible: true) || first(sel, visible: false)
|
||||
element = element.first('[contenteditable]') if element.tag_name.to_s.downcase == 'div'
|
||||
|
||||
html = false
|
||||
if element.tag_name.to_s.downcase == 'div'
|
||||
element = element.first('[contenteditable]')
|
||||
html = true
|
||||
end
|
||||
|
||||
unless value.present?
|
||||
value = case field
|
||||
@ -102,11 +111,11 @@ Then /^(?:I )?enter (?:my |an? |some |the )?(.+?)(?: as '(.+)')?$/i do |field, v
|
||||
when 'subject', 'title'
|
||||
Forgery::LoremIpsum.sentence(random: true).gsub(/\.$/, '').titlecase
|
||||
when /(comment|reply)/
|
||||
Forgery::LoremIpsum.paragraphs(2, sentences: 6, random: true)
|
||||
Forgery::LoremIpsum.paragraphs(2, sentences: 6, random: true, html: html)
|
||||
when 'message'
|
||||
Forgery::LoremIpsum.paragraphs(2, sentences: 6, random: true)
|
||||
Forgery::LoremIpsum.paragraphs(2, sentences: 6, random: true, html: html)
|
||||
when 'info'
|
||||
Forgery::LoremIpsum.paragraphs(rand(1..4), sentences: rand(3..8), random: true)
|
||||
Forgery::LoremIpsum.paragraphs(rand(1..4), sentences: rand(3..8), random: true, html: html)
|
||||
else
|
||||
fail "Unknown selector '#{field}'"
|
||||
end
|
||||
|
@ -3,11 +3,29 @@ Given /^(?:I am |'(.+)' is )?registered(?: for the conference)?$/i do |username|
|
||||
create_registration(username.present? ? get_user(username) : TestState.my_account)
|
||||
end
|
||||
|
||||
Given /^(.+) and (.+) are companions$/i do |user1, user2|
|
||||
u1 = get_user(user1.gsub(/'/, ''))
|
||||
u2 = get_user(user2.gsub(/'/, ''))
|
||||
registration1 = ConferenceRegistration.find_by(user_id: u1.id, conference_id: TestState.last_conference.id)
|
||||
registration1.housing_data['companion'] = { 'id' => u2.id }
|
||||
registration1.save
|
||||
|
||||
registration2 = ConferenceRegistration.find_by(user_id: u2.id, conference_id: TestState.last_conference.id)
|
||||
registration2.housing_data['companion'] = { 'id' => u1.id }
|
||||
registration2.save
|
||||
end
|
||||
|
||||
Given /^(?:I )?have paid( \$?\d+|\$?\d+\.\d+)? for registration$/i do |amount|
|
||||
TestState.my_registration.registration_fees_paid = amount ? amount.to_f : 50.0
|
||||
TestState.my_registration.save!
|
||||
end
|
||||
|
||||
Given /^my payment status will be '(Completed|Pending|Denied|Error)'$/i do |status|
|
||||
TestState.my_registration.data ||= {}
|
||||
TestState.my_registration.data['payment_status'] = status
|
||||
TestState.my_registration.save!
|
||||
end
|
||||
|
||||
Then /^my registration should( not)? be (confirmed|completed?|paid)$/i do |state, field|
|
||||
ConferenceRegistration.find_by!(email: TestState.last_email_entered).
|
||||
send(field == 'confirmed' ? 'is_confirmed' : (field == 'paid' ? 'registration_fees_paid' : field)).
|
||||
|
@ -95,6 +95,22 @@ def create_registration(user = TestState.my_account)
|
||||
registration.housing = TestState::Sample[:conference_registration].all_housing_options
|
||||
registration.bike = TestState::Sample[:conference_registration].all_bike_options
|
||||
registration.food = TestState::Sample[:conference_registration].all_food_options
|
||||
registration.data = {
|
||||
'payment_method' => 'none',
|
||||
'email_sent' => true,
|
||||
'city_id' => 11,
|
||||
'new_org' => {
|
||||
'id' => 8,
|
||||
'email' => 'example@bikebike.org',
|
||||
'mailing_address' => "120 Assomption Blvd\r\nEdmundston, New Brunswick\r\nCanada E3V 2X4",
|
||||
'name' => 'Bike Pulp',
|
||||
'address' => '120 Assomption Blvd'
|
||||
},
|
||||
'current_step' => 'review',
|
||||
'is_org_member' => true,
|
||||
'group_ride' => true
|
||||
}
|
||||
registration.housing_data = { 'other' => '', 'companion' => false }
|
||||
registration.save!
|
||||
|
||||
if user == TestState.my_account
|
||||
@ -110,37 +126,13 @@ def create_org(name = nil, location = nil)
|
||||
org = FactoryGirl.create(:org)
|
||||
found_location = nil
|
||||
if location.present?
|
||||
cache_file = File.join(File.dirname(__FILE__), 'location_cache.yml')
|
||||
cache = {}
|
||||
if File.exists?(cache_file)
|
||||
begin
|
||||
cache = YAML.load_file(cache_file)
|
||||
rescue
|
||||
# get rid of the cache if there's an error
|
||||
end
|
||||
end
|
||||
l = cache[location]
|
||||
if l.nil?
|
||||
l = Geocoder.search(location).first
|
||||
cache[location] = l
|
||||
File.open(cache_file, 'w') { |f| f.write cache.to_yaml }
|
||||
end
|
||||
begin
|
||||
found_location = Location.new(city: l.city, territory: l.province_code, country: l.country_code, latitude: l.latitude, longitude: l.longitude)
|
||||
rescue; end
|
||||
if found_location.nil?
|
||||
# let it though, we might be offline
|
||||
org.save!
|
||||
return org
|
||||
end
|
||||
found_location = Location.create(city_id: City.search(location).id)
|
||||
org.locations << found_location
|
||||
end
|
||||
if name.present?
|
||||
org.name = name
|
||||
org.slug = org.generate_slug(name, found_location)
|
||||
end
|
||||
if found_location.present?
|
||||
org.locations << found_location
|
||||
end
|
||||
org.save!
|
||||
org
|
||||
end
|
||||
|
@ -120,7 +120,7 @@ end
|
||||
def email_address(user)
|
||||
case user
|
||||
when /(I|me)/
|
||||
TestState.last_email_entered || TestState.my_account.email
|
||||
TestState.my_account.present? ? TestState.my_account.email : TestState.last_email_entered
|
||||
when /^(?:the )?site administrator$/i
|
||||
'goodgodwin@hotmail.com'
|
||||
when /^'(.+)'$/
|
||||
@ -149,9 +149,9 @@ end
|
||||
def get_user(username)
|
||||
return create_user unless username.present?
|
||||
|
||||
TestState::Users[username] = create_user({
|
||||
TestState::Users[username] ||= create_user({
|
||||
(username =~ /^[^\s]+@[^\s]+\.[^\s]+$/ ? :email : :firstname) => username
|
||||
}) unless TestState::Users[username].present?
|
||||
})
|
||||
|
||||
return TestState::Users[username]
|
||||
end
|
||||
|
@ -49,79 +49,21 @@ Brooklyn NY: !ruby/object:Geocoder::Result::Google
|
||||
- sublocality
|
||||
- sublocality_level_1
|
||||
cache_hit:
|
||||
Yellowknife: !ruby/object:Geocoder::Result::Google
|
||||
Seattle: !ruby/object:Geocoder::Result::Google
|
||||
data:
|
||||
address_components:
|
||||
- long_name: Yellowknife
|
||||
short_name: Yellowknife
|
||||
- long_name: Seattle
|
||||
short_name: Seattle
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
- long_name: Fort Smith, Unorganized
|
||||
short_name: Fort Smith, Unorganized
|
||||
types:
|
||||
- administrative_area_level_3
|
||||
- political
|
||||
- long_name: Fort Smith Region
|
||||
short_name: Fort Smith Region
|
||||
- long_name: King County
|
||||
short_name: King County
|
||||
types:
|
||||
- administrative_area_level_2
|
||||
- political
|
||||
- long_name: Northwest Territories
|
||||
short_name: NT
|
||||
types:
|
||||
- administrative_area_level_1
|
||||
- political
|
||||
- long_name: Canada
|
||||
short_name: CA
|
||||
types:
|
||||
- country
|
||||
- political
|
||||
- long_name: X0E
|
||||
short_name: X0E
|
||||
types:
|
||||
- postal_code
|
||||
- postal_code_prefix
|
||||
formatted_address: Yellowknife, NT X0E, Canada
|
||||
geometry:
|
||||
bounds:
|
||||
northeast:
|
||||
lat: 62.5412576
|
||||
lng: -114.299678
|
||||
southwest:
|
||||
lat: 62.4084661
|
||||
lng: -114.518312
|
||||
location:
|
||||
lat: 62.4539717
|
||||
lng: -114.3717886
|
||||
location_type: APPROXIMATE
|
||||
viewport:
|
||||
northeast:
|
||||
lat: 62.5412577
|
||||
lng: -114.299678
|
||||
southwest:
|
||||
lat: 62.4084945
|
||||
lng: -114.518312
|
||||
place_id: ChIJyYJGoyzx0VMRge9xQyQ3wbQ
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
cache_hit:
|
||||
New Orleans: !ruby/object:Geocoder::Result::Google
|
||||
data:
|
||||
address_components:
|
||||
- long_name: New Orleans
|
||||
short_name: New Orleans
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
- long_name: Orleans Parish
|
||||
short_name: Orleans Parish
|
||||
types:
|
||||
- administrative_area_level_2
|
||||
- political
|
||||
- long_name: Louisiana
|
||||
short_name: LA
|
||||
- long_name: Washington
|
||||
short_name: WA
|
||||
types:
|
||||
- administrative_area_level_1
|
||||
- political
|
||||
@ -130,373 +72,27 @@ New Orleans: !ruby/object:Geocoder::Result::Google
|
||||
types:
|
||||
- country
|
||||
- political
|
||||
formatted_address: New Orleans, LA, USA
|
||||
formatted_address: Seattle, WA, USA
|
||||
geometry:
|
||||
bounds:
|
||||
northeast:
|
||||
lat: 30.199332
|
||||
lng: -89.625053
|
||||
lat: 47.734145
|
||||
lng: -122.2244331
|
||||
southwest:
|
||||
lat: 29.8666609
|
||||
lng: -90.14007389999999
|
||||
lat: 47.4919119
|
||||
lng: -122.4596959
|
||||
location:
|
||||
lat: 29.95106579999999
|
||||
lng: -90.0715323
|
||||
lat: 47.6062095
|
||||
lng: -122.3320708
|
||||
location_type: APPROXIMATE
|
||||
viewport:
|
||||
northeast:
|
||||
lat: 30.1748625
|
||||
lng: -89.6269311
|
||||
lat: 47.734145
|
||||
lng: -122.2359033
|
||||
southwest:
|
||||
lat: 29.86842459999999
|
||||
lng: -90.1380099
|
||||
place_id: ChIJZYIRslSkIIYRtNMiXuhbBts
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
cache_hit:
|
||||
Drumheller AB: !ruby/object:Geocoder::Result::Google
|
||||
data:
|
||||
address_components:
|
||||
- long_name: Drumheller
|
||||
short_name: Drumheller
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
- long_name: Division No. 5
|
||||
short_name: Division No. 5
|
||||
types:
|
||||
- administrative_area_level_2
|
||||
- political
|
||||
- long_name: Alberta
|
||||
short_name: AB
|
||||
types:
|
||||
- administrative_area_level_1
|
||||
- political
|
||||
- long_name: Canada
|
||||
short_name: CA
|
||||
types:
|
||||
- country
|
||||
- political
|
||||
formatted_address: Drumheller, AB, Canada
|
||||
geometry:
|
||||
bounds:
|
||||
northeast:
|
||||
lat: 51.488701
|
||||
lng: -112.4530051
|
||||
southwest:
|
||||
lat: 51.3208389
|
||||
lng: -112.806076
|
||||
location:
|
||||
lat: 51.4651847
|
||||
lng: -112.7105343
|
||||
location_type: APPROXIMATE
|
||||
viewport:
|
||||
northeast:
|
||||
lat: 51.488701
|
||||
lng: -112.4530051
|
||||
southwest:
|
||||
lat: 51.3208389
|
||||
lng: -112.806076
|
||||
place_id: ChIJHx_0B4ANc1MRWZCRwItZUUw
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
cache_hit:
|
||||
Portland OR: !ruby/object:Geocoder::Result::Google
|
||||
data:
|
||||
address_components:
|
||||
- long_name: Portland
|
||||
short_name: Portland
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
- long_name: Multnomah County
|
||||
short_name: Multnomah County
|
||||
types:
|
||||
- administrative_area_level_2
|
||||
- political
|
||||
- long_name: Oregon
|
||||
short_name: OR
|
||||
types:
|
||||
- administrative_area_level_1
|
||||
- political
|
||||
- long_name: United States
|
||||
short_name: US
|
||||
types:
|
||||
- country
|
||||
- political
|
||||
formatted_address: Portland, OR, USA
|
||||
geometry:
|
||||
bounds:
|
||||
northeast:
|
||||
lat: 45.654424
|
||||
lng: -122.4718489
|
||||
southwest:
|
||||
lat: 45.432393
|
||||
lng: -122.8369952
|
||||
location:
|
||||
lat: 45.5230622
|
||||
lng: -122.6764816
|
||||
location_type: APPROXIMATE
|
||||
viewport:
|
||||
northeast:
|
||||
lat: 45.6524799
|
||||
lng: -122.4718489
|
||||
southwest:
|
||||
lat: 45.432393
|
||||
lng: -122.8369952
|
||||
place_id: ChIJJ3SpfQsLlVQRkYXR9ua5Nhw
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
cache_hit:
|
||||
Prince Rupert BC: !ruby/object:Geocoder::Result::Google
|
||||
data:
|
||||
address_components:
|
||||
- long_name: Prince Rupert
|
||||
short_name: Prince Rupert
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
- long_name: Skeena-Queen Charlotte
|
||||
short_name: Skeena-Queen Charlotte
|
||||
types:
|
||||
- administrative_area_level_2
|
||||
- political
|
||||
- long_name: British Columbia
|
||||
short_name: BC
|
||||
types:
|
||||
- administrative_area_level_1
|
||||
- political
|
||||
- long_name: Canada
|
||||
short_name: CA
|
||||
types:
|
||||
- country
|
||||
- political
|
||||
formatted_address: Prince Rupert, BC, Canada
|
||||
geometry:
|
||||
bounds:
|
||||
northeast:
|
||||
lat: 54.338083
|
||||
lng: -130.2437961
|
||||
southwest:
|
||||
lat: 54.19392
|
||||
lng: -130.3634291
|
||||
location:
|
||||
lat: 54.3150367
|
||||
lng: -130.3208187
|
||||
location_type: APPROXIMATE
|
||||
viewport:
|
||||
northeast:
|
||||
lat: 54.3343706
|
||||
lng: -130.2478032
|
||||
southwest:
|
||||
lat: 54.202669
|
||||
lng: -130.3608029
|
||||
place_id: ChIJaUV_axPVclQRElbZTQ_jB3E
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
cache_hit:
|
||||
Regina, SK: !ruby/object:Geocoder::Result::Google
|
||||
data:
|
||||
address_components:
|
||||
- long_name: Regina
|
||||
short_name: Regina
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
- long_name: Sherwood No. 159
|
||||
short_name: Sherwood No. 159
|
||||
types:
|
||||
- administrative_area_level_3
|
||||
- political
|
||||
- long_name: Division No. 6
|
||||
short_name: Division No. 6
|
||||
types:
|
||||
- administrative_area_level_2
|
||||
- political
|
||||
- long_name: Saskatchewan
|
||||
short_name: SK
|
||||
types:
|
||||
- administrative_area_level_1
|
||||
- political
|
||||
- long_name: Canada
|
||||
short_name: CA
|
||||
types:
|
||||
- country
|
||||
- political
|
||||
formatted_address: Regina, SK, Canada
|
||||
geometry:
|
||||
bounds:
|
||||
northeast:
|
||||
lat: 50.5207396
|
||||
lng: -104.4924259
|
||||
southwest:
|
||||
lat: 50.3964489
|
||||
lng: -104.7783923
|
||||
location:
|
||||
lat: 50.4452112
|
||||
lng: -104.6188944
|
||||
location_type: APPROXIMATE
|
||||
viewport:
|
||||
northeast:
|
||||
lat: 50.5207396
|
||||
lng: -104.4924259
|
||||
southwest:
|
||||
lat: 50.3964489
|
||||
lng: -104.7783923
|
||||
place_id: ChIJ6z2l-0AeHFMRsVR7t5YySjU
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
cache_hit:
|
||||
Edmundston, NB: !ruby/object:Geocoder::Result::Google
|
||||
data:
|
||||
address_components:
|
||||
- long_name: Edmundston
|
||||
short_name: Edmundston
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
- long_name: Madawaska County
|
||||
short_name: Madawaska County
|
||||
types:
|
||||
- administrative_area_level_2
|
||||
- political
|
||||
- long_name: New Brunswick
|
||||
short_name: NB
|
||||
types:
|
||||
- administrative_area_level_1
|
||||
- political
|
||||
- long_name: Canada
|
||||
short_name: CA
|
||||
types:
|
||||
- country
|
||||
- political
|
||||
formatted_address: Edmundston, NB, Canada
|
||||
geometry:
|
||||
bounds:
|
||||
northeast:
|
||||
lat: 47.456634
|
||||
lng: -68.14554509999999
|
||||
southwest:
|
||||
lat: 47.3177789
|
||||
lng: -68.44122399999999
|
||||
location:
|
||||
lat: 47.3690127
|
||||
lng: -68.32667409999999
|
||||
location_type: APPROXIMATE
|
||||
viewport:
|
||||
northeast:
|
||||
lat: 47.456634
|
||||
lng: -68.14554509999999
|
||||
southwest:
|
||||
lat: 47.3183866
|
||||
lng: -68.44122399999999
|
||||
place_id: ChIJuQPKxpipvUwRtNjzmeech34
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
cache_hit:
|
||||
Souris, MB: !ruby/object:Geocoder::Result::Google
|
||||
data:
|
||||
address_components:
|
||||
- long_name: Souris
|
||||
short_name: Souris
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
- long_name: Glenwood
|
||||
short_name: Glenwood
|
||||
types:
|
||||
- administrative_area_level_3
|
||||
- political
|
||||
- long_name: Division No. 7
|
||||
short_name: Division No. 7
|
||||
types:
|
||||
- administrative_area_level_2
|
||||
- political
|
||||
- long_name: Manitoba
|
||||
short_name: MB
|
||||
types:
|
||||
- administrative_area_level_1
|
||||
- political
|
||||
- long_name: Canada
|
||||
short_name: CA
|
||||
types:
|
||||
- country
|
||||
- political
|
||||
- long_name: R0K
|
||||
short_name: R0K
|
||||
types:
|
||||
- postal_code
|
||||
- postal_code_prefix
|
||||
formatted_address: Souris, MB R0K, Canada
|
||||
geometry:
|
||||
bounds:
|
||||
northeast:
|
||||
lat: 49.6272052
|
||||
lng: -100.2464522
|
||||
southwest:
|
||||
lat: 49.6061908
|
||||
lng: -100.2774639
|
||||
location:
|
||||
lat: 49.6207985
|
||||
lng: -100.2583026
|
||||
location_type: APPROXIMATE
|
||||
viewport:
|
||||
northeast:
|
||||
lat: 49.6272052
|
||||
lng: -100.2464522
|
||||
southwest:
|
||||
lat: 49.6061908
|
||||
lng: -100.2774639
|
||||
place_id: ChIJjVrTVVh851IRLuGKzGdiUj8
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
cache_hit:
|
||||
Eldorado, MX: !ruby/object:Geocoder::Result::Google
|
||||
data:
|
||||
address_components:
|
||||
- long_name: Eldorado
|
||||
short_name: Eldorado
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
- long_name: Sinaloa
|
||||
short_name: Sin.
|
||||
types:
|
||||
- administrative_area_level_1
|
||||
- political
|
||||
- long_name: Mexico
|
||||
short_name: MX
|
||||
types:
|
||||
- country
|
||||
- political
|
||||
formatted_address: Eldorado, Sin., Mexico
|
||||
geometry:
|
||||
bounds:
|
||||
northeast:
|
||||
lat: 24.3379838
|
||||
lng: -107.3476352
|
||||
southwest:
|
||||
lat: 24.3108689
|
||||
lng: -107.3831387
|
||||
location:
|
||||
lat: 24.3240714
|
||||
lng: -107.3584174
|
||||
location_type: APPROXIMATE
|
||||
viewport:
|
||||
northeast:
|
||||
lat: 24.3379838
|
||||
lng: -107.3476352
|
||||
southwest:
|
||||
lat: 24.3108689
|
||||
lng: -107.3831387
|
||||
place_id: ChIJv33Pqm0ho4YRUQ45wKAluZ4
|
||||
lat: 47.4955511
|
||||
lng: -122.4359086
|
||||
place_id: ChIJVTPokywQkFQRmtVEaUZlJRA
|
||||
types:
|
||||
- locality
|
||||
- political
|
||||
|
@ -4,12 +4,14 @@ Feature: Workshops
|
||||
And registration is open
|
||||
And I am logged in
|
||||
And registered for the conference
|
||||
And on the registration page
|
||||
And on the registration page
|
||||
|
||||
Then I should see 'Propose a Workshop'
|
||||
Then I should see 'New Workshop'
|
||||
And should see 'View Workshops'
|
||||
Then I should see 'New Workshop'
|
||||
But I should not see any workshops
|
||||
|
||||
When I click on 'Propose a Workshop'
|
||||
When I click on 'New Workshop'
|
||||
Then I should see 'Create a Workshop'
|
||||
And see 'Describe your workshop in detail'
|
||||
|
||||
@ -46,7 +48,7 @@ Feature: Workshops
|
||||
And should see 'Education'
|
||||
|
||||
When I click the 'Workshops' link
|
||||
Then I should see a workshop
|
||||
Then I should see two workshops
|
||||
|
||||
When I click on the 'More info' link
|
||||
Then I should see 'Tools'
|
||||
@ -61,7 +63,7 @@ Feature: Workshops
|
||||
|
||||
When I click the 'Delete Workshop' link
|
||||
And click the 'Confirm' button
|
||||
Then I should see 'Propose a Workshop'
|
||||
Then I should see 'New Workshop'
|
||||
But I should not see any workshops
|
||||
|
||||
Scenario: Users can comment on an translate their own workshops
|
||||
|
Loading…
x
Reference in New Issue
Block a user