artfully_ose 1.3.0.pre1 → 1.3.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9a91236e58df6a58752ee849ab10fdc434042889
4
- data.tar.gz: a23a35e3e9a3509d51aab0b2649d89b144fb57e9
3
+ metadata.gz: 2227e62aa7b96bf9b47c53b10e6f7be5e505b8d2
4
+ data.tar.gz: 2730b7c985317b350a7375e3d323ce1625652f77
5
5
  SHA512:
6
- metadata.gz: dd3aa2d49a76d635a0da70475c5f6ae428eec357c42ce38e49cfbf9105423749122c9f20cbee3a1301e0c83c88ce9732fc09b8f53344d79a46605c449a1b0af0
7
- data.tar.gz: 33d68fe5b36584e757a141047835fe03fa0becb90efed842ae601ac206ed57fd98e9ddfd264ebdd5b7a15c50b7d25d6e365718d626c64b0a11fec1ef0572f377
6
+ metadata.gz: a1d9292c210b7f9eb3a73b4ab50be727c9a2963b494475ce7b2638d7f3ca8f1d5958972af8fb1f14c146b054be255d74c6dde8c7148933caa07a395061a94988
7
+ data.tar.gz: e94e5cda62a1e681e59f7dfffe0621018b3ea8c9c84c414e8ed4d51aac6bf7d58bc0ad6b0d8410d306e4f1379d3241a57a73d0283fbefb7a18f4dcba8d4feb33
@@ -0,0 +1,71 @@
1
+ class MailchimpKitsController < ApplicationController
2
+ rescue_from CanCan::AccessDenied do |exception|
3
+ flash[:alert] = exception.message
4
+ redirect_to root_path, :alert => exception.message
5
+ end
6
+
7
+ rescue_from Gibbon::GibbonError do |exception|
8
+ if exception.message =~ /api_key/
9
+ redirect_to edit_mailchimp_kit_path(params[:id])
10
+ end
11
+ redirect_to root_path, :alert => "There was a problem with mailchimp, please try again"
12
+ end
13
+
14
+ before_filter do
15
+ authorize! :edit, current_user.current_organization
16
+ end
17
+
18
+ def edit
19
+ @kit = Kit.find(params[:id])
20
+ authorize! :edit, @kit
21
+ end
22
+
23
+ def update
24
+ @kit = Kit.find(params[:id])
25
+ authorize! :edit, @kit
26
+
27
+ unless params[:mailchimp_kit][:api_key].nil?
28
+ params[:mailchimp_kit][:api_key] = params[:mailchimp_kit][:api_key].strip
29
+ end
30
+
31
+ @kit.old_api_key = @kit.api_key
32
+ if @kit.update_attributes(params[:mailchimp_kit])
33
+ redirect_to lists_mailchimp_kit_url(@kit)
34
+ else
35
+ params[:new_api_key] = true
36
+ flash[:error] = "We could not validate your api key. Please make sure it is correct and try again."
37
+ render :edit
38
+ end
39
+ end
40
+
41
+ def lists
42
+ @kit = Kit.find(params[:id])
43
+ authorize! :edit, @kit
44
+ end
45
+
46
+ def default_list
47
+ @kit = Kit.find(params[:id])
48
+ end
49
+
50
+ def manage
51
+ kit = Kit.find(params[:id])
52
+ authorize! :edit, kit
53
+
54
+ kit.change_lists(params[:lists] || [])
55
+ kit.update_attributes(mailchimp_kit_params)
56
+ redirect_to current_user.current_organization, :notice => "Great! We're syncing your MailChimp lists with Artful.ly and will email when we're done."
57
+ end
58
+
59
+ def hide_alert
60
+ kit = Kit.find(params[:id])
61
+ kit.hide_default_list_alert = true
62
+ kit.save
63
+ head :ok
64
+ end
65
+
66
+ private
67
+
68
+ def mailchimp_kit_params
69
+ params.fetch(:mailchimp_kit).slice(:default_list_id, :fan_subscribe_question)
70
+ end
71
+ end
@@ -0,0 +1,25 @@
1
+ class MailchimpWebhooksController < ApplicationController
2
+ skip_before_filter :authenticate_user!
3
+ skip_before_filter :metric_logged_in
4
+
5
+ def show
6
+ MailchimpKit.find(params[:id])
7
+ head :ok
8
+ end
9
+
10
+ def update
11
+ mailchimp_kit = MailchimpKit.find(params[:id])
12
+
13
+ if mailchimp_kit.attached_lists.none? { |list| list[:list_id] == params[:list_id] }
14
+ head 422
15
+ return
16
+ end
17
+
18
+ if !mailchimp_kit.cancelled?
19
+ job = MailchimpSyncJob.new(mailchimp_kit, :type => "webhook_#{params[:type]}", :data => params[:data], :list_id => params[:list_id])
20
+ Delayed::Job.enqueue(job, :queue => "mailchimp")
21
+ end
22
+
23
+ head :ok
24
+ end
25
+ end
@@ -3,6 +3,12 @@ class MembershipCompsController < ArtfullyOseController
3
3
 
