artfully_ose 1.2.0.pre.9 → 1.2.0.pre.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MGVjMmI2YmJlZWYwYjExYjE4MjhhNjUxNzRjMWNhM2U4ZGQ4ZmY1YQ==
4
+ ZjU5MDg5NmVkZGE5NjhmMGRhZjczMzA1YzE3ZWU4ODJhNWE3NzUwYw==
5
5
  data.tar.gz: !binary |-
6
- NGI3YjdjMTg2ODgwMzk1MDg4MjkzMjIyOTdkYzFhM2JiZWIwZjI0Yg==
6
+ NjczZTg0N2QzODRiMmJhNDAyMTg2ODgzZmRiMjYzOWU5MWE3ZTNmNw==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NjZhZWRlOTRlMDQxNjdhNzVmMmUyOTUwYTc3MTZmZjYwYmM2MjYzYWJlZWEy
10
- ZjZkMzAwN2M4NTc3YTc1MjE5ZTU4YjhlZWNhY2ZjNzIyMTNiMDc3NWM2ZjUx
11
- MDNiNjZmZTMwM2U2NmJkZTZiNmU4NmJlYjkzYzNmNTgwM2EyODE=
9
+ NzA4NzVlZWI2MmY5YjAzYzIxOTAzMTJiZjVmNmZkNTRkNGM4NzM1OWNkMDRk
10
+ NjM0NmYyMzJiODFjNDIyZTUxOWY5MDllOWQwN2Y0NzBiZjAzYzI0NTUwMWMw
11
+ MDgwODk1ZjM3NWE4ZjBmMDliOTZmODBjM2M1NTBmYzM5ZDBhMmQ=
12
12
  data.tar.gz: !binary |-
13
- YTA5YTgwODY5MDdlMjljOWU0YTc4ZWJlZDU0YTc0ODFkOTUzMWFlZmM5Nzk3
14
- MTg5ZDYyMGExOGE1YzU2NGI4YjU4YzA5MmVhZmUxNWE5NzJjMDg3YTAzOTQ5
15
- MzE0MzBiMzE2NDAwZGFjYTNjZjBmMDMyZGQ0ZTAyOTBhMDIyNzI=
13
+ YjJjYWY1NWNhMmE3ZWM1YjBlYzZjYmQxNDczODAwZmEyYzc5NjM4YzI2OTRm
14
+ MmRkN2JlNDgyZTE0MWEyNzRhMjBmZWY2NGU2OTU0YWNmMjhlOThkNDQzZGYx
15
+ NTMyMWE3ZWExYTg4NzI3MTM4YmE4OGNiZThkNjJlZmIzMTIxNzk=
@@ -207,8 +207,8 @@ $(document).ready(function() {
207
207
  });
208
208
 
209
209
  $(document).locationSelector({
210
- 'countryField' : '#user_user_memberships_attributes_0_organization_attributes_country',
211
- 'regionField' : '#user_user_memberships_attributes_0_organization_attributes_state'
210
+ 'countryField' : '#user_organization_country',
211
+ 'regionField' : '#user_organization_state'
212
212
  });
213
213
 
214
214
  $(document).locationSelector({
@@ -523,7 +523,12 @@ function activateControls() {
523
523
  });
524
524
  });
525
525
 
526
+ $(".datepicker-alt-field" ).datepicker({
527
+ dateFormat: 'yy-mm-dd',
528
+ altField: '#ends_at'
529
+ });
526
530
  $(".datepicker" ).datepicker({dateFormat: 'yy-mm-dd'});
