Browse Source

Created a new payment admin page

development
Godwin 8 years ago
parent
commit
2f375f7ff2
  1. 153
      app/assets/stylesheets/_application.scss
  2. 59
      app/controllers/conferences_controller.rb
  3. 89
      app/helpers/application_helper.rb
  4. 6
      app/models/conference.rb
  5. 31
      app/views/conferences/_payment.html.haml
  6. 1
      app/views/conferences/admin/_broadcast_sent.html.haml
  7. 6
      app/views/conferences/admin/_edit.html.haml
  8. 20
      app/views/conferences/admin/_payment.html.haml
  9. 20
      config/locales/en.yml
  10. 3
      config/locales/es.yml
  11. 5
      db/migrate/20160814000814_add_payment_message_to_conference.rb
  12. 5
      db/migrate/20160814000940_add_payment_amounts_to_conference.rb
  13. 864
      db/schema.rb

153
app/assets/stylesheets/_application.scss

@ -109,6 +109,21 @@ table, .table {
background-color: transparent; background-color: transparent;
border: 0; border: 0;
} }
&.state {
background-size: 1.333em;
background-repeat: no-repeat;
background-position: center;
width: 1.75em;
&.happy {
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 87.8 73.2'><polygon fill='#{$colour-5}' points='34.3 73.2 0 32.6 18.7 16.8 35.4 36.5 70.1 0 87.8 16.8 '/></svg>");
}
&.unhappy {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path xmlns="http://www.w3.org/2000/svg" d="M50 5C25.1 5 5 25.1 5 50c0 24.9 20.1 45 45 45s45-20.1 45-45C95 25.1 74.9 5 50 5zM72.5 64.3l-8.2 8.2L50 58.2 35.7 72.5l-8.2-8.2L41.8 50 27.5 35.7l8.2-8.2L50 41.8l14.3-14.3 8.2 8.2L58.2 50 72.5 64.3z" fill="#{$colour-4}"/></svg>');
}
}
} }
th, .table-th { th, .table-th {
@ -120,6 +135,39 @@ table, .table {
} }
} }
td, .table-td {
&.inner-table {
padding: 0;
table {
margin: 0;
width: 100%;
}
tr:first-child {
td, th {
border-top: 0;
}
}
tr:last-child {
td, th {
border-bottom: 0;
}
}
td, th {
&:first-child {
border-left: 0
}
&:last-child {
border-right: 0
}
}
}
}
tbody th { tbody th {
width: 0.1rem; width: 0.1rem;
} }
@ -281,6 +329,10 @@ textarea, .textarea {
&:hover, &:focus, &:active { &:hover, &:focus, &:active {
@include _(box-shadow, 0 0 0 0.3em rgba(0,0,0,0.05)); @include _(box-shadow, 0 0 0 0.3em rgba(0,0,0,0.05));
} }
&.short {
min-height: 10em;
}
} }
.textarea, .workshop-description { .textarea, .workshop-description {
@ -1437,6 +1489,92 @@ ul.warnings li,
} }
} }
#admin-housing {
.host-table {
tr.place-guest {
td {
background-color: lighten($colour-1, 40%);
&:hover {
background-color: $colour-1;
}
}
a {
display: block;
color: $white;
text-align: center;
@include font-family(secondary);
@include after {
display: none;
}
}
}
button, .button {
float: right;
}
td {
vertical-align: top;
}
.state {
position: relative;
font-family: inherit;
&.unhappy {
cursor: pointer;
}
ul {
display: none;
position: absolute;
right: 100%;
top: 0;
background-color: $white;
border: 0.1em solid #CCC;
padding: 0.25em 0.75em;
margin: 0;
list-style: none;
@include default-box-shadow(top, 2);
}
li {
margin: 0;
}
&:hover {
ul {
display: block;
}
}
}
}
#guest-selector {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba($black, 0.5);
.guest-dlg {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: $white;
width: 80%;
max-width: 25em;
@include default-box-shadow(top, 2);
}
}
}
#admin-housing { #admin-housing {
#hosts { #hosts {
background-color: $white; background-color: $white;
@ -2407,7 +2545,7 @@ html :focus {
padding: 0.5em 1.5em; padding: 0.5em 1.5em;
} }
#main .three-options { #main .graded-options {
text-align: center; text-align: center;
button { button {
@ -2416,7 +2554,7 @@ html :focus {
font-size: 1.5em; font-size: 1.5em;
margin: 0.25em; margin: 0.25em;
&:first-child { &.option-1 {
background-color: $colour-3; background-color: $colour-3;
} }
@ -2424,6 +2562,17 @@ html :focus {
background-color: $colour-5; background-color: $colour-5;
} }
} }
&.option-count-4 button.option-3,
&.option-count-5 button.option-4 {
background-color: mix($colour-3, $colour-5);
}
&.option-count-5 {
button.option-2 {
background-color: mix($colour-3, $colour-4);
}
}
} }
#main .skip { #main .skip {

59
app/controllers/conferences_controller.rb

