artfully_ose 1.2.0.pre.4 → 1.2.0.pre.5
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 +8 -8
- data/app/assets/images/household-default-avatar.png +0 -0
- data/app/assets/images/person-default-avatar.psd +0 -0
- data/app/assets/javascripts/angular-resource.min.js +11 -0
- data/app/assets/javascripts/angular.min.js +178 -0
- data/app/assets/javascripts/application.js +43 -4
- data/app/assets/javascripts/store/store.js +5 -4
- data/app/assets/stylesheets/application.sass +6 -0
- data/app/assets/stylesheets/bootstrap-overrides.css +12 -2
- data/app/assets/stylesheets/sass/store.sass +42 -7
- data/app/controllers/artfully_ose_controller.rb +2 -7
- data/app/controllers/events_controller.rb +3 -21
- data/app/controllers/memberships_controller.rb +1 -0
- data/app/controllers/organizations_controller.rb +3 -3
- data/app/controllers/store/events_controller.rb +2 -0
- data/app/helpers/artfully_ose_helper.rb +6 -0
- data/app/models/action.rb +1 -1
- data/app/models/event.rb +5 -7
- data/app/models/kit.rb +1 -3
- data/app/models/membership.rb +3 -3
- data/app/models/membership_award.rb +1 -0
- data/app/models/note.rb +1 -1
- data/app/models/order_handler.rb +1 -2
- data/app/models/organization.rb +7 -8
- data/app/models/user.rb +16 -4
- data/app/models/user_membership.rb +4 -3
- data/app/views/imports/people/_new.html.haml +5 -5
- data/app/views/layouts/_flash.html.haml +1 -1
- data/app/views/layouts/application.html.haml +2 -2
- data/app/views/layouts/devise_layout.html.haml +2 -2
- data/app/views/membership_awards/confirm.html.haml +48 -2
- data/app/views/membership_awards/new.html.haml +12 -7
- data/app/views/memberships/index.html.haml +98 -38
- data/app/views/organizations/_connection_form.html.haml +1 -1
- data/app/views/organizations/_form.html.haml +52 -20
- data/app/views/organizations/edit.html.haml +2 -2
- data/app/views/producer_mailer/donation_kit_notification.html.haml +8 -0
- data/app/views/producer_mailer/donation_kit_notification.text.erb +8 -0
- data/app/views/producer_mailer/mailchimp_kit_initial_sync_notification.html.haml +21 -0
- data/app/views/producer_mailer/ticket_offer_accepted.html.haml +7 -0
- data/app/views/producer_mailer/ticket_offer_accepted.text.erb +7 -0
- data/app/views/producer_mailer/ticket_offer_rejected.html.haml +11 -0
- data/app/views/producer_mailer/ticket_offer_rejected.text.erb +13 -0
- data/app/views/shared/_error_messages.html.haml +1 -1
- data/app/views/store/events/_venue.html.haml +7 -0
- data/app/views/store/events/show.html.haml +6 -11
- data/app/views/store/events/single_show.html.haml +41 -0
- data/app/views/store/shared/_donate_form.html.haml +1 -1
- data/app/views/store/shows/_show.html.haml +37 -29
- data/app/views/user_memberships/_list.html.haml +1 -3
- data/app/views/users/invitations/edit.html.haml +57 -8
- data/app/views/users/mailer/invitation_instructions.html.haml +14 -0
- data/app/views/users/passwords/edit.html.haml +2 -2
- data/app/views/users/registrations/edit.html.erb +3 -3
- data/app/views/users/sessions/new.html.haml +2 -2
- data/config/initializers/devise.rb +0 -3
- data/config/locales/devise.en.yml +1 -1
- data/config/routes.rb +4 -2
- data/db/migrate/20130411162346_add_country_zip_state_phone_number_discipline_to_organizations.rb +9 -0
- data/db/migrate/20130412184415_add_first_name_and_last_name_to_users.rb +6 -0
- data/lib/artfully_ose/version.rb +1 -1
- metadata +17 -17
- data/app/views/users/mailer/invitation_instructions.html.erb +0 -8
@@ -23,7 +23,7 @@ class EventsController < ArtfullyOseController
|
|
23
23
|
|
24
24
|
def index
|
25
25
|
authorize! :view, Event
|
26
|
-
@events = current_organization.events.includes(:shows, :
|
26
|
+
@events = current_organization.events.includes(:shows, :tickets).order('updated_at DESC')
|
27
27
|
end
|
28
28
|
|
29
29
|
def show
|
@@ -52,7 +52,7 @@ class EventsController < ArtfullyOseController
|
|
52
52
|
def edit
|
53
53
|
authorize! :edit, @event
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
def image
|
57
57
|
authorize! :edit, @event
|
58
58
|
end
|
@@ -103,28 +103,10 @@ class EventsController < ArtfullyOseController
|
|
103
103
|
|
104
104
|
def wp_plugin
|
105
105
|
end
|
106
|
-
|
107
|
-
def prices
|
108
|
-
end
|
109
106
|
|
110
|
-
def
|
111
|
-
find_event
|
107
|
+
def prices
|
112
108
|
end
|
113
109
|
|
114
|
-
def temp_discount_form
|
115
|
-
find_event
|
116
|
-
|
117
|
-
@discount = TempDiscount.new
|
118
|
-
@discount.promotion_type = 'two-for-one'
|
119
|
-
|
120
|
-
@event.charts.collect(&:sections).flatten.each do |section|
|
121
|
-
@discount.discount_sections.new(
|
122
|
-
:section => section,
|
123
|
-
:price => section.price
|
124
|
-
)
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
110
|
def messages
|
129
111
|
end
|
130
112
|
|
@@ -22,7 +22,7 @@ class OrganizationsController < ArtfullyOseController
|
|
22
22
|
flash[:error] = "You can only join one organization at this time."
|
23
23
|
redirect_to organizations_url
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
if Organization.all.length > 0
|
27
27
|
flash[:error] = "There is already an organization created for this installation."
|
28
28
|
end
|
@@ -35,7 +35,7 @@ class OrganizationsController < ArtfullyOseController
|
|
35
35
|
flash[:error] = "There is already an organization created for this installation."
|
36
36
|
redirect_to new_organization_path and return
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
@organization = Organization.new(params[:organization])
|
40
40
|
|
41
41
|
if @organization.save
|
@@ -61,5 +61,5 @@ class OrganizationsController < ArtfullyOseController
|
|
61
61
|
else
|
62
62
|
render :show
|
63
63
|
end
|
64
|
-
end
|
64
|
+
end
|
65
65
|
end
|
@@ -2,9 +2,11 @@ class Store::EventsController < Store::StoreController
|
|
2
2
|
def show
|
3
3
|
session[:last_event_id] = params[:id]
|
4
4
|
@event = Event.storefront_find(params[:id], current_member)
|
5
|
+
render (@event.single_show? ? :single_show : :show)
|
5
6
|
end
|
6
7
|
|
7
8
|
def index
|
8
9
|
@events = Event.for_storefront(@store_organization, current_member)
|
10
|
+
@events = []
|
9
11
|
end
|
10
12
|
end
|
@@ -42,6 +42,12 @@ module ArtfullyOseHelper
|
|
42
42
|
"#{time_ago_in_words(t)} #{qualifier}"
|
43
43
|
end
|
44
44
|
|
45
|
+
def clean_full_error_messages(errors)
|
46
|
+
string = errors.full_messages.collect {|m| m.downcase.gsub(/.*organization/, 'organization')}.to_sentence
|
47
|
+
string = string.slice(0,1).capitalize + string.slice(1..-1)
|
48
|
+
string = string + "."
|
49
|
+
end
|
50
|
+
|
45
51
|
#
|
46
52
|
# For use with the nav-pills to select an intem based on a current selection
|
47
53
|
# Will protect against nil by using try on the object
|
data/app/models/action.rb
CHANGED
data/app/models/event.rb
CHANGED
@@ -68,16 +68,14 @@ class Event < ActiveRecord::Base
|
|
68
68
|
update_attribute(:deleted_at, Time.now)
|
69
69
|
end
|
70
70
|
|
71
|
-
def
|
72
|
-
|
73
|
-
event_rel = event_rel.where(:members_only => false) if member.nil?
|
74
|
-
event_rel.all
|
71
|
+
def single_show?
|
72
|
+
shows.length == 1
|
75
73
|
end
|
76
74
|
|
77
|
-
def self.
|
78
|
-
event_rel = Event.
|
75
|
+
def self.for_storefront(member = nil)
|
76
|
+
event_rel = Event.joins(:shows).where(:organization_id => organization.id).where('shows.datetime > ?', DateTime.now).group(:event_id).public
|
79
77
|
event_rel = event_rel.where(:members_only => false) if member.nil?
|
80
|
-
event_rel.
|
78
|
+
event_rel.all
|
81
79
|
end
|
82
80
|
|
83
81
|
def destroyable?
|
data/app/models/kit.rb
CHANGED
@@ -28,8 +28,6 @@ class Kit < ActiveRecord::Base
|
|
28
28
|
event(:activate_without_pending) { transitions :from => [:fresh, :pending, :cancelled], :to => :activated }
|
29
29
|
end
|
30
30
|
|
31
|
-
|
32
|
-
|
33
31
|
if self.requires_approval
|
34
32
|
state_machine do
|
35
33
|
event(:submit_for_approval) { transitions :from => :fresh, :to => :pending }
|
@@ -39,7 +37,7 @@ class Kit < ActiveRecord::Base
|
|
39
37
|
class_eval(&block)
|
40
38
|
self
|
41
39
|
end
|
42
|
-
|
40
|
+
|
43
41
|
def self.activate(options)
|
44
42
|
activation_requirements[:unless] << options.delete(:unless) if options.has_key?(:unless)
|
45
43
|
activation_requirements[:if] << options.delete(:if) if options.has_key?(:if)
|
data/app/models/membership.rb
CHANGED
@@ -20,7 +20,7 @@ class Membership < ActiveRecord::Base
|
|
20
20
|
membership_award.people.each do |people|
|
21
21
|
Rails.logger.debug(" MEMBERSHIP FOR #{people}")
|
22
22
|
membership = Membership.for(membership_award.membership_type)
|
23
|
-
membership.ends_at =
|
23
|
+
membership.ends_at = membership_award.ends_at
|
24
24
|
membership.sold_price = membership_award.sold_price
|
25
25
|
|
26
26
|
# create order
|
@@ -38,7 +38,7 @@ class Membership < ActiveRecord::Base
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def cart_price
|
41
|
-
price
|
41
|
+
price
|
42
42
|
end
|
43
43
|
|
44
44
|
def self.realized_fee
|
@@ -61,4 +61,4 @@ class Membership < ActiveRecord::Base
|
|
61
61
|
self.membership_type.name
|
62
62
|
end
|
63
63
|
|
64
|
-
end
|
64
|
+
end
|
data/app/models/note.rb
CHANGED
data/app/models/order_handler.rb
CHANGED
@@ -37,7 +37,6 @@ class OrderHandler
|
|
37
37
|
@discount = nil
|
38
38
|
self.cart.tickets.each do |ticket|
|
39
39
|
@discount = Discount.find_by_code_and_event_id(params[:discount].upcase, ticket.show.event.id)
|
40
|
-
Rails.logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #{@discount}")
|
41
40
|
unless @discount.nil?
|
42
41
|
@discount.apply_discount_to_cart(self.cart)
|
43
42
|
break
|
@@ -64,7 +63,7 @@ class OrderHandler
|
|
64
63
|
if params[:donation_amount]
|
65
64
|
self.cart.clear_donations
|
66
65
|
if params[:donation_amount].to_i == 0
|
67
|
-
|
66
|
+
self.error = "Please enter a donation amount."
|
68
67
|
return
|
69
68
|
end
|
70
69
|
|
data/app/models/organization.rb
CHANGED
@@ -3,9 +3,9 @@ class Organization < ActiveRecord::Base
|
|
3
3
|
include Valuation::LifetimeFees
|
4
4
|
include Ext::Resellable::Organization
|
5
5
|
include Ext::Integrations::Organization
|
6
|
-
|
7
|
-
attr_accessible :name, :time_zone, :ein, :legal_organization_name, :email, :receive_daily_sales_report
|
8
|
-
|
6
|
+
|
7
|
+
attr_accessible :name, :time_zone, :ein, :legal_organization_name, :email, :receive_daily_sales_report, :country, :state, :zip, :phone_number, :website, :discipline
|
8
|
+
|
9
9
|
has_many :events
|
10
10
|
has_many :charts
|
11
11
|
has_many :shows
|
@@ -29,7 +29,7 @@ class Organization < ActiveRecord::Base
|
|
29
29
|
|
30
30
|
has_many :imports
|
31
31
|
|
32
|
-
validates_presence_of :name, :email
|
32
|
+
validates_presence_of :name, :email, :time_zone, :country, :state, :zip, :phone_number, :discipline
|
33
33
|
validates :ein, :presence => true, :if => :updating_tax_info
|
34
34
|
validates :legal_organization_name, :presence => true, :if => :updating_tax_info
|
35
35
|
|
@@ -40,7 +40,6 @@ class Organization < ActiveRecord::Base
|
|
40
40
|
self.id
|
41
41
|
end
|
42
42
|
|
43
|
-
|
44
43
|
#
|
45
44
|
# We aren't interested in FAFS donations, so override lifetime_orders
|
46
45
|
# to only include Artfully orders see: Valuation::LifetimeValue
|
@@ -56,7 +55,7 @@ class Organization < ActiveRecord::Base
|
|
56
55
|
# But those methods have not been added to a release yet.
|
57
56
|
#
|
58
57
|
def tags_for(tagged_association)
|
59
|
-
|
58
|
+
|
60
59
|
#Yak
|
61
60
|
begin
|
62
61
|
self.send(tagged_association.to_sym)
|
@@ -65,7 +64,7 @@ class Organization < ActiveRecord::Base
|
|
65
64
|
end
|
66
65
|
|
67
66
|
table_name = Kernel.const_get(tagged_association.to_s.classify).table_name
|
68
|
-
|
67
|
+
|
69
68
|
ActsAsTaggableOn::Tag.joins("INNER JOIN taggings ON tags.id = taggings.tag_id")
|
70
69
|
.joins("INNER JOIN #{table_name} ON #{table_name}.id = taggings.taggable_id")
|
71
70
|
.joins("INNER JOIN organizations ON organizations.id = #{table_name}.organization_id")
|
@@ -128,7 +127,7 @@ class Organization < ActiveRecord::Base
|
|
128
127
|
def has_kit?(name)
|
129
128
|
kits.where(:state => "activated").map(&:class).map(&:name).include?(name.to_s.camelize + "Kit")
|
130
129
|
end
|
131
|
-
|
130
|
+
|
132
131
|
private
|
133
132
|
|
134
133
|
def check_for_duplicates(kit)
|
data/app/models/user.rb
CHANGED
@@ -11,6 +11,8 @@
|
|
11
11
|
has_many :user_memberships
|
12
12
|
has_many :organizations, :through => :user_memberships
|
13
13
|
|
14
|
+
accepts_nested_attributes_for :user_memberships
|
15
|
+
|
14
16
|
scope :logged_in_more_than_once, where("users.sign_in_count > 1")
|
15
17
|
|
16
18
|
def self.generate_password
|
@@ -18,20 +20,20 @@
|
|
18
20
|
end
|
19
21
|
|
20
22
|
# Setup accessible (or protected) attributes for your model
|
21
|
-
attr_accessible :email, :password, :password_confirmation, :remember_me, :user_agreement, :newsletter_emails
|
23
|
+
attr_accessible :email, :password, :password_confirmation, :remember_me, :user_agreement, :newsletter_emails, :first_name, :last_name, :user_memberships_attributes
|
22
24
|
|
23
25
|
def is_in_organization?
|
24
|
-
|
26
|
+
!!(user_memberships.any? && ! user_memberships.first.organization.new_record?)
|
25
27
|
end
|
26
28
|
|
27
29
|
def current_organization
|
28
|
-
|
30
|
+
is_in_organization? ? user_memberships.first.organization : Organization.new
|
29
31
|
end
|
30
32
|
|
31
33
|
def membership_in(organization)
|
32
34
|
user_memberships.where(:organization_id => organization.id).limit(1).first
|
33
35
|
end
|
34
|
-
|
36
|
+
|
35
37
|
def self.like(query = "")
|
36
38
|
return if query.blank?
|
37
39
|
q = "%#{query}%"
|
@@ -44,4 +46,14 @@
|
|
44
46
|
def active_for_authentication?
|
45
47
|
super && !suspended?
|
46
48
|
end
|
49
|
+
|
50
|
+
def to_s
|
51
|
+
if first_name.present? || last_name.present?
|
52
|
+
[first_name, last_name].reject(&:blank?).join(" ")
|
53
|
+
elsif email.present?
|
54
|
+
email.to_s
|
55
|
+
else
|
56
|
+
"No Name ##{id}"
|
57
|
+
end
|
58
|
+
end
|
47
59
|
end
|
@@ -1,10 +1,11 @@
|
|
1
1
|
class UserMembership < ActiveRecord::Base
|
2
|
-
|
3
2
|
# Be careful here! :user needs to come out of this if we ever support update action on memberships controller
|
4
|
-
attr_accessible :user
|
5
|
-
|
3
|
+
attr_accessible :user, :organization_attributes
|
4
|
+
|
6
5
|
belongs_to :user
|
7
6
|
belongs_to :organization
|
8
7
|
|
8
|
+
accepts_nested_attributes_for :organization
|
9
|
+
|
9
10
|
validates :user_id, :uniqueness => {:scope => :organization_id}
|
10
11
|
end
|
@@ -19,10 +19,10 @@
|
|
19
19
|
%td.field-slim Email
|
20
20
|
%td="The email address of the person. People records in Artful.ly have unique email addresses, so if you're importing an email address that has already been assigned to a person, we'll merge the data for you. #{link_to "Read more", "#merging", {'data-toggle' => 'modal'}}".html_safe
|
21
21
|
%tr
|
22
|
-
%td.field-slim First
|
22
|
+
%td.field-slim First Name
|
23
23
|
%td The first name of the person.
|
24
24
|
%tr
|
25
|
-
%td.field-slim Last
|
25
|
+
%td.field-slim Last Name
|
26
26
|
%td The last name of the person.
|
27
27
|
%tr
|
28
28
|
%td.field-slim Company Name
|
@@ -36,7 +36,7 @@
|
|
36
36
|
%td.field-slim Salutation
|
37
37
|
%td The person's salutation (Mr., Mrs., etc...)
|
38
38
|
%tr
|
39
|
-
%td.field-slim Middle
|
39
|
+
%td.field-slim Middle Name
|
40
40
|
%td The person's middle name
|
41
41
|
%tr
|
42
42
|
%td.field-slim Suffix
|
@@ -45,10 +45,10 @@
|
|
45
45
|
%td.field-slim Title
|
46
46
|
%td The person's title in the company
|
47
47
|
%tr
|
48
|
-
%td.field-slim
|
48
|
+
%td.field-slim Address 1
|
49
49
|
%td First line of the person's address
|
50
50
|
%tr
|
51
|
-
%td.field-slim
|
51
|
+
%td.field-slim Address 2
|
52
52
|
%td Second line of the person's address
|
53
53
|
%tr
|
54
54
|
%td.field-slim City
|
@@ -1,5 +1,5 @@
|
|
1
|
-
!!!
|
2
|
-
%html{:
|
1
|
+
!!! 5
|
2
|
+
%html{:lang => "en", "ng-app" => "artfully"}
|
3
3
|
%head
|
4
4
|
%title= "#{yield :title} : Artful.ly"
|
5
5
|
%link{ :rel => "shortcut icon", :href => "/favicon.ico", :type => "image/x-icon"}
|
@@ -31,10 +31,44 @@
|
|
31
31
|
%td Email Preview
|
32
32
|
%td=link_to "Preview Now", "#email-preview", 'data-toggle' => 'modal'
|
33
33
|
|
34
|
+
- if @membership_award.people.length == 1
|
35
|
+
%h3 Payment
|
36
|
+
.row-fluid
|
37
|
+
.span5
|
38
|
+
#payment-controls.controls
|
39
|
+
%label.radio
|
40
|
+
= radio_button_tag(:payment_method, :cash, true, :class => 'payment-method', :humanized_value => 'Cash')
|
41
|
+
Cash
|
42
|
+
%label.radio
|
43
|
+
= radio_button_tag(:payment_method, :comp, false, :class => 'payment-method', :disabled => 'true', :humanized_value => 'Comp')
|
44
|
+
Comp
|
45
|
+
%label.radio
|
46
|
+
= radio_button_tag(:payment_method, :credit_card_manual, false, :class => 'payment-method', :humanized_value => 'Credit card')
|
47
|
+
Credit
|
48
|
+
.span7
|
49
|
+
#payment-info.hidden.well
|
50
|
+
.control-group
|
51
|
+
= label_tag("credit_card[cardholder_name]", "Name on Card")
|
52
|
+
.controls= text_field_tag("credit_card[name]", params[:cardholder_name])
|
53
|
+
.control-group
|
54
|
+
= label_tag("credit_card[card_number]", "Card Number")
|
55
|
+
.controls= text_field_tag("credit_card[number]", params[:card_number])
|
56
|
+
.control-group
|
57
|
+
= label_tag("credit_card[expiration_date]", "Expiration Date")
|
58
|
+
.date_field.controls
|
59
|
+
= select_tag("credit_card[month]", options_for_select(1..12, params["month"]), :class => 'input-small inline')
|
60
|
+
= select_tag("credit_card[year]", options_for_select(Time.now.year..Time.now.year + 10, params["year"]), :class => 'input-small inline')
|
61
|
+
|
34
62
|
%h3 What Happens Now?
|
35
|
-
%p
|
63
|
+
%p
|
64
|
+
=check_mark
|
65
|
+
These people will become members of your organization.
|
66
|
+
%p
|
67
|
+
=check_mark
|
68
|
+
The credit card you provided will be charged .
|
36
69
|
-if @membership_award.send_email
|
37
70
|
%p
|
71
|
+
=check_mark
|
38
72
|
They will get an email to setup an account with your orgnaization if they have not already done so.
|
39
73
|
=link_to "Click here to see a preview of this email", "#email-preview", 'data-toggle' => 'modal'
|
40
74
|
|
@@ -56,4 +90,16 @@
|
|
56
90
|
.modal-body
|
57
91
|
=@membership_award.message
|
58
92
|
.modal-footer
|
59
|
-
%button.btn{'data-dismiss'=>'modal'} Close
|
93
|
+
%button.btn{'data-dismiss'=>'modal'} Close
|
94
|
+
|
95
|
+
-content_for :custom_js do
|
96
|
+
:javascript
|
97
|
+
$(".payment-method").change(function(){
|
98
|
+
if($(this).attr('value') != 'credit_card_manual'){
|
99
|
+
$("#payment-info").addClass("hidden");
|
100
|
+
$("#credit_card_number").val("")
|
101
|
+
$("#credit_card_name").val("")
|
102
|
+
} else {
|
103
|
+
$("#payment-info").removeClass("hidden");
|
104
|
+
}
|
105
|
+
});
|