4
4
  def new
5
5
  @membership_types = current_organization.membership_types.all
6
+
7
+ if @membership_types.empty?
8
+ flash[:notice] = "To comp a memberhsip to a patron you'll need to create a memebership type first."
9
+ redirect_to new_membership_type_path and return
10
+ end
11
+
6
12
  @membership_types_hash = {}
7
13
  @membership_types.each {|mt| @membership_types_hash[mt.id] = {:allow_multiple_memberships => mt.allow_multiple_memberships?,:formatted_ends_at => I18n.l(mt.ends_at, :format => :date_for_input)}}
8
14
 
@@ -75,7 +75,7 @@ class PeopleController < ArtfullyOseController
75
75
  single_optin = params.fetch("single_optin", false) == "true"
76
76
  @person.update_and_note_subscriptions!(current_user, subscribed_lists, groupings, single_optin)
77
77
  flash[:notice] << "Your changes have been saved." +
78
- (have_duplicate_addresses ? " We didnt save some addresses because they were duplicates." : "")
78
+ (have_duplicate_addresses ? " We didn't save some addresses because they were duplicates." : "")
79
79
  else
80
80
  errs = [@person.errors.delete(:"relationships.base")].flatten + [@person.errors.full_messages.to_sentence].flatten
81
81
  flash[:alert] = errs.blank? ? "Sorry, we couldn't save your changes. Make sure you entered a first name, last name or email address." : errs.compact