@ -268,7 +268,7 @@ class ConferencesController < ApplicationController
@page_title = 'articles.conference_registration.headings.Policy_Agreement' @page_title = 'articles.conference_registration.headings.Policy_Agreement'
when :administration when :administration
@warnings << flash[:error] if flash[:error].present? @warnings << flash[:error] if flash[:error].present?
@admin_step = params[:admin_step] || 'edit' @admin_step = params[:admin_step] || view_context.admin_steps.first.to_s
return do_404 unless view_context.valid_admin_steps.include?(@admin_step.to_sym) return do_404 unless view_context.valid_admin_steps.include?(@admin_step.to_sym)
@page_title = 'articles.conference_registration.headings.Administration' @page_title = 'articles.conference_registration.headings.Administration'
@ -383,7 +383,7 @@ class ConferencesController < ApplicationController
name: user.firstname || '', name: user.firstname || '',
email: user.email || '', email: user.email || '',
status: (view_context._"articles.conference_registration.terms.registration_status.#{(steps.include? 'questions') ? 'registered' : ((steps.include? 'contact_info') ? 'preregistered' : 'unregistered')}"), status: (view_context._"articles.conference_registration.terms.registration_status.#{(steps.include? 'questions') ? 'registered' : ((steps.include? 'contact_info') ? 'preregistered' : 'unregistered')}"),
date: r.created_at,# ? r.created_at.strftime("%F %T") : '', date: r.created_at ? r.created_at.strftime("%F %T") : '',
city: r.city || '', city: r.city || '',
preferred_language: user.locale.present? ? (view_context.language_name user.locale) : '', preferred_language: user.locale.present? ? (view_context.language_name user.locale) : '',
languages: ((r.languages || []).map { |x| view_context.language_name x }).join(', ').to_s, languages: ((r.languages || []).map { |x| view_context.language_name x }).join(', ').to_s,
@ -462,7 +462,7 @@ class ConferencesController < ApplicationController
ConferenceRegistration.where(:conference_id => @this_conference.id).each do | registration | ConferenceRegistration.where(:conference_id => @this_conference.id).each do | registration |
if registration.can_provide_housing if registration.can_provide_housing
@hosts[registration.id] = registration @hosts[registration.id] = registration
else elsif registration.housing.present? && registration.housing != 'none'
@guests[registration.id] = registration @guests[registration.id] = registration
end end
end end
@ -515,6 +515,14 @@ class ConferencesController < ApplicationController
@housing_data[host_id][:warnings][:space][space] << :overbooked @housing_data[host_id][:warnings][:space][space] << :overbooked
end end
@housing_data[host_id][:guest_data] ||= {}
@housing_data[host_id][:guest_data][guest_id] = { warnings: {}, errors: {} }
if (guest.housing == 'house' && space == :tent) ||
(guest.housing == 'tent' && (space == :bed_space || space == :floor_space))
@housing_data[host_id][:guest_data][guest_id][:warnings][:space] = { actual: space.to_s, expected: guest.housing}
end
companions = data['companions'] || [] companions = data['companions'] || []
companions.each do | companion | companions.each do | companion |
user = User.find_by_email(companion) user = User.find_by_email(companion)
@ -523,16 +531,17 @@ class ConferencesController < ApplicationController
:user_id => user.id, :user_id => user.id,
:conference_id => @this_conference.id :conference_id => @this_conference.id
) )
housing_data = reg.housing_data || {} if reg.present? && @guests[reg.id].present?
companion_host = housing_data['host'].present? ? housing_data['host'].to_i : nil housing_data = reg.housing_data || {}
if companion_host.blank? companion_host = housing_data['host'].present? ? housing_data['host'].to_i : nil
@hosts_affected_by_guests[guest_id] << companion_host if companion_host.blank?
if companion_host != host_id @hosts_affected_by_guests[guest_id] << companion_host
# set this as an error if the guest has selected only one other to stay with, but if they have requested to stay with more, make this only a warning if companion_host != host_id && reg.housing.present? && reg.housing != 'none'
status = companions.size > 1 ? :warnings : :errors # set this as an error if the guest has selected only one other to stay with, but if they have requested to stay with more, make this only a warning
@housing_data[host_id][:guests][guest][status] ||= {} status = companions.size > 1 ? :warnings : :errors
@housing_data[host_id][:guests][guest][status][:companions] ||= [] @housing_data[host_id][:guest_data][guest_id][status][:companions] ||= []
@housing_data[host_id][:guests][guest][status][:companions] << reg.id @housing_data[host_id][:guest_data][guest_id][status][:companions] << { name: reg.user.name, id: reg.id }
end
end end
end end
end end
@ -568,12 +577,8 @@ class ConferencesController < ApplicationController
params[:info_translations].each do | locale, value | params[:info_translations].each do | locale, value |
@this_conference.set_column_for_locale(:info, locale, value, current_user.id) unless value == @this_conference._info(locale) @this_conference.set_column_for_locale(:info, locale, value, current_user.id) unless value == @this_conference._info(locale)
end end
@this_conference.paypal_email_address = params[:paypal_email_address]
@this_conference.paypal_username = params[:paypal_username]
@this_conference.paypal_password = params[:paypal_password]
@this_conference.paypal_signature = params[:paypal_signature]
@this_conference.save @this_conference.save
return redirect_to register_step_path(@this_conference.slug, :administration) return redirect_to administration_step_path(@this_conference.slug, :edit)
when 'add_member' when 'add_member'
org = nil org = nil
@this_conference.organizations.each do | organization | @this_conference.organizations.each do | organization |
@ -583,6 +588,24 @@ class ConferencesController < ApplicationController
org.save org.save
return redirect_to administration_step_path(@this_conference.slug, :edit) return redirect_to administration_step_path(@this_conference.slug, :edit)
end end
when 'payment'
case params[:button]
when 'save'
@this_conference.payment_message = LinguaFranca::ActiveRecord::UntranslatedValue.new(params[:payment_message]) unless @this_conference.payment_message! == params[:payment_message]
params[:payment_message_translations].each do | locale, value |
@this_conference.set_column_for_locale(:payment_message, locale, value, current_user.id) unless value == @this_conference._payment_message(locale)
end
@this_conference.payment_amounts = ((params[:payment_amounts] || {}).values.map &:to_i) - [0]
@this_conference.paypal_email_address = params[:paypal_email_address]
@this_conference.paypal_username = params[:paypal_username]
@this_conference.paypal_password = params[:paypal_password]
@this_conference.paypal_signature = params[:paypal_signature]
@this_conference.save
return redirect_to administration_step_path(@this_conference.slug, :payment)
end
when 'housing' when 'housing'
space = params[:button].split(':')[0] space = params[:button].split(':')[0]
host_id = params[:button].split(':')[1].to_i host_id = params[:button].split(':')[1].to_i

89
app/helpers/application_helper.rb

