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 +8 -8
- data/app/assets/javascripts/application.js +7 -2
- data/app/controllers/artfully_ose_controller.rb +15 -0
- data/app/controllers/store/memberships_controller.rb +1 -1
- data/app/models/ext/integrations.rb +29 -19
- data/app/models/import.rb +18 -19
- data/app/models/job/mailchimp_sync_job.rb +1 -3
- data/app/models/kits/mailchimp_kit.rb +11 -6
- data/app/models/membership_type.rb +3 -1
- data/app/models/organization.rb +14 -3
- data/app/models/person.rb +1 -1
- data/app/models/ticket_summary.rb +4 -1
- data/app/models/user.rb +1 -3
- data/app/models/user_membership.rb +16 -0
- data/app/views/events/_ticket_type_fields.html.haml +2 -0
- data/app/views/membership_types/_form.html.haml +9 -1
- data/app/views/membership_types/_seasonal_membership_type_form.html.haml +2 -2
- data/app/views/membership_types/index.html.haml +1 -1
- data/app/views/memberships/index.html.haml +2 -1
- data/app/views/order_mailer/confirmation_for.html.haml +17 -19
- data/app/views/order_mailer/confirmation_for.text.haml +6 -3
- data/db/migrate/20131023200559_add_admin_to_user_memberships.rb +14 -0
- data/db/migrate/20131029173612_add_sales_start_to_membership_typ.rb +6 -0
- data/lib/artfully_ose/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZjU5MDg5NmVkZGE5NjhmMGRhZjczMzA1YzE3ZWU4ODJhNWE3NzUwYw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NjczZTg0N2QzODRiMmJhNDAyMTg2ODgzZmRiMjYzOWU5MWE3ZTNmNw==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NzA4NzVlZWI2MmY5YjAzYzIxOTAzMTJiZjVmNmZkNTRkNGM4NzM1OWNkMDRk
|
10
|
+
NjM0NmYyMzJiODFjNDIyZTUxOWY5MDllOWQwN2Y0NzBiZjAzYzI0NTUwMWMw
|
11
|
+
MDgwODk1ZjM3NWE4ZjBmMDliOTZmODBjM2M1NTBmYzM5ZDBhMmQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YjJjYWY1NWNhMmE3ZWM1YjBlYzZjYmQxNDczODAwZmEyYzc5NjM4YzI2OTRm
|
14
|
+
MmRkN2JlNDgyZTE0MWEyNzRhMjBmZWY2NGU2OTU0YWNmMjhlOThkNDQzZGYx
|
15
|
+
NTMyMWE3ZWExYTg4NzI3MTM4YmE4OGNiZThkNjJlZmIzMTIxNzk=
|
@@ -207,8 +207,8 @@ $(document).ready(function() {
|
|
207
207
|
});
|
208
208
|
|
209
209
|
$(document).locationSelector({
|
210
|
-
'countryField' : '#
|
211
|
-
'regionField' : '#
|
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
|
@@ -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
|
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
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
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
|
-
|
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
|
data/app/models/organization.rb
CHANGED
@@ -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
|
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
|
-
|
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
@@ -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
|
-
|
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
|
@@ -56,7 +56,8 @@
|
|
56
56
|
.control-group
|
57
57
|
%label Change the expiration of these memberships to:
|
58
58
|
.controls
|
59
|
-
|
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
|
-
|
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
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
%
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
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
|
-
|
32
|
-
|
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
|
data/lib/artfully_ose/version.rb
CHANGED
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.
|
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-
|
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
|