@@ -0,0 +1,14 @@
1
+ module MailchimpHelper
2
+ def default_list_options(kit)
3
+ lists = kit.attached_lists.map { |list| [list[:list_name], list[:list_id]] }
4
+ options_for_select(lists, kit.default_list_id)
5
+ end
6
+
7
+ def default_list_prompt(kit)
8
+ if kit.attached_lists.empty?
9
+ "Please select lists above"
10
+ else
11
+ "Select a list"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,126 @@
1
+ class ActionFeed
2
+ attr_accessor :organization_id, :redis
3
+ include ActionView::Helpers::SanitizeHelper
4
+ cattr_accessor :redis
5
+
6
+ def self.for(organization_id)
7
+ af = ActionFeed.new
8
+ af.organization_id = organization_id
9
+ @@redis ||= RedisManager.connection
10
+ af
11
+ end
12
+
13
+ def key
14
+ "feed:#{organization_id}"
15
+ end
16
+
17
+ def burst_key
18
+ "burst:#{organization_id}"
19
+ end
20
+
21
+ #
22
+ # If the action is ON TOP, add it to the top of the feed
23
+ # If the action is *in* the top, rebuild the feed
24
+ # Otherwise do nothing
25
+ #
26
+ def add(action)
27
+ Rails.logger.debug("ACTION_FEED [#{self.key}] checking action [#{action.id}]")
28
+
29
+ if(is_top? action.id)
30
+ Rails.logger.debug("ACTION_FEED [#{self.key}] adding action [#{action.id}]")
31
+ # lpush!
32
+ @@redis.lpush(self.key, for_dashboard(action))
33
+ @@redis.ltrim(self.key, 0, 24)
34
+ else
35
+ delay_time = action.can_wait? ? 300 : 10
36
+ self.rebuild_later(delay_time)
37
+ end
38
+ end
39
+
40
+ def feed
41
+ begin
42
+ @@redis.lrange(self.key, 0, 24)
43
+ rescue Exception => e
44
+ Airbrake.notify(e, :parameters => {:error_message => "Redis error getting action feed"})
45
+ []
46
+ end
47
+ end
48
+
49
+ def is_top?(action_id)
50
+ id = Action.recent(self.organization_id).limit(1).pluck(:id).first
51
+ Rails.logger.debug("ACTION_FEED [#{self.key}] top action is [#{id}]")
52
+ action_in_top = (action_id == id)
53
+
54
+ if (action_in_top)
55
+ Rails.logger.debug("ACTION_FEED [#{self.key}] action [#{action_id}] is on top")
56
+ end
57
+
58
+ action_in_top
59
+ end
60
+
61
+ def in_top?(action_id)
62
+ ids = Action.recent(self.organization_id).limit(25).pluck(:id)
63
+ Rails.logger.debug("ACTION_FEED [#{self.key}] top actions #{ids}")
64
+ action_in_top = ids.include?(action_id)
65
+ Rails.logger.debug("ACTION_FEED [#{self.key}] action [#{action_id}] is in top [#{action_in_top}]")
66
+ action_in_top
67
+ end
68
+
69
+ def rebuild_if_necessary(action, and_delay=false)
70
+ if ((action.deleted_at.present?) || (self.in_top? action.id))
71
+ Rails.logger.debug("ACTION_FEED [#{self.key}] rebuild_if_necessary")
72
+ and_delay ? self.rebuild_later : self.rebuild
73
+ end
74
+ end
75
+
76
+ def rebuild_later(delay_time = 10)
77
+ Rails.logger.debug("ACTION_FEED [#{self.key}] rebuild_later")
78
+
79
+ RedisManager.burst_job(burst_key, delay_time) do
80
+ Rails.logger.debug("ACTION_FEED [#{self.key}] scheduling rebuild")
81
+ job = ActionFeed::RebuildJob.new(self.organization_id)
82
+ Delayed::Job.enqueue(job, {:queue => "feed", :run_at => delay_time.seconds.from_now})
83
+ end
84
+ end
85
+
86
+ #
87
+ # To rebuild now. Not terribly slow but still use with caution
88
+ #
89
+ def rebuild
90
+ Rails.logger.debug("ACTION_FEED [#{self.key}] rebuilding")
91
+ actions = Action.recent(self.organization_id).limit(25)
92
+ self.destroy
93
+ actions.each do |action|
94
+ # rpush!
95
+ @@redis.rpush(self.key, for_dashboard(action))
96
+ end
97
+ @@redis.ltrim(self.key, 0, 24)
98
+ actions
99
+ end
100
+
101
+ def destroy
102
+ @@redis.del(key)
103
+ end
104
+
105
+ def for_dashboard(action)
106
+ template = File.read("#{ArtfullyOse::Engine.root}/app/views/index/_action.html.haml")
107
+ haml_engine = Haml::Engine.new(template)
108
+
109
+ base = Class.new do
110
+ include ArtfullyOseHelper
111
+ include ActionView::Helpers::DateHelper
112
+ end.new
113
+
114
+ scope = base
115
+ output = haml_engine.render(scope, {:action => action})
116
+ output.gsub("'","\'") # necessary to escape single '
117
+ output = sanitize(output)
118
+ output
119
+ end
120
+
121
+ class RebuildJob < Struct.new(:organization_id)
122
+ def perform
123
+ ActionFeed.for(self.organization_id).rebuild
124
+ end
125
+ end
126
+ end
@@ -5,5 +5,13 @@
5
5
  %ul
6
6
  %li Paid Ticketing
7
7
  %li People