531
+
527
532
  if (!Modernizr.inputtypes.date) {
528
533
  $('input[type="date"]').datepicker({
529
534
  dateFormat: 'yy-mm-dd'
@@ -1,10 +1,12 @@
1
1
  class ArtfullyOseController < ActionController::Base
2
+ include Ext::Integrations::ArtfullyOseController
2
3
 
3
4
  protect_from_forgery
4
5
 
5
6
  before_filter :authenticate_user!
6
7
  layout :specify_layout
7
8
  after_filter :set_csrf_cookie_for_angular
9
+ before_filter :require_more_info
8
10
 
9
11
  delegate :current_organization, :to => :current_user
10
12
 
@@ -75,4 +77,17 @@ class ArtfullyOseController < ActionController::Base
75
77
  def set_csrf_cookie_for_angular
76
78
  cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
77
79
  end
80
+
81
+ def require_more_info
82
+ if need_more_info?
83
+ flash[:info] = "We need to collect more information about your organization before you continue."
84
+ redirect_to collect_info_signups_path
85
+ end
86
+ end
87
+
88
+ def keep_page_from_caching
89
+ response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
90
+ response.headers["Pragma"] = "no-cache"
91
+ response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
92
+ end
78
93
  end
@@ -1,5 +1,5 @@
1
1
  class Store::MembershipsController < Store::StoreController
2
2
  def index
3
- @membership_types = store_organization.membership_types.on_sale
3
+ @membership_types = store_organization.membership_types.storefront
4
4
  end
5
5
  end
@@ -2,11 +2,14 @@ module Ext
2
2
  module Integrations
3
3
  module Member
4
4
  end
5
-
5
+
6
6
  module User
7
+ def need_more_info?
8
+ false
9
+ end
7
10
  end
8
-
9
- module Kit
11
+
12
+ module Kit
10
13
  def record_activation
11
14
  end
12
15
 
@@ -24,11 +27,11 @@ module Ext
24
27
  .includes(:sections => :ticket_types)
25
28
  .where('shows.id = ?', self.id)
26
29
  .where("ticket_types.#{channel} = ?", true)
27
-
30
+
28
31
  chart.first
29
32
  end
30
33
  end
31
-
34
+
32
35
  module Organization
33
36
  def self.included(base)
34
37
  base.class_eval do
@@ -42,11 +45,11 @@ module Ext
42
45
  end
43
46
  end
44
47
  end
45
-
48
+
46
49
  def connected?
47
50
  false
48
- end
49
-
51
+ end
52
+
50
53
  def fsp
51
54
  nil
52
55
  end
@@ -69,37 +72,37 @@ module Ext
69
72
  def name_for_donations
70
73
  self.name
71
74
  end
72
-
75
+
73
76
  def update_kits
74
77
  end
75
78
 
76
79
  def sponsored_kit
77
80
  nil
78
81
  end
79
-
82
+
80
83
  def shows_with_sales
81
84
  raise "Just use shows"
82
85
  end
83
86
  end
84
-
87
+
85
88
  module Order
86
89
  def self.included(base)
87
90
  base.extend ClassMethods
88
91
  end
89
-
92
+
90
93
  def fa_id
91
94
  nil
92
95
  end
93
-
96
+
94
97
  module ClassMethods
95
- def sale_search(search)
98
+ def sale_search(search)
96
99
  standard = ::Order.includes(:items => { :show => :event })
97
100
 
98
- if search.start
101
+ if search.start
99
102
  standard = standard.after(search.start)
100
103
  end
101
104
 
102
- if search.stop
105
+ if search.stop
103
106
  standard = standard.before(search.stop)
104
107
  end
105
108
 
@@ -115,7 +118,7 @@ module Ext
115
118
 
116
119
  standard.all
117
120
  end
118
- end
121
+ end
119
122
  end
120
123
 
121
124
  module Ticket
@@ -128,17 +131,24 @@ module Ext
128
131
  def record_comp
129
132
  end
130
133
  end
131
-
134
+
132
135
  module Event
133
136
  def shows_with_sales(seller)
134
137
  raise "Just use shows"
135
138
  end
136
139
  end
137
-
140
+
138
141
  module Item
139
142
  def settlement_issued?
140
143
  false
141
144
  end
142
145
  end
146
+
147
+ module ArtfullyOseController
148
+ def need_more_info?
149
+ current_user.try(:need_more_info?)
150
+ end
151
+ private :need_more_info?
152
+ end
143
153
  end
144
154
  end
data/app/models/import.rb CHANGED
@@ -73,9 +73,9 @@ class Import < ActiveRecord::Base
73
73
  #
74
74
  # This composes errors thrown *during* the import. For validation errors, see invalidate!
75
75
  #
76
- def fail!(error = nil, row = nil, row_num = 0)
76
+ def fail!(error, row = nil, row_num = 0)
77
77
  Rails.logger.error "IMPORT ERROR [#{self.id}]: #{error.message}"
78
- error.backtrace.each { |line| Rails.logger.error " #{line}" }
78
+ error.backtrace.each { |line| Rails.logger.error " #{line}" } if error.backtrace
79
79
  self.import_errors.create! :row_data => row, :error_message => "Row #{row_num}: #{error.message}"
80
80
  failed!
81
81
  rollback
@@ -169,24 +169,23 @@ class Import < ActiveRecord::Base
169
169
  person.skip_commit = true
170
170
  person
171
171
  end
172
-
172
+
173
173
  def create_person(parsed_row)
174
- Rails.logger.info("Import #{id} DONATION_IMPORT: Creating person")
175
- if !parsed_row.email.blank?
176
- person = Person.first_or_create({:email => parsed_row.email, :organization => self.organization}.merge(parsed_row.person_attributes), {}) do |p|
177
- p.import = self
178
- end
179
- else
180
- person = attach_person(parsed_row)
181
- if !person.save
182
- Rails.logger.info("Import #{id} DONATION_IMPORT: Person save failed")
183
- self.import_errors.create! :row_data => parsed_row.row, :error_message => person.errors.full_messages.join(", ")
184
- self.reload
185
- fail!
186
- end
187
- end
188
- person
189
- end
174
+ if !attach_person(parsed_row).naming_details_available?
175
+ person = self.organization.dummy
176
+ elsif !parsed_row.email.blank?
177
+ person = Person.first_or_create({:email => parsed_row.email, :organization => self.organization}.merge(parsed_row.person_attributes), {}) do |p|
178
+ p.import = self
179
+ end
180
+ else
181
+ person = attach_person(parsed_row)
182
+ if !person.save
183
+ self.reload
184
+ fail!(RowError.new(person.errors.full_messages.join(", ")), parsed_row.row)
185
+ end
186
+ end
187
+ person
188
+ end
190
189
 
191
190
  class RowError < ArgumentError
192
191
  end
@@ -33,10 +33,8 @@ class MailchimpSyncJob < Struct.new(:mailchimp_kit, :options)
33
33
  mailchimp_kit.sync_merged_winner_to_mailchimp(options[:winner_id], options[:new_lists])
34
34
  end
35
35
 
36
- #
37
- # Noop. We don't respond to this yet.
38
- #
39
36
  def webhook_cleaned
37
+ mailchimp_kit.sync_mailchimp_webhook_cleaned(list_id, data)
40
38
  end
41
39
 
42
40
  def webhook_subscribe
@@ -253,6 +253,16 @@ class MailchimpKit < Kit
253
253
  person
254
254
  end
255
255
 
256
+ def sync_mailchimp_webhook_cleaned(list_id, data)
257
+ person = organization.people.find_by_email(data["email"])
258
+ return if person.nil?
259
+
260
+ reason = (data["reason"] == "hard" ? "a hard bounce" : "abuse")
261
+ person.subscribed_lists.delete(list_id)
262
+ person.new_note("MailChimp cleaned #{person.email} from #{list_name(list_id)} because of #{reason}.", Time.now, nil, organization_id)
263
+ puts person.save
264
+ end
265
+
256
266
  def sync_mailchimp_webhook_update_person_email(list_id, data)
257
267
  person = organization.people.find_by_email(data["old_email"])
258
268
  return if person.nil? || person.do_not_email?
@@ -277,12 +287,7 @@ class MailchimpKit < Kit
277
287
  def sync_mailchimp_webhook_member_unsubscribe(list_id, data)
278
288
  person = organization.people.find_by_email(data["email"])
279
289
  return unless person
280
- note = person.notes.build({
281
- :text => "Unsubscribed in MailChimp from #{list_name(list_id)}",
282
- :occurred_at => Time.now
283
- })
284
- note.organization_id = organization_id
285
- note.save
290
+ person.new_note("Unsubscribed in MailChimp from #{list_name(list_id)}", Time.now, nil, organization_id)
286
291
  person.subscribed_lists.delete(list_id)
287
292
  person.save
288
293
  end
@@ -1,7 +1,7 @@
1
1
  class MembershipType < ActiveRecord::Base
2
2
  attr_accessible :name, :price, :fee, :number_of_shows,
3
3
  :plan, :on_sale, :description, :ends_at,
4
- :starts_at, :duration, :type, :period, :number_of_tickets
4
+ :starts_at, :duration, :type, :period, :number_of_tickets, :sales_start_at, :sales_end_at
5
5
 
6
6
  belongs_to :organization
7
7
  has_many :memberships
@@ -11,6 +11,8 @@ class MembershipType < ActiveRecord::Base
11
11
  after_create :create_list_segment
12
12
 
13
13
  default_scope order("created_at DESC")
14
+
15
+ scope :storefront, where(:on_sale => true).where("sales_start_at < ? or sales_start_at is null", DateTime.now).where("sales_end_at > ? or sales_end_at is null", DateTime.now)
14
16
  scope :on_sale, where(:on_sale => true)
15
17
 
16
18
  def membershipize
@@ -23,7 +23,7 @@ class Organization < ActiveRecord::Base
23
23
  has_many :members
24
24
  has_many :searches
25
25
 
26
- has_many :users, :through => :user_memberships
26
+ has_many :users, :through => :user_memberships, :order => 'user_memberships.owner desc'
27
27
  has_many :kits, :before_add => :check_for_duplicates,
28
28
  :after_add => lambda { |u,k| k.activate! unless k.activated? }
29
29
 
@@ -52,7 +52,7 @@ class Organization < ActiveRecord::Base
52
52
  # Returns Tag objects. For an array of tag strings, call unique_tag_strings_for
53
53
  #
54
54
  # This has been supersceded by tags_on and tag_counts_on in acts_as_taggable_on
55
- # But those methods have not been added to a release yet.
55
+ # But those methods have not been added to an acts_as_taggable_on release yet.
56
56
  #
57
57
  def tags_for(tagged_association)
58
58
 
@@ -75,8 +75,19 @@ class Organization < ActiveRecord::Base
75
75
  self.tags_for(tagged_association).all.map(&:name).uniq
76
76
  end
77
77
 
78
+ #
79
+ # Will promote user to owner and demote any other owners
80
+ #
81
+ def make_owner(user)
82
+ UserMembership.promote(user, self)
83
+ end
84
+
85
+ def previous_owner
86
+ users.order('user_memberships.id asc').first
87
+ end
88
+
78
89
  def owner
79
- users.first
90
+ @owner ||= UserMembership.includes(:user).where(:organization_id => self.id).where(:owner => true).first.try(:user)
80
91
  end
81
92
 
82
93
  def dummy
data/app/models/person.rb CHANGED
@@ -364,7 +364,7 @@ class Person < ActiveRecord::Base
364
364
  :text => text,
365
365
  :occurred_at => Time.now
366
366
  })
367
- note.user_id = user.id
367
+ note.user_id = user.id if user
368
368
  note.organization_id = organization_id
369
369
  note.save
370
370
  note
@@ -14,14 +14,17 @@ class TicketSummary
14
14
  end
15
15
 
16
16
  class TicketSummary::Row
17
- attr_accessor :show, :tickets
17
+ attr_accessor :show, :tickets, :ticket_type_hash
18
18
 
19
19
  def initialize
20
20
  @tickets = []
21
+ @ticket_type_hash = {}
21
22
  end
22
23
 
23
24
  def <<(ticket)
24
25
  @tickets << ticket
26
+ @ticket_type_hash[ticket.ticket_type] ||= []
27
+ @ticket_type_hash[ticket.ticket_type] << tickets
25
28
  @show = ticket.show
26
29
  self
27
30
  end
data/app/models/user.rb CHANGED
@@ -1,4 +1,4 @@
1
- class User < ActiveRecord::Base
1
+ class User < ActiveRecord::Base
2
2
 
3
3
  include Ext::DeviseConfiguration
4
4
  include Ext::Integrations::User
@@ -11,8 +11,6 @@
11
11
  has_many :user_memberships
12
12
  has_many :organizations, :through => :user_memberships
13
13
 
14
- accepts_nested_attributes_for :user_memberships
15
-
16
14
  scope :logged_in_more_than_once, where("users.sign_in_count > 1")
17
15
 
18
16
  def self.generate_password
@@ -8,4 +8,20 @@ class UserMembership < ActiveRecord::Base
8
8
  accepts_nested_attributes_for :organization
9
9
 
10
10
  validates :user_id, :uniqueness => {:scope => :organization_id}
11
+
12
+ #
13
+ # Will promote new_owner to admin and demote any other owners
14
+ #
15
+ def self.promote(new_owner, organization)
16
+
17
+ @user_membership = UserMembership.where(:user_id => new_owner.id, :organization_id => organization.id).first
18
+
19
+ return false if @user_membership.nil?
20
+
21
+ @user_membership.transaction do
22
+ UserMembership.where(:organization_id => organization.id).update_all(:owner => false)
23
+ @user_membership.owner = true
24
+ return @user_membership.save
25
+ end
26
+ end
11
27
  end
@@ -31,6 +31,8 @@
31
31
  =f.label :description, "Description", :class => 'control-label'
32
32
  .controls
33
33
  =f.text_area :description, :class => 'span4', :size => '10x2'
34
+ %p.muted
35
+ This description will appear on your storefront as well as on patron receipts.
34
36
 
35
37
  .control-group
36
38
  =f.label :availablity, "Availablity", :class => 'control-label'
@@ -25,6 +25,14 @@
25
25
 
26
26
  =render "membership_types/#{@membership_type.class.name.underscore}_form", :f => f
27
27
 
28
+ .control-group
29
+ = f.label :fee, "Sales Start", :class => 'control-label'
30
+ .controls
31
+ = f.text_field :sales_start_at, :value => "#{l @membership_type.sales_start_at, :format => :date_for_input}", :class => :datepicker
32
+ .control-group
33
+ = f.label :fee, "Sales End", :class => 'control-label'
34
+ .controls
35
+ = f.text_field :sales_end_at, :value => "#{l @membership_type.sales_end_at, :format => :date_for_input}", :class => :datepicker
28
36
 
29
37
  .control-group
30
38
  = f.label :on_sale, "On Sale", :class => 'control-label checkbox'
@@ -36,4 +44,4 @@
36
44
 
37
45
  -content_for :custom_js do
38
46
  :javascript
39
- touchCurrency();
47
+ $(document).ready(function() { touchCurrency(); })
@@ -1,8 +1,8 @@
1
1
  .control-group
2
2
  = f.label :starts_at, "Mebership Begins", :class => 'control-label'
3
3
  .controls
4
- = f.text_field :starts_at, :class => :datepicker
4
+ = f.text_field :starts_at, :value => "#{l @membership_type.starts_at, :format => :date_for_input}", :class => :datepicker
5
5
  .control-group
6
6
  = f.label :ends_at, "Membership Ends", :class => 'control-label'
7
7
  .controls
8
- = f.text_field :ends_at, :class => :datepicker
8
+ = f.text_field :ends_at, :value => "#{l @membership_type.ends_at, :format => :date_for_input}", :class => :datepicker
@@ -13,7 +13,7 @@
13
13
  %th.right Tickets
14
14
  %th.right Price
15
15
  %th.right Fee
16
- %th.right On Sale
16
+ %th.right On Storefront
17
17
  -@membership_types.each do |membership_type|
18
18
  %tr
19
19
  %td=link_to membership_type.name, edit_membership_type_path(membership_type)
@@ -56,7 +56,8 @@
56
56
  .control-group
57
57
  %label Change the expiration of these memberships to:
58
58
  .controls
59
- =text_field_tag "ends_at", "", :class => "datepicker"
59
+ .datepicker-alt-field
60
+ =hidden_field_tag "ends_at", ""
60
61
  .modal-footer
61
62
  =submit_tag "Change Expiration", :class => "btn btn-success"
62
63
  =link_to "Cancel", "#", :class => "btn btn-danger", 'data-dismiss'=>'modal'
@@ -17,15 +17,11 @@
17
17
  = "Service fee: $#{format("%.2f", (@order.service_fee.to_i/100.0))}"
18
18
  %br
19
19
 
20
- %p="==================="
21
-
22
20
  - unless @order.tickets.empty?
23
- %h4 Tickets
24
21
  - @order.ticket_summary.rows.each do |row|
25
22
  %p
26
- =row.show.event.name
27
- %br
28
- =l row.show.datetime_local_to_event
23
+ %h4=row.show.event.name
24
+ =l row.show.datetime_local_to_event, :format => :long_with_day
29
25
  %br
30
26
  -unless row.show.event.contact_email.blank?
31
27
  ="Event contact email: #{row.show.event.contact_email}"
@@ -33,19 +29,20 @@
33
29
  -unless row.show.event.contact_phone.blank?
34
30
  ="Event contact phone: #{row.show.event.contact_phone}"
35
31
  %br
36
- %br
37
- ="#{row.show.event.venue.name}"
38
- %br
39
- -unless row.show.event.venue.street_as_string.blank?
40
- ="#{row.show.event.venue.street_as_string}"
41
- %br
42
- -unless row.show.event.venue.city_state_zip_as_string.blank?
43
- ="#{row.show.event.venue.city_state_zip_as_string}"
44
- %br
45
- %ul.ticket-list
46
- - row.tickets.each do |ticket|
47
- %li
48
- %span.price= "#{ticket.ticket_type.name}: $#{format("%.2f", (ticket.price/100.0))}"
32
+ -row.ticket_type_hash.keys.each do |ticket_type|
33
+ %ul.ticket-list
34
+ -ticket_type.tickets.each do |ticket|
35
+ %li
36
+ %span.price= "#{ticket.ticket_type.name}: $#{format("%.2f", (ticket.sold_price/100.0))}"
37
+ %li{:style => 'list-style-type:none'}=ticket_type.description
38
+
39
+ =link_to image_tag("https://maps.google.com/maps/api/staticmap?size=240x140&maptype=roadmap&markers=color:red|#{row.show.event.venue.address_as_url_query}&sensor=false&zoom=15"), "https://maps.google.com/maps?q=#{row.show.event.venue.address_as_url_query.html_safe}&z=15"
40
+ %div
41
+ %strong=row.show.event.venue.name
42
+ %div=row.show.event.venue.address1
43
+ -unless row.show.event.venue.address2.blank?
44
+ %div=row.show.event.venue.address2
45
+ %div=row.show.event.venue.city_state_zip_as_string
49
46
 
50
47
  - unless @order.donations.empty?
51
48
  %h4 Donations
@@ -54,3 +51,4 @@
54
51
  %li
55
52
  %span.price= "$#{format("%.2f", (item.price/100.00))}:"
56
53
  %span.name= "Donation to #{@order.organization.name_for_donations}"
54
+
@@ -27,9 +27,12 @@ Order confirmation
27
27
  -unless row.show.event.venue.street_as_string.blank?
28
28
  ="#{row.show.event.venue.street_as_string}"
29
29
  -unless row.show.event.venue.city_state_zip_as_string.blank?
30
- ="#{row.show.event.venue.city_state_zip_as_string}"
31
- - row.tickets.each do |ticket|
32
- = "- #{ticket.ticket_type.name}: $#{format("%.2f", (ticket.price/100.0))}"
30
+ ="#{row.show.event.venue.city_state_zip_as_string}"
31
+
32
+ -row.ticket_type_hash.keys.each do |ticket_type|
33
+ -ticket_type.tickets.each do |ticket|
34
+ = "#{ticket.ticket_type.name}: $#{format("%.2f", (ticket.sold_price/100.0))}"
35
+ =ticket_type.description
33
36
 
34
37
 
35
38
 
@@ -0,0 +1,14 @@
1
+ class AddAdminToUserMemberships < ActiveRecord::Migration
2
+ def change
3
+ add_column :user_memberships, :owner, :boolean, :default => 0
4
+
5
+ Organization.find_each(:include => :users) do |organization|
6
+ if organization.users.empty?
7
+ puts "Organization [#{organization.id}] has no owner"
8
+ else
9
+ puts "#{organization.id},#{organization.users.first.id}"
10
+ organization.make_owner(organization.previous_owner)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ class AddSalesStartToMembershipTyp < ActiveRecord::Migration
2
+ def change
3
+ add_column :membership_types, :sales_start_at, :datetime
4
+ add_column :membership_types, :sales_end_at, :datetime
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
1
  module ArtfullyOse
2
- VERSION = "1.2.0.pre.9"
2
+ VERSION = "1.2.0.pre.10"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: artfully_ose
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0.pre.9
4
+ version: 1.2.0.pre.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artful.ly
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-15 00:00:00.000000000 Z
11
+ date: 2013-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -2400,6 +2400,8 @@ files:
2400
2400
  - db/migrate/20131013144010_add_type_to_membership_type.rb
2401
2401
  - db/migrate/20131013150230_add_duration_to_membership_type.rb
2402
2402
  - db/migrate/20131013192807_change_number_of_shows_to_tickets.rb
2403
+ - db/migrate/20131023200559_add_admin_to_user_memberships.rb
2404
+ - db/migrate/20131029173612_add_sales_start_to_membership_typ.rb
2403
2405
  - lib/artfully_ose/common_abilities.rb
2404
2406
  - lib/artfully_ose/core_ext.rb
2405
2407
  - lib/artfully_ose/engine.rb