@ -957,7 +957,7 @@ module ApplicationHelper
end end
def admin_steps def admin_steps
[:edit, :stats, :broadcast, :housing, :locations, :meals, :events, :workshop_times, :schedule] [:stats, :edit, :payment, :broadcast, :housing, :locations, :meals, :events, :workshop_times, :schedule]
end end
def valid_admin_steps def valid_admin_steps
@ -991,6 +991,81 @@ module ApplicationHelper
return _'articles.workshops.info.interested_count', :vars => {:count => workshop.interested_count} return _'articles.workshops.info.interested_count', :vars => {:count => workshop.interested_count}
end end
def host_guests_table(registration)
id = registration.id
html = ''
@housing_data[id][:guests].each do | area, guests |
guest_rows = ''
guests.each do | guest_id, guest |
status_html = ''
@housing_data[id][:guest_data][guest_id][:errors].each do | error, value |
if value.is_a?(Array)
value.each do | v |
status_html += _("errors.housing.space.#{error.to_s}", vars: {value: v})
end
else
status_html += _("errors.housing.space.#{error.to_s}", vars: {value: value })
end
end
@housing_data[id][:guest_data][guest_id][:warnings].each do | error, value |
if value.is_a?(Array)
value.each do | v |
status_html += _("warnings.housing.space.#{error.to_s}", v)
end
else
status_html += _("warnings.housing.space.#{error.to_s}", vars: value)
end
end
if status_html.present?
status_html = content_tag(:ul, status_html.html_safe)
end
guest_rows += content_tag :tr, id: "hosted-guest-#{guest_id}" do
(content_tag :td, guest[:guest].user.name) +
(content_tag :td do
(guest[:guest].city +
(button_tag :remove, class: [:small, :delete])).html_safe
end) +
(content_tag :td, status_html.html_safe, class: [:state, status_html.present? ? :unhappy : :happy])
end
for i in guests.size..(@housing_data[id][:space][area] || 0)
guest_rows += content_tag :tr, class: 'empty-space' do
(content_tag :td, '', colspan: 2) +
(content_tag :td)
end
end
end
status_html = ''
if @housing_data[id][:warnings].present? && @housing_data[id][:warnings][:space].present? && @housing_data[id][:warnings][:space][area].present?
@housing_data[id][:warnings][:space][area].each do | w |
status_html += content_tag(:li, _("warnings.housing.space.#{w.to_s}"))
end
end
if status_html.present?
status_html = content_tag(:ul, status_html.html_safe)
end
html += content_tag :tr do
(content_tag :th, (_"forms.labels.generic.#{area}"), colspan: 2) +
(content_tag :th, status_html.html_safe, class: [:state, status_html.present? ? :unhappy : :happy])
end
html += guest_rows
html += content_tag :tr, class: 'place-guest' do
content_tag :td, colspan: 3 do
content_tag :a, (_'forms.actions.generic.place_guest'), class: 'select-guest', href: '#', data: { host: id, space: area }
end
end
end
content_tag :table, html.html_safe, class: 'host-table'
end
def host_guests_widget(registration) def host_guests_widget(registration)
html = '' html = ''
classes = ['host'] classes = ['host']
@ -1102,19 +1177,25 @@ module ApplicationHelper
aria = {} aria = {}
aria[:labelledby] = label_id if label_id.present? aria[:labelledby] = label_id if label_id.present?
aria[:describedby] = description_id if description_id.present? aria[:describedby] = description_id if description_id.present?
css_class = [
options[:short] === true ? :short : nil
].compact
if options[:plain] if options[:plain]
html += (text_area_tag name, value, html += (text_area_tag name, value,
id: id, id: id,
lang: options[:lang], lang: options[:lang],
aria: aria) aria: aria,
class: css_class
)
else else
html += content_tag(:div, value.present? ? value.html_safe : '', html += content_tag(:div, value.present? ? value.html_safe : '',
id: id, id: id,
class: 'textarea',
data: { name: name, 'edit-on': options[:edit_on] || :load }, data: { name: name, 'edit-on': options[:edit_on] || :load },
lang: options[:lang], lang: options[:lang],
aria: aria, aria: aria,
tabindex: 0 tabindex: 0,
class: [:textarea] + css_class
) )
add_stylesheet :editor add_stylesheet :editor

6
app/models/conference.rb

@ -1,5 +1,5 @@
class Conference < ActiveRecord::Base class Conference < ActiveRecord::Base
translates :info, :title translates :info, :title, :payment_message
mount_uploader :cover, CoverUploader mount_uploader :cover, CoverUploader
mount_uploader :poster, PosterUploader mount_uploader :poster, PosterUploader
@ -64,4 +64,8 @@ class Conference < ActiveRecord::Base
write_attribute :registration_status, new_registration_status.to_s write_attribute :registration_status, new_registration_status.to_s
end end
def self.default_payment_amounts
[25, 50, 100]
end
end end

31
app/views/conferences/_payment.html.haml

@ -1,28 +1,29 @@
= columns(medium: 12) do = columns(medium: 12) do
- if @registration.registration_fees_paid.present? - if @registration.registration_fees_paid.present?
%p %p
%strong=_'articles.conference_registration.paragraphs.Payment_Made', :p, vars: { fees_paid: @registration.registration_fees_paid } %strong=_'articles.conference_registration.paragraphs.Payment_Made', :p, vars: { fees_paid: (number_to_currency @registration.registration_fees_paid, unit: '$') }
= _'articles.conference_registration.paragraphs.Payment_Add' = _'articles.conference_registration.paragraphs.Payment_Add'
= @this_conference.payment_message.html_safe if @this_conference.payment_message.present?
- elsif @this_conference.payment_message.present?
= @this_conference.payment_message.html_safe
- else - else
%p=_'articles.conference_registration.paragraphs.Payment', :p %p=@this_conference.payment_message || (_'articles.conference_registration.paragraphs.Payment', :p)
= columns(large: 9, push: 1) do = columns(large: 9, push: 1) do
= form_tag register_path(@this_conference.slug), :class => :payment do = form_tag register_path(@this_conference.slug), class: :payment do
= hidden_field_tag :button, :payment = hidden_field_tag :button, :payment
.three-options - payment_amounts = @this_conference.payment_amounts.present? ? @this_conference.payment_amounts : Conference.default_payment_amounts
= button_tag :amount_25, :name => :amount, :value => '25.0' do .graded-options{class: "option-count-#{payment_amounts.size}"}
=_! '$25.00' - payment_amounts.each_with_index do | amount, i |
= button_tag :amount_50, :name => :amount, :value => '50.0' do = button_tag :amount_25, name: :amount, value: amount.to_f.to_s, class: "option-#{i + 1}" do
=_! '$50.00' =_! (number_to_currency amount, unit: '$')
= button_tag :amount_100, :name => :amount, :value => '100.0' do = form_tag register_path(@this_conference.slug), class: ['custom-payment', :centered] do
= _!'$100.00'
= form_tag register_path(@this_conference.slug), :class => ['custom-payment', :centered] do
%span.currency=_!'$' %span.currency=_!'$'
= numberfield :amount, nil, :required => true, :step => 0.01, :min => 0.00, label: false = numberfield :amount, nil, required: true, step: 0.01, min: 0.00, label: false
= button_tag :custom_amount, :value => :payment = button_tag :custom_amount, value: :payment
%p=_'articles.conference_registration.paragraphs.currency','(amounts are in $USD)' %p=_'articles.conference_registration.paragraphs.currency','(amounts are in $USD)'
= form_tag register_path(@this_conference.slug), :class => :payment do = form_tag register_path(@this_conference.slug), class: :payment do
= hidden_field_tag :button, :payment = hidden_field_tag :button, :payment
.actions.skip .actions.skip
= button_tag :skip, :name => :amount, :value => '0.0' = button_tag :skip, name: :amount, value: '0.0'
= columns(large: 2) = columns(large: 2)