8
- %li= link_to "Membership", [:edit, @organization.membership_kit], :id => "configure_#{@organization.membership_kit.type.underscore}"
9
- %li= link_to "Passes", [:edit, @organization.passes_kit], :id => "configure_#{@organization.passes_kit.type.underscore}"
8
+ %li Scannable Tickets
9
+ %li Fundraising/Campaigns
10
+ -if @ability.can? :manage, Kit
11
+ %li= link_to "Membership", [:edit, @organization.membership_kit]
12
+ %li= link_to "Passes", [:edit, @organization.passes_kit]
13
+ %li= link_to "Mailchimp", [:edit, @organization.kits.where(:type => "MailchimpKit").first]
14
+ -else
15
+ %li Membership
16
+ %li Passes
17
+ %li Mailchimp
@@ -2,8 +2,6 @@
2
2
  %html{:lang => "en", "ng-app" => "artfully"}
3
3
  %head
4
4
  %title= "#{yield :title} : #{t 'artfully.page_title'}"
5
- = stylesheet_link_tag "#{ENV['CAS_ASSET_HOST'] || ENV['CAS_BASE_URL']}/assets/memberbar.css"
6
- = javascript_include_tag "#{ENV['CAS_ASSET_HOST'] || ENV['CAS_BASE_URL']}/assets/memberbar.js"
7
5
 
8
6
  :plain
9
7
  <link href='//fonts.googleapis.com/css?family=Open+Sans+Condensed:300' rel='stylesheet' type='text/css'>
