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

Sign up to get free protection for your applications and to get access to all the features.
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