1
app/views/conferences/admin/_broadcast_sent.html.haml

@ -1 +0,0 @@
%p= _'articles.conference_registration.paragraphs.admin.broadcast.sent'

6
app/views/conferences/admin/_edit.html.haml

@ -4,12 +4,6 @@
- I18n.backend.enabled_locales.each do | locale | - I18n.backend.enabled_locales.each do | locale |
- if locale.to_s != @this_conference.locale.to_s - if locale.to_s != @this_conference.locale.to_s
= textarea "info_translations[#{locale.to_s}]", @this_conference._info(locale), label: 'translate.pages.Locale_Translation', vars: { language: _("languages.#{locale}") }, lang: locale, edit_on: :focus = textarea "info_translations[#{locale.to_s}]", @this_conference._info(locale), label: 'translate.pages.Locale_Translation', vars: { language: _("languages.#{locale}") }, lang: locale, edit_on: :focus
%h4=_'articles.admin.edit.headings.paypal_info', :t
%p=(_'articles.admin.edit.paragraphs.paypal_info', :p).html_safe
= emailfield :paypal_email_address, @this_conference.paypal_email_address || @this_conference.email_address || (@this_conference.organizations.present? && @this_conference.organizations.first.present? ? @this_conference.organizations.first.email_address : nil)
= textfield :paypal_username, @this_conference.paypal_username
= passwordfield :paypal_password, @this_conference.paypal_password
= textfield :paypal_signature, @this_conference.paypal_signature
.actions.right .actions.right
= button_tag :save, value: :save = button_tag :save, value: :save
%h4=_'articles.admin.edit.headings.host_organizations' %h4=_'articles.admin.edit.headings.host_organizations'

20
app/views/conferences/admin/_payment.html.haml

@ -0,0 +1,20 @@
= form_tag administration_update_path(@this_conference.slug, :payment) do
= textarea :payment_message, (@this_conference.payment_message! || "<p>#{I18n.t('articles.conference_registration.paragraphs.Payment', locale: @this_conference.locale)}</p>"), help: 'articles.conference_registration.paragraphs.admin.payment.message', lang: @this_conference.locale, edit_on: :focus, short: true
- I18n.backend.enabled_locales.each do | locale |
- if locale.to_s != @this_conference.locale.to_s
= textarea "payment_message_translations[#{locale.to_s}]", (@this_conference._payment_message(locale) || "<p>#{I18n.t('articles.conference_registration.paragraphs.Payment', locale: locale)}</p>"), label: 'translate.pages.Locale_Translation', vars: { language: _("languages.#{locale}") }, lang: locale, edit_on: :focus, short: true
%h4=_'articles.admin.payment.headings.payment_amounts', :t
= fieldset :payment_amounts, help: 'articles.admin.payment.paragraphs.payment_amounts' do
- payment_amounts = @this_conference.payment_amounts.present? ? @this_conference.payment_amounts : Conference.default_payment_amounts
- for i in 1..5 do
= numberfield "payment_amounts[#{i - 1}]", payment_amounts[i - 1], step: 0.01, min: 0.00, label: false
%h4=_'articles.admin.edit.headings.paypal_info', :t
%p=(_'articles.admin.edit.paragraphs.paypal_info', :p).html_safe
= emailfield :paypal_email_address, @this_conference.paypal_email_address || @this_conference.email_address || (@this_conference.organizations.present? && @this_conference.organizations.first.present? ? @this_conference.organizations.first.email_address : nil)
= textfield :paypal_username, @this_conference.paypal_username
= passwordfield :paypal_password, @this_conference.paypal_password
= textfield :paypal_signature, @this_conference.paypal_signature
.actions.right
= button_tag :save, value: :save

20
config/locales/en.yml