@@ -0,0 +1,19 @@
1
+ - content_for :header do
2
+ %h1 MailChimp Kit
3
+
4
+ .row
5
+ .span6
6
+ %p
7
+ With your activated MailChimp Kit, you can:
8
+ %ul{:style => "margin:10px;padding:10px;list-style:disc;"}
9
+ %li Push your Artful.ly contacts up to Mailchimp
10
+ %li Import your MailChimp subscribers into Artful.ly
11
+ %li Record MailChimp newsletters on Artful.ly people records
12
+ %li Let fans subscribe to a list when they checkout
13
+
14
+ .span5
15
+ .well
16
+ .center
17
+ Click the Activate button to get started
18
+ .btn-toolbar.form-actions.center
19
+ .btn-group= button_to "Activate Mailchimp", kits_path(:type => @kit.type.underscore), :class => "btn btn-success btn-large"
@@ -0,0 +1,20 @@
1
+ - content_for :header do
2
+ %h1 MailChimp Kit
3
+
4
+ .row
5
+ .span6.offset3
6
+ - if @kit.api_key.nil? || params[:new_api_key]
7
+ = form_for @kit, :html => { :class => 'form-horizontal' } do |f|
8
+ %p
9
+ Artful.ly needs your MailChimp API key to communicate with MailChimp. Get your API key #{link_to "here", "http://admin.mailchimp.com/account/api", :target => "_blank" } and fill in that value below:
10
+
11
+ = f.text_field :api_key, :class => "span4"
12
+
13
+ = f.submit "Set API Key", :class => "btn"
14
+ - else
15
+ %p
16
+ Your MailChimp Kit is all set! If you like, you can:
17
+ %p
18
+ = link_to "Change this API key", edit_mailchimp_kit_path(@kit, :new_api_key => true)
19
+ %p
20
+ = link_to "Manage my connected lists.", lists_mailchimp_kit_path(@kit)
@@ -0,0 +1,48 @@
1
+ - content_for :header do
2
+ %h1 MailChimp Kit
3
+
4
+ .row
5
+ .span6
6
+ %p
7
+ Select which MailChimp lists you would like Artful.ly to integrate with. Subscribers to each selected list will be imported into Artful.ly.
8
+ %p
9
+ You can come back to this page and edit this list at any time.
10
+ %p
11
+ The following data will be imported from your MailChimp subscribers:
12
+ %table.table.table-bordered.table-striped.docs
13
+ %tr
14
+ %td.field EMAIL
15
+ %td This is an "email" type field. We will push the individual's email address to this field.
16
+ %tr
17
+ %td.field FNAME
18
+ %td This is is a "text" type field. We will push the individual's first name to this field.
19
+ %tr
20
+ %td.field LNAME
21
+ %td This is is a "text" type field. We will push the individual's last name to this field.
22
+ .span5
23
+ - if @kit.lists.count > 0
24
+ = form_for @kit, :url => manage_mailchimp_kit_path(@kit), :method => :post do |f|
25
+ .well
26
+ %p
27
+ Which MailChimp lists would you like to sync?
28
+ - @kit.lists.each do |list|
29
+ .list
30
+ = label_tag "", :class => "checkbox" do
31
+ = check_box_tag "lists[]", list[1], @kit.list_attached?(list[1]), :class => "list", "data-list-name" => list[0]
32
+ %span.name= list[0]
33
+ .well
34
+ = label_tag "mailchimp_kit[default_list_id]" do
35
+ Which list would you like to ask your fans to join when they check out?
36
+ .list-default
37
+ = select_tag "mailchimp_kit[default_list_id]", default_list_options(@kit), :prompt => default_list_prompt(@kit)
38
+
39
+ .well
40
+ = label_tag "mailchimp_kit[fan_subscribe_question]" do
41
+ How would you like to ask fans to subscribe to that list?
42
+ = text_field_tag "mailchimp_kit[fan_subscribe_question]", @kit.fan_subscribe_question, :maxlength => "60"
43
+
44
+ = f.submit "Save", :class => "btn btn-primary"
45
+
46
+ - else
47
+ .notice
48
+ No Mailchimp lists were attached to this account. Please make a list and try again.
@@ -0,0 +1,42 @@
1
+ .row
2
+ .span6
3
+ %ul.kv
4
+ %li.row-fluid
5
+ .key.span3 Organization Name
6
+ .value.span6= @organization.name
7
+ %li.row-fluid
8
+ .key.span3 Email
9
+ .value.span6= @organization.email
10
+ %li.row-fluid
11
+ .key.span3 Time Zone
12
+ .value.span6= @organization.time_zone
13
+
14
+ - if @ability.can? :manage, current_user.current_organization
15
+ = link_to "Edit", edit_organization_path(@organization), {:class => "btn"}
16
+
17
+ .span6
18
+ %ul
19
+ %li.row-fluid
20
+ .span4
21
+ %strong Your Central Storefront
22
+ .span8=link_to store_organization_events_url(@organization.cached_slug), store_organization_events_url(@organization.cached_slug), :target => "blank"
23
+ %p
24
+ ="Patrons can visit this URL to buy tickets to your events and make donations to your organization. You can customize this URL #{link_to "here", edit_organization_path(@organization)}.".html_safe
25
+
26
+ - if @organization.has_any_storefront_kit?
27
+ #storefront-table
28
+ %h5 Storefronts
29
+
30
+ %table.table.table-compact
31
+ - [:regular_donation, :membership, :passes].each do |kit|
32
+ - if(@organization.has_kit? (kit))
33
+ %tr
34
+ %td=@organization.kit(kit).friendly_name
35
+ %td{:id => "badge_#{kit}"}
36
+ .center
37
+ -if @organization.has_active_storefront? kit
38
+ .badge.badge-success{:id => "storefront_badge_#{kit.to_s}"}
39
+ =link_to "On", [:edit, @organization.kit(kit)], :id => "configure_#{kit}", :style => "color: white; cursor: pointer;"
40
+ -else
41
+ .badge
42
+ =link_to "Off", [:edit, @organization.kit(kit)], :id => "configure_#{kit}", :style => "color: white; cursor: pointer;"
@@ -1,21 +0,0 @@
1
- #faForm.modal
2
- = form_for fa_user, :url => connect_organization_path(organization) do |form|
3
- .modal-header
4
- .close{'data-dismiss'=>'modal'} x
5
- .row-fluid
6
- .span2
7
- =image_tag "falogo_50.jpg"
8
- .span10
9
- %h3 Connect to Fractured Atlas
10
- .modal-body
11
- - back ||= false
12
- = hidden_field_tag :back, true if back
13
- %ul
14
- %li
15
- = form.label :username, "Fractured Atlas Username", :class=>'control-label'
16
- = form.text_field :username
17
- %li
18
- =form.label :password, "Password", :class=>'control-label'
19
- =form.password_field :password, autocomplete: 'off'
20
- .modal-footer
21
- = form.submit "Connect", :class => 'btn'
@@ -2,26 +2,28 @@
2
2
  - content_for :header do