@ -889,6 +889,7 @@ en:
housing: housing:
description: The housing tool can be used to help you set up visitors that have requested to be housed with a host. description: The housing tool can be used to help you set up visitors that have requested to be housed with a host.
headings: headings:
hosts: Hosts
guests: Guests guests: Guests
email: Email email: Email
housing: Preference housing: Preference
@ -918,8 +919,16 @@ en:
paypal_info: PayPal info is used for donations and fee payments. You must enter all fields to enable online fee payments, see the <a href="https://developer.paypal.com/docs/classic/api/apiCredentials/#creating-an-api-signature" target="_blank">PayPal API credential guide</a> for more information. paypal_info: PayPal info is used for donations and fee payments. You must enter all fields to enable online fee payments, see the <a href="https://developer.paypal.com/docs/classic/api/apiCredentials/#creating-an-api-signature" target="_blank">PayPal API credential guide</a> for more information.
broadcast: broadcast:
description: The broadcast tool is used to contact users through email. You can send messages en masse to select groups of users. description: The broadcast tool is used to contact users through email. You can send messages en masse to select groups of users.
broadcast_sent:
description: Your message has been sent.
workshop_times: workshop_times:
description: Before you scheulde workshops, you must first create blocks of time when the workshops will be. description: Before you scheulde workshops, you must first create blocks of time when the workshops will be.
payment:
description: Here you can set up how users will pay you for registration
headings:
payment_amounts: Suggested Payment Amounts
paragraphs:
payment_amounts: Enter up to five suggested payment amounts. Users will still be able to select any amount including none but these amounts will show up as easy to select buttons on the 'Donations' page.
contact: contact:
headings: headings:
contact: Send us a question or a complement contact: Send us a question or a complement
@ -1005,13 +1014,15 @@ en:
admin: admin:
edit: edit:
info: Info info: Info
payment:
message: XXX
companion: Companion companion: Companion
paragraphs: paragraphs:
Policy_Agreement: Ensuring that all attendees feel welcome, safe, and respected at all times is especially important to us all. Please ensure that you have fully read and understand our safer spaces policy below, if you have any questions or concerns you can reach out to the organizers at any time. Policy_Agreement: Ensuring that all attendees feel welcome, safe, and respected at all times is especially important to us all. Please ensure that you have fully read and understand our safer spaces policy below, if you have any questions or concerns you can reach out to the organizers at any time.
Confirm_Agreement: By clicking the "I Agree" button, you are pledging to do your best to uphold Bike!Bike!'s safer space agreement. Thank you! Confirm_Agreement: By clicking the "I Agree" button, you are pledging to do your best to uphold Bike!Bike!'s safer space agreement. Thank you!
Registration_Info: Please fill in this registration form to help us prepare for your arrival to %{city}. If you wish to ask questions or tell us information we did not ask, please fill in the preferences field at the bottom of the page or use the contact us link. Registration_Info: Please fill in this registration form to help us prepare for your arrival to %{city}. If you wish to ask questions or tell us information we did not ask, please fill in the preferences field at the bottom of the page or use the contact us link.
Payment: Thank you for completing your registration. We'll see you at Bike!Bike! Payment is by donation and can be done now or upon arrival but to help us fund the conference, we ask that you pay the registration donation as soon as you can. Payment: Thank you for completing your registration. We'll see you at Bike!Bike! Payment is by donation and can be done now or upon arrival but to help us fund the conference, we ask that you pay the registration donation as soon as you can.
Payment_Made: You have made a payment of $%{fees_paid}. Payment_Made: You have made a payment of %{fees_paid}.
Payment_Add: Thank you! You may add to this amount if you wish by making another payment below. Payment_Add: Thank you! You may add to this amount if you wish by making another payment below.
currency: "(amounts are in USD)" currency: "(amounts are in USD)"
email_confirm: Go to your inbox! You should see an email from Bike!Bike! in just a few moments. There will be a link in the email for you to click on. Check your spam box if you do not see it. If you encounter any problems, please contact us. email_confirm: Go to your inbox! You should see an email from Bike!Bike! in just a few moments. There will be a link in the email for you to click on. Check your spam box if you do not see it. If you encounter any problems, please contact us.
@ -1048,9 +1059,10 @@ en:
broadcast: broadcast:
test: Please take a look at this preview to ensure that you want to send this email. Clicking ‘Test’ will send the email only to you. Only after that then the email will be set to %{send_to_count} people. test: Please take a look at this preview to ensure that you want to send this email. Clicking ‘Test’ will send the email only to you. Only after that then the email will be set to %{send_to_count} people.
preview: Clicking ‘Send’ will send this message to %{send_to_count} people. Please confirm that you have verified that the test email sent to you is what you want to be sent. preview: Clicking ‘Send’ will send this message to %{send_to_count} people. Please confirm that you have verified that the test email sent to you is what you want to be sent.
sent: Your message has been sent.
events: events:
info: Describe your event for anyone attending the conference. info: Describe your event for anyone attending the conference.
payment:
message: This is the text that will be displayed on the 'Donation' page.
companion: Is there someone who you would like us to ensure that you are housed with? companion: Is there someone who you would like us to ensure that you are housed with?
arrival_and_departure: If you don't need housing, just tell us how long you plan to hang out with Bike!Bike! arrival_and_departure: If you don't need housing, just tell us how long you plan to hang out with Bike!Bike!
host: host:
@ -1196,6 +1208,7 @@ en:
forms: forms:
labels: labels:
generic: generic:
payment_message: Payment Message
other: Disabilities, housing preferences, etc. other: Disabilities, housing preferences, etc.
email: Email address email: Email address
allergies: Allergies allergies: Allergies
@ -1361,11 +1374,14 @@ en:
Workshops: Workshops Workshops: Workshops
Stats: Stats Stats: Stats
Broadcast: Broadcast Broadcast: Broadcast
Payment: Payment
Edit: Edit Conference Edit: Edit Conference
admin: admin:
Edit: Edit Edit: Edit
Stats: Stats Stats: Stats
Payment: Payment
Broadcast: Broadcast Broadcast: Broadcast
Broadcast_Sent: Broadcast Sent
Housing: Housing Housing: Housing
Locations: Locations Locations: Locations
Meals: Meals Meals: Meals

3
config/locales/es.yml

@ -802,7 +802,7 @@ es:
availability: Disponibilidad availability: Disponibilidad
address: Dirección address: Dirección
paragraphs: paragraphs:
Payment_Made: Usted ya ha realizado un pago de $ %{fees_paid}. Payment_Made: Usted ya ha realizado un pago de %{fees_paid}.
Payment_Add: ¡Gracias! Puede añadir a esta cantidad si desea realizar otra de pago a continuación. Payment_Add: ¡Gracias! Puede añadir a esta cantidad si desea realizar otra de pago a continuación.
companion: ¿Quieres que nos aseguremos de que la persona que viaja contigo se hospede en el mismo lugar que tú? companion: ¿Quieres que nos aseguremos de que la persona que viaja contigo se hospede en el mismo lugar que tú?
Workshops_You_Have_Requested: La siguiente es una lista de todos los talleres que pediste facilitar. Workshops_You_Have_Requested: La siguiente es una lista de todos los talleres que pediste facilitar.
@ -1034,6 +1034,7 @@ es:
previous: Anterior previous: Anterior
next: Siguiente next: Siguiente
reply: Responder reply: Responder
close: Cerca
aria: aria:
remove_interest: Haga clic en si ya no está interesado en este taller remove_interest: Haga clic en si ya no está interesado en este taller
show_interest: Haga clic en si usted está interesado en este taller show_interest: Haga clic en si usted está interesado en este taller

5
db/migrate/20160814000814_add_payment_message_to_conference.rb

@ -0,0 +1,5 @@
class AddPaymentMessageToConference < ActiveRecord::Migration
def change
add_column :conferences, :payment_message, :text
end
end

5
db/migrate/20160814000940_add_payment_amounts_to_conference.rb

@ -0,0 +1,5 @@
class AddPaymentAmountsToConference < ActiveRecord::Migration
def change
add_column :conferences, :payment_amounts, :json
end
end

864
db/schema.rb