3
3
  %h1 Account Administration
4
4
 
5
- .bottom-room.bordered-section
6
- .row
7
- .span3
8
- %h3{:style => "margin-top: 0px"} Details
9
- - if can? :manage, current_user.current_organization
10
- = link_to "Edit", edit_organization_path(@organization), {:class => "btn"}
11
- .span9
12
- %ul.kv
13
- %li.row-fluid
14
- .key.span3 Organization Name
15
- .value.span9= @organization.name
16
- %li.row-fluid
17
- .key.span3 Email
18
- .value.span9= @organization.email
19
- %li.row-fluid
20
- .key.span3 Time Zone
21
- .value.span9= @organization.time_zone
5
+ - @active_tab ||= "basics"
22
6
 
23
- .bottom-room.bordered-section
24
- = render :partial => "kits/list", :locals => { :organization => @organization }
7
+ %ul.nav.nav-tabs
8
+ %li{:class => "#{'active' if @active_tab=='basics'}"}
9
+ %a{:href => "#basics", "data-toggle" => "tab"} Basics
10
+ -if @ability.can? :manage, Kit
11
+ %li{:class => "#{'active' if @active_tab=='kits'}"}
12
+ %a{:href => "#kits", "data-toggle" => "tab"} Kits
25
13
 
26
- .bottom-room.bordered-section
27
- = render :partial => "user_memberships/list", :locals => { :organization => @organization }
14
+ -if @ability.can? :view, User
15
+ %li{:class => "#{'active' if @active_tab=='users'}"}
16
+ %a{:href => "#users", "data-toggle" => "tab"} Users
17
+
18
+ .tab-content
19
+ .tab-pane#basics{:class => "#{'active' if @active_tab=='basics'}"}
20
+ =render :partial => "basics"
21
+ -if @ability.can? :manage, Kit
22
+ .tab-pane#kits{:class => "#{'active' if @active_tab=='kits'}"}
23
+ = render :partial => "kits/list", :locals => { :kits => @kits }
24
+ -if @ability.can? :view, User
25
+ .tab-pane#users{:class => "#{'active' if @active_tab=='users'}"}
26
+ = render :partial => "user_memberships/list", :locals => { :organization => @organization }
27
+
28
+ -if @ability.can? :manage, @organization
29
+ = render :partial => 'connection_form', :locals => { :organization => @organization }
data/config/routes.rb CHANGED
@@ -113,7 +113,16 @@ Rails.application.routes.draw do
113
113
  get :alternatives, :on => :collection
114
114
  post :requirements, :on => :collection
115
115
  get :requirements, :on => :collection
116
+ end
117
+ resources :mailchimp_kits, :only => [ :edit, :update ] do
118
+ member do
119
+ get :lists
120
+ post :manage
121
+ post :hide_alert
122
+ end
116
123
  end
124
+ resources :mailchimp_webhooks, :only => [ :show ]
125
+ post "/mailchimp_webhooks/:id" => "mailchimp_webhooks#update"
117
126
 
118
127
  resources :membership_kits, :only => [ :edit, :update ]
119
128
  resources :passes_kits, :only => [ :edit, :update ]
@@ -0,0 +1,5 @@
1
+ class AddDonatedToSearches < ActiveRecord::Migration
2
+ def change
3
+ add_column :searches, :has_donated, :boolean, :default => true
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module ArtfullyOse
2
- VERSION = "1.3.0.pre1"
2
+ VERSION = "1.3.0.pre2"
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.3.0.pre1
4
+ version: 1.3.0.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artful.ly
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-13 00:00:00.000000000 Z
11
+ date: 2015-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -570,6 +570,20 @@ dependencies:
570
570
  - - '='
571
571
  - !ruby/object:Gem::Version
572
572
  version: 0.4.0
573
+ - !ruby/object:Gem::Dependency
574
+ name: redis
575
+ requirement: !ruby/object:Gem::Requirement
576
+ requirements:
577
+ - - '='
578
+ - !ruby/object:Gem::Version
579
+ version: 3.2.0
580
+ type: :runtime
581
+ prerelease: false
582
+ version_requirements: !ruby/object:Gem::Requirement
583
+ requirements:
584
+ - - '='
585
+ - !ruby/object:Gem::Version
586
+ version: 3.2.0
573
587
  description: A Ruby on Rails engine for running ticketing, CRM, and order management. See
574
588
  http://fracturedatlas.github.com/artfully_app/ for the reference implementation
575
589
  email:
@@ -1975,6 +1989,8 @@ files:
1975
1989
  - app/controllers/imports_controller.rb
1976
1990
  - app/controllers/index_controller.rb
1977
1991
  - app/controllers/job_monitors_controller.rb
1992
+ - app/controllers/mailchimp_kits_controller.rb
1993
+ - app/controllers/mailchimp_webhooks_controller.rb
1978
1994
  - app/controllers/member_cards_controller.rb
1979
1995
  - app/controllers/members/index_controller.rb
1980
1996
  - app/controllers/members/invitations_controller.rb
@@ -2043,6 +2059,7 @@ files:
2043
2059
  - app/helpers/households_helper.rb
2044
2060
  - app/helpers/imports_helper.rb
2045
2061
  - app/helpers/link_helper.rb
2062
+ - app/helpers/mailchimp_helper.rb
2046
2063
  - app/helpers/mailchimp_lists_for_search_helper.rb
2047
2064
  - app/helpers/members_helper.rb
2048
2065
  - app/helpers/membership_types_helper.rb
@@ -2059,6 +2076,7 @@ files:
2059
2076
  - app/mailers/reports_mailer.rb
2060
2077
  - app/models/ability.rb
2061
2078
  - app/models/action.rb
2079
+ - app/models/action_feed.rb
2062
2080
  - app/models/actions/change_action.rb
2063
2081
  - app/models/actions/comp_action.rb
2064
2082
  - app/models/actions/convert_action.rb
@@ -2470,6 +2488,9 @@ files:
2470
2488
  - app/views/layouts/mail.html.haml
2471
2489
  - app/views/layouts/members.html.haml
2472
2490
  - app/views/layouts/storefront.html.haml
2491
+ - app/views/mailchimp_kits/activate.html.haml
2492
+ - app/views/mailchimp_kits/edit.html.haml
2493
+ - app/views/mailchimp_kits/lists.html.haml
2473
2494
  - app/views/members/index/index.html.haml
2474
2495
  - app/views/members/invitations/edit.html.haml
2475
2496
  - app/views/members/invitations/new.html.erb
@@ -2527,6 +2548,7 @@ files:
2527
2548
  - app/views/orders/passes.html.haml
2528
2549
  - app/views/orders/sales.html.haml
2529
2550
  - app/views/orders/show.html.haml
2551
+ - app/views/organizations/_basics.html.haml
2530
2552
  - app/views/organizations/_connection_form.html.haml
2531
2553
  - app/views/organizations/_form.html.haml
2532
2554
  - app/views/organizations/_website_form.html.haml
@@ -2878,6 +2900,7 @@ files:
2878
2900
  - db/migrate/20140905080503_create_scheduled_pledge_payments.rb
2879
2901
  - db/migrate/20140909150251_add_org_to_suggested_household.rb
2880
2902
  - db/migrate/20141007114614_add_order_id_to_donations.rb
2903
+ - db/migrate/20141009191355_add_donated_to_searches.artfully_ose_engine.rb
2881
2904
  - db/migrate/20141021134013_add_lifetime_pledges_to_people.rb
2882
2905
  - db/migrate/20141027191307_default_overwrite_member_addresses_to_false.rb
2883
2906
  - db/migrate/20141031193839_update_relations.rb