@ -1,431 +1,433 @@
# encoding: UTF-8 # encoding: UTF-8
# This file is auto-generated from the current state of the database. Instead # This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to # of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition. # incrementally modify your database, and then regenerate this schema definition.
# #
# Note that this schema.rb definition is the authoritative source for your # Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another # database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations # system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations # from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues). # you'll amass, the slower it'll run and the greater likelihood for issues).
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20160708042511) do ActiveRecord::Schema.define(version: 20160814000940) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
create_table "authentications", force: :cascade do |t| create_table "authentications", force: :cascade do |t|
t.integer "user_id", null: false t.integer "user_id", null: false
t.string "provider", null: false t.string "provider", null: false
t.string "uid", null: false t.string "uid", null: false
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
end end
create_table "comments", force: :cascade do |t| create_table "comments", force: :cascade do |t|
t.string "model_type" t.string "model_type"
t.integer "model_id" t.integer "model_id"
t.text "comment" t.text "comment"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.integer "user_id" t.integer "user_id"
end end
create_table "conference_admins", force: :cascade do |t| create_table "conference_admins", force: :cascade do |t|
t.integer "conference_id" t.integer "conference_id"
t.integer "user_id" t.integer "user_id"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
end end
create_table "conference_host_organizations", force: :cascade do |t| create_table "conference_host_organizations", force: :cascade do |t|
t.integer "conference_id" t.integer "conference_id"
t.integer "organization_id" t.integer "organization_id"
t.integer "order" t.integer "order"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
end end
create_table "conference_registration_form_fields", force: :cascade do |t| create_table "conference_registration_form_fields", force: :cascade do |t|
t.integer "conference_id" t.integer "conference_id"
t.integer "registration_form_field_id" t.integer "registration_form_field_id"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.integer "position" t.integer "position"
end end
create_table "conference_registration_responses", force: :cascade do |t| create_table "conference_registration_responses", force: :cascade do |t|
t.integer "conference_registration_id" t.integer "conference_registration_id"
t.integer "registration_form_field_id" t.integer "registration_form_field_id"
t.text "data" t.text "data"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
end end
create_table "conference_registrations", force: :cascade do |t| create_table "conference_registrations", force: :cascade do |t|
t.integer "conference_id" t.integer "conference_id"
t.integer "user_id" t.integer "user_id"
t.string "is_attending" t.string "is_attending"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.boolean "is_confirmed" t.boolean "is_confirmed"
t.boolean "is_participant" t.boolean "is_participant"
t.boolean "is_volunteer" t.boolean "is_volunteer"
t.string "confirmation_token" t.string "confirmation_token"
t.binary "data" t.binary "data"
t.string "email" t.string "email"
t.boolean "complete" t.boolean "complete"
t.boolean "completed" t.boolean "completed"
t.string "payment_confirmation_token" t.string "payment_confirmation_token"
t.string "payment_info" t.string "payment_info"
t.integer "registration_fees_paid" t.integer "registration_fees_paid"
t.string "city" t.string "city"
t.datetime "arrival" t.datetime "arrival"
t.datetime "departure" t.datetime "departure"
t.string "housing" t.string "housing"
t.string "bike" t.string "bike"
t.text "other" t.text "other"
t.string "allergies" t.string "allergies"
t.string "languages" t.string "languages"
t.string "food" t.string "food"
t.string "highest_step" t.string "highest_step"
t.json "steps_completed" t.json "steps_completed"
t.boolean "can_provide_housing" t.boolean "can_provide_housing"
t.json "housing_data" t.json "housing_data"
end end
create_table "conference_types", force: :cascade do |t| create_table "conference_types", force: :cascade do |t|
t.string "title" t.string "title"
t.string "info" t.string "info"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.string "slug" t.string "slug"
end end
create_table "conferences", force: :cascade do |t| create_table "conferences", force: :cascade do |t|
t.string "title" t.string "title"
t.string "slug" t.string "slug"
t.datetime "start_date" t.datetime "start_date"
t.datetime "end_date" t.datetime "end_date"
t.text "info" t.text "info"
t.string "poster" t.string "poster"
t.string "cover" t.string "cover"
t.boolean "workshop_schedule_published" t.boolean "workshop_schedule_published"
t.boolean "registration_open" t.boolean "registration_open"
t.boolean "meals_provided" t.boolean "meals_provided"
t.text "meal_info" t.text "meal_info"
t.text "travel_info" t.text "travel_info"
t.integer "conference_type_id" t.integer "conference_type_id"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.text "preregistration_info" t.text "preregistration_info"
t.text "registration_info" t.text "registration_info"
t.text "postregistration_info" t.text "postregistration_info"
t.integer "cover_attribution_id" t.integer "cover_attribution_id"
t.string "cover_attribution_name" t.string "cover_attribution_name"
t.string "cover_attribution_src" t.string "cover_attribution_src"
t.integer "cover_attribution_user_id" t.integer "cover_attribution_user_id"
t.string "locale" t.string "locale"
t.string "email_address" t.string "email_address"
t.string "paypal_email_address" t.string "paypal_email_address"
t.string "paypal_username" t.string "paypal_username"
t.string "paypal_password" t.string "paypal_password"
t.string "paypal_signature" t.string "paypal_signature"
t.string "day_parts" t.string "day_parts"
t.string "registration_status" t.string "registration_status"
t.json "meals" t.json "meals"
t.json "workshop_blocks" t.json "workshop_blocks"
end t.text "payment_message"
t.json "payment_amounts"
create_table "delayed_jobs", force: :cascade do |t| end
t.integer "priority", default: 0, null: false
t.integer "attempts", default: 0, null: false create_table "delayed_jobs", force: :cascade do |t|
t.text "handler", null: false t.integer "priority", default: 0, null: false
t.text "last_error" t.integer "attempts", default: 0, null: false
t.datetime "run_at" t.text "handler", null: false
t.datetime "locked_at" t.text "last_error"
t.datetime "failed_at" t.datetime "run_at"
t.string "locked_by" t.datetime "locked_at"
t.string "queue" t.datetime "failed_at"
t.datetime "created_at" t.string "locked_by"
t.datetime "updated_at" t.string "queue"
end t.datetime "created_at"
t.datetime "updated_at"
add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree end
create_table "dynamic_translation_records", force: :cascade do |t| add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree
t.string "locale"
t.integer "translator_id" create_table "dynamic_translation_records", force: :cascade do |t|
t.string "model_type" t.string "locale"
t.integer "model_id" t.integer "translator_id"
t.string "column" t.string "model_type"
t.text "value" t.integer "model_id"
t.datetime "created_at" t.string "column"
end t.text "value"
t.datetime "created_at"
create_table "email_confirmations", force: :cascade do |t| end
t.string "token"
t.integer "user_id" create_table "email_confirmations", force: :cascade do |t|
t.datetime "expiry" t.string "token"
t.string "url" t.integer "user_id"
t.datetime "created_at", null: false t.datetime "expiry"
t.datetime "updated_at", null: false t.string "url"
end t.datetime "created_at", null: false
t.datetime "updated_at", null: false
create_table "event_locations", force: :cascade do |t| end
t.string "title"
t.integer "conference_id" create_table "event_locations", force: :cascade do |t|
t.float "latitude" t.string "title"
t.float "longitude" t.integer "conference_id"
t.string "address" t.float "latitude"
t.string "amenities" t.float "longitude"
t.datetime "created_at", null: false t.string "address"
t.datetime "updated_at", null: false t.string "amenities"
t.string "space" t.datetime "created_at", null: false
end t.datetime "updated_at", null: false
t.string "space"
create_table "event_types", force: :cascade do |t| end
t.string "slug"
t.text "info" create_table "event_types", force: :cascade do |t|
t.datetime "created_at" t.string "slug"
t.datetime "updated_at" t.text "info"
end t.datetime "created_at"
t.datetime "updated_at"
create_table "events", force: :cascade do |t| end
t.string "title"
t.string "slug" create_table "events", force: :cascade do |t|
t.integer "event_type_id" t.string "title"
t.integer "conference_id" t.string "slug"
t.text "info" t.integer "event_type_id"
t.integer "location_id" t.integer "conference_id"
t.datetime "start_time" t.text "info"
t.datetime "end_time" t.integer "location_id"
t.datetime "created_at" t.datetime "start_time"
t.datetime "updated_at" t.datetime "end_time"
t.integer "event_location_id" t.datetime "created_at"
t.string "event_type" t.datetime "updated_at"
t.string "locale" t.integer "event_location_id"
end t.string "event_type"
t.string "locale"
create_table "locations", force: :cascade do |t| end
t.string "title"
t.float "latitude" create_table "locations", force: :cascade do |t|
t.float "longitude" t.string "title"
t.datetime "created_at" t.float "latitude"
t.datetime "updated_at" t.float "longitude"
t.string "country" t.datetime "created_at"
t.string "territory" t.datetime "updated_at"
t.string "city" t.string "country"
t.string "street" t.string "territory"
t.string "postal_code" t.string "city"
end t.string "street"
t.string "postal_code"
add_index "locations", ["latitude", "longitude"], name: "index_locations_on_latitude_and_longitude", using: :btree end
create_table "locations_organizations", id: false, force: :cascade do |t| add_index "locations", ["latitude", "longitude"], name: "index_locations_on_latitude_and_longitude", using: :btree
t.integer "organization_id"
t.integer "location_id" create_table "locations_organizations", id: false, force: :cascade do |t|
end t.integer "organization_id"
t.integer "location_id"
add_index "locations_organizations", ["organization_id", "location_id"], name: "loc_org_index", using: :btree end
create_table "organization_statuses", force: :cascade do |t| add_index "locations_organizations", ["organization_id", "location_id"], name: "loc_org_index", using: :btree
t.string "name"
t.string "slug" create_table "organization_statuses", force: :cascade do |t|
t.string "info" t.string "name"
t.datetime "created_at" t.string "slug"
t.datetime "updated_at" t.string "info"
end t.datetime "created_at"
t.datetime "updated_at"
create_table "organizations", force: :cascade do |t| end
t.string "name"
t.string "slug" create_table "organizations", force: :cascade do |t|
t.string "email_address" t.string "name"
t.string "url" t.string "slug"
t.integer "year_founded" t.string "email_address"
t.text "info" t.string "url"
t.string "logo" t.integer "year_founded"
t.string "avatar" t.text "info"
t.boolean "requires_approval" t.string "logo"
t.string "secret_question" t.string "avatar"
t.string "secret_answer" t.boolean "requires_approval"
t.integer "user_organization_replationship_id" t.string "secret_question"
t.datetime "created_at" t.string "secret_answer"
t.datetime "updated_at" t.integer "user_organization_replationship_id"
t.string "cover" t.datetime "created_at"
t.integer "cover_attribution_id" t.datetime "updated_at"
t.string "cover_attribution_name" t.string "cover"
t.string "cover_attribution_src" t.integer "cover_attribution_id"
t.string "phone" t.string "cover_attribution_name"
t.integer "organization_status_id" t.string "cover_attribution_src"
t.integer "cover_attribution_user_id" t.string "phone"
t.string "status" t.integer "organization_status_id"
end t.integer "cover_attribution_user_id"
t.string "status"
create_table "registration_form_fields", force: :cascade do |t| end
t.string "title"
t.text "help" create_table "registration_form_fields", force: :cascade do |t|
t.boolean "required" t.string "title"
t.string "field_type" t.text "help"
t.string "options" t.boolean "required"
t.boolean "is_retired" t.string "field_type"
t.datetime "created_at" t.string "options"
t.datetime "updated_at" t.boolean "is_retired"
end t.datetime "created_at"
t.datetime "updated_at"
create_table "sessions", force: :cascade do |t| end
t.string "session_id", null: false
t.text "data" create_table "sessions", force: :cascade do |t|
t.datetime "created_at" t.string "session_id", null: false
t.datetime "updated_at" t.text "data"
end t.datetime "created_at"
t.datetime "updated_at"
add_index "sessions", ["session_id"], name: "index_sessions_on_session_id", unique: true, using: :btree end
add_index "sessions", ["updated_at"], name: "index_sessions_on_updated_at", using: :btree
add_index "sessions", ["session_id"], name: "index_sessions_on_session_id", unique: true, using: :btree
create_table "translation_records", force: :cascade do |t| add_index "sessions", ["updated_at"], name: "index_sessions_on_updated_at", using: :btree
t.string "locale"
t.integer "translator_id" create_table "translation_records", force: :cascade do |t|
t.string "key" t.string "locale"
t.text "value" t.integer "translator_id"
t.datetime "created_at" t.string "key"
end t.text "value"
t.date "created_at"
create_table "translations", force: :cascade do |t| end
t.string "locale"
t.string "key" create_table "translations", force: :cascade do |t|
t.text "value" t.string "locale"
t.text "interpolations" t.string "key"
t.boolean "is_proc", default: false t.text "value"
t.datetime "created_at" t.text "interpolations"
t.datetime "updated_at" t.boolean "is_proc", default: false
end t.datetime "created_at"
t.datetime "updated_at"
create_table "user_organization_relationships", force: :cascade do |t| end
t.integer "user_id"
t.integer "organization_id" create_table "user_organization_relationships", force: :cascade do |t|
t.string "relationship" t.integer "user_id"
t.datetime "created_at" t.integer "organization_id"
t.datetime "updated_at" t.string "relationship"
end t.datetime "created_at"
t.datetime "updated_at"
create_table "users", force: :cascade do |t| end
t.string "username"
t.string "email" create_table "users", force: :cascade do |t|
t.string "crypted_password" t.string "username"
t.string "salt" t.string "email"
t.datetime "created_at" t.string "crypted_password"
t.datetime "updated_at" t.string "salt"
t.string "remember_me_token" t.datetime "created_at"
t.datetime "remember_me_token_expires_at" t.datetime "updated_at"
t.string "reset_password_token" t.string "remember_me_token"
t.datetime "reset_password_token_expires_at" t.datetime "remember_me_token_expires_at"
t.datetime "reset_password_email_sent_at" t.string "reset_password_token"
t.string "activation_state" t.datetime "reset_password_token_expires_at"
t.string "activation_token" t.datetime "reset_password_email_sent_at"
t.datetime "activation_token_expires_at" t.string "activation_state"
t.integer "failed_logins_count", default: 0 t.string "activation_token"
t.datetime "lock_expires_at" t.datetime "activation_token_expires_at"
t.string "unlock_token" t.integer "failed_logins_count", default: 0
t.string "avatar" t.datetime "lock_expires_at"
t.text "about_me" t.string "unlock_token"
t.string "role" t.string "avatar"
t.string "firstname" t.text "about_me"
t.string "lastname" t.string "role"
t.boolean "is_translator" t.string "firstname"
t.json "languages" t.string "lastname"
t.string "locale" t.boolean "is_translator"
t.boolean "is_subscribed" t.json "languages"
end t.string "locale"
t.boolean "is_subscribed"
add_index "users", ["activation_token"], name: "index_users_on_activation_token", using: :btree end
add_index "users", ["remember_me_token"], name: "index_users_on_remember_me_token", using: :btree
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", using: :btree add_index "users", ["activation_token"], name: "index_users_on_activation_token", using: :btree
add_index "users", ["remember_me_token"], name: "index_users_on_remember_me_token", using: :btree
create_table "versions", force: :cascade do |t| add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", using: :btree
t.string "item_type"
t.integer "item_id" create_table "versions", force: :cascade do |t|
t.string "event" t.string "item_type"
t.string "whodunnit" t.integer "item_id"
t.text "object" t.string "event"
t.datetime "created_at" t.string "whodunnit"
t.string "value" t.text "object"
end t.datetime "created_at"
t.string "value"
create_table "workshop_facilitators", force: :cascade do |t| end
t.integer "user_id"
t.integer "workshop_id" create_table "workshop_facilitators", force: :cascade do |t|
t.string "role" t.integer "user_id"
t.datetime "created_at" t.integer "workshop_id"
t.datetime "updated_at" t.string "role"
end t.datetime "created_at"
t.datetime "updated_at"
create_table "workshop_interests", force: :cascade do |t| end
t.integer "workshop_id"
t.integer "user_id" create_table "workshop_interests", force: :cascade do |t|
t.datetime "created_at", null: false t.integer "workshop_id"
t.datetime "updated_at", null: false t.integer "user_id"
end t.datetime "created_at", null: false
t.datetime "updated_at", null: false
create_table "workshop_presentation_styles", force: :cascade do |t| end
t.string "name"
t.string "slug" create_table "workshop_presentation_styles", force: :cascade do |t|
t.string "info" t.string "name"
t.datetime "created_at" t.string "slug"
t.datetime "updated_at" t.string "info"
t.integer "order" t.datetime "created_at"
end t.datetime "updated_at"
t.integer "order"
create_table "workshop_requested_resources", force: :cascade do |t| end
t.integer "workshop_id"
t.integer "workshop_resource_id" create_table "workshop_requested_resources", force: :cascade do |t|
t.string "status" t.integer "workshop_id"
t.datetime "created_at" t.integer "workshop_resource_id"
t.datetime "updated_at" t.string "status"
end t.datetime "created_at"
t.datetime "updated_at"
create_table "workshop_resources", force: :cascade do |t| end
t.string "name"
t.string "slug" create_table "workshop_resources", force: :cascade do |t|
t.string "info" t.string "name"
t.datetime "created_at" t.string "slug"
t.datetime "updated_at" t.string "info"
end t.datetime "created_at"
t.datetime "updated_at"
create_table "workshop_streams", force: :cascade do |t| end
t.string "name"
t.string "slug" create_table "workshop_streams", force: :cascade do |t|
t.string "info" t.string "name"
t.datetime "created_at" t.string "slug"
t.datetime "updated_at" t.string "info"
t.integer "order" t.datetime "created_at"
end t.datetime "updated_at"
t.integer "order"
create_table "workshops", force: :cascade do |t| end
t.string "title"
t.string "slug" create_table "workshops", force: :cascade do |t|
t.text "info" t.string "title"
t.integer "conference_id" t.string "slug"
t.integer "workshop_stream_id" t.text "info"
t.integer "workshop_presentation_style" t.integer "conference_id"
t.integer "min_facilitators" t.integer "workshop_stream_id"
t.integer "location_id" t.integer "workshop_presentation_style"
t.datetime "start_time" t.integer "min_facilitators"
t.datetime "end_time" t.integer "location_id"
t.datetime "created_at" t.datetime "start_time"
t.datetime "updated_at" t.datetime "end_time"
t.string "languages" t.datetime "created_at"
t.string "needs" t.datetime "updated_at"
t.string "space" t.string "languages"
t.string "theme" t.string "needs"
t.text "host_info" t.string "space"
t.text "notes" t.string "theme"
t.string "locale" t.text "host_info"
t.integer "event_location_id" t.text "notes"
t.boolean "needs_facilitators" t.string "locale"
t.json "block" t.integer "event_location_id"
end t.boolean "needs_facilitators"
t.json "block"
end end
end

Loading…
Cancel
Save