ffcrm_cloudfuji 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ pkg/
2
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'fat_free_crm'
4
+
5
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,193 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ffcrm_cloudfuji (1.0.0)
5
+ authlogic_cloudfuji (~> 0.9)
6
+ cloudfuji
7
+ fat_free_crm (>= 0.11.2)
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ actionmailer (3.2.3)
13
+ actionpack (= 3.2.3)
14
+ mail (~> 2.4.4)
15
+ actionpack (3.2.3)
16
+ activemodel (= 3.2.3)
17
+ activesupport (= 3.2.3)
18
+ builder (~> 3.0.0)
19
+ erubis (~> 2.7.0)
20
+ journey (~> 1.0.1)
21
+ rack (~> 1.4.0)
22
+ rack-cache (~> 1.2)
23
+ rack-test (~> 0.6.1)
24
+ sprockets (~> 2.1.2)
25
+ activemodel (3.2.3)
26
+ activesupport (= 3.2.3)
27
+ builder (~> 3.0.0)
28
+ activerecord (3.2.3)
29
+ activemodel (= 3.2.3)
30
+ activesupport (= 3.2.3)
31
+ arel (~> 3.0.2)
32
+ tzinfo (~> 0.3.29)
33
+ activeresource (3.2.3)
34
+ activemodel (= 3.2.3)
35
+ activesupport (= 3.2.3)
36
+ activesupport (3.2.3)
37
+ i18n (~> 0.6)
38
+ multi_json (~> 1.0)
39
+ acts-as-taggable-on (2.2.2)
40
+ rails (~> 3.0)
41
+ acts_as_commentable (3.0.1)
42
+ acts_as_list (0.1.6)
43
+ addressable (2.2.8)
44
+ ajax-chosen-rails (0.2.0)
45
+ chosen-rails_ffcrm
46
+ railties (~> 3.0)
47
+ thor (~> 0.14)
48
+ arel (3.0.2)
49
+ authlogic (3.1.0)
50
+ activerecord (>= 3.0.7)
51
+ activerecord (>= 3.0.7)
52
+ authlogic_cloudfuji (0.9.4)
53
+ authlogic
54
+ rubycas-client (= 2.2.1)
55
+ builder (3.0.0)
56
+ cancan (1.6.7)
57
+ chosen-rails_ffcrm (0.9.5)
58
+ railties (~> 3.0)
59
+ thor (~> 0.14)
60
+ chronic (0.6.7)
61
+ cloudfuji (0.0.39)
62
+ highline (>= 1.6.1)
63
+ json (>= 1.4.6)
64
+ orm_adapter (~> 0.0.3)
65
+ rest-client (>= 1.6.1)
66
+ cocaine (0.2.1)
67
+ css_parser (1.2.6)
68
+ addressable
69
+ rdoc
70
+ dynamic_form (1.1.4)
71
+ email_reply_parser_ffcrm (0.5.0)
72
+ erubis (2.7.0)
73
+ fat_free_crm (0.11.3)
74
+ acts-as-taggable-on (~> 2.2.1)
75
+ acts_as_commentable (~> 3.0.1)
76
+ acts_as_list (~> 0.1.4)
77
+ ajax-chosen-rails (>= 0.2.0)
78
+ authlogic (~> 3.1.0)
79
+ cancan
80
+ chosen-rails_ffcrm
81
+ dynamic_form
82
+ email_reply_parser_ffcrm
83
+ ffaker (>= 1.12.0)
84
+ haml (~> 3.1.3)
85
+ jquery-rails
86
+ nokogiri
87
+ paper_trail
88
+ paperclip (~> 2.7.0)
89
+ premailer
90
+ prototype-rails
91
+ rails (~> 3.2.2)
92
+ ransack_ffcrm (~> 0.6.0)
93
+ responds_to_parent_ffcrm
94
+ sass (~> 3.1.10)
95
+ simple_form (~> 2.0.1)
96
+ squeel (~> 0.9.3)
97
+ will_paginate (~> 3.0.2)
98
+ ffaker (1.14.0)
99
+ haml (3.1.5)
100
+ highline (1.6.11)
101
+ hike (1.2.1)
102
+ htmlentities (4.3.1)
103
+ i18n (0.6.0)
104
+ journey (1.0.3)
105
+ jquery-rails (2.0.2)
106
+ railties (>= 3.2.0, < 5.0)
107
+ thor (~> 0.14)
108
+ json (1.7.0)
109
+ mail (2.4.4)
110
+ i18n (>= 0.4.0)
111
+ mime-types (~> 1.16)
112
+ treetop (~> 1.4.8)
113
+ mime-types (1.18)
114
+ multi_json (1.3.4)
115
+ nokogiri (1.5.2)
116
+ orm_adapter (0.0.7)
117
+ paper_trail (2.6.3)
118
+ activerecord (~> 3.0)
119
+ railties (~> 3.0)
120
+ paperclip (2.7.0)
121
+ activerecord (>= 2.3.0)
122
+ activesupport (>= 2.3.2)
123
+ cocaine (>= 0.0.2)
124
+ mime-types
125
+ polyamorous (0.5.0)
126
+ activerecord (~> 3.0)
127
+ polyglot (0.3.3)
128
+ premailer (1.7.3)
129
+ css_parser (>= 1.1.9)
130
+ htmlentities (>= 4.0.0)
131
+ prototype-rails (3.2.1)
132
+ rails (~> 3.2)
133
+ rack (1.4.1)
134
+ rack-cache (1.2)
135
+ rack (>= 0.4)
136
+ rack-ssl (1.3.2)
137
+ rack
138
+ rack-test (0.6.1)
139
+ rack (>= 1.0)
140
+ rails (3.2.3)
141
+ actionmailer (= 3.2.3)
142
+ actionpack (= 3.2.3)
143
+ activerecord (= 3.2.3)
144
+ activeresource (= 3.2.3)
145
+ activesupport (= 3.2.3)
146
+ bundler (~> 1.0)
147
+ railties (= 3.2.3)
148
+ railties (3.2.3)
149
+ actionpack (= 3.2.3)
150
+ activesupport (= 3.2.3)
151
+ rack-ssl (~> 1.3.2)
152
+ rake (>= 0.8.7)
153
+ rdoc (~> 3.4)
154
+ thor (~> 0.14.6)
155
+ rake (0.9.2.2)
156
+ ransack_ffcrm (0.6.0)
157
+ actionpack (~> 3.0)
158
+ activerecord (~> 3.0)
159
+ chronic (~> 0.6.7)
160
+ polyamorous (~> 0.5.0)
161
+ rdoc (3.12)
162
+ json (~> 1.4)
163
+ responds_to_parent_ffcrm (1.1.0)
164
+ rest-client (1.6.7)
165
+ mime-types (>= 1.16)
166
+ rubycas-client (2.2.1)
167
+ activesupport
168
+ sass (3.1.16)
169
+ simple_form (2.0.2)
170
+ actionpack (~> 3.0)
171
+ activemodel (~> 3.0)
172
+ sprockets (2.1.3)
173
+ hike (~> 1.2)
174
+ rack (~> 1.0)
175
+ tilt (~> 1.1, != 1.3.0)
176
+ squeel (0.9.5)
177
+ activerecord (~> 3.0)
178
+ activesupport (~> 3.0)
179
+ polyamorous (~> 0.5.0)
180
+ thor (0.14.6)
181
+ tilt (1.3.3)
182
+ treetop (1.4.10)
183
+ polyglot
184
+ polyglot (>= 0.3.1)
185
+ tzinfo (0.3.33)
186
+ will_paginate (3.0.3)
187
+
188
+ PLATFORMS
189
+ ruby
190
+
191
+ DEPENDENCIES
192
+ fat_free_crm
193
+ ffcrm_cloudfuji!
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 [name of plugin creator]
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,6 @@
1
+ Fat Free CRM - Cloudfuji Integration
2
+ ====================================
3
+
4
+ Integrates Fat Free CRM with the Cloudfuji hosting platform.
5
+
6
+ Copyright (c) 2012 Cloudfuji
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../../../../config/application', __FILE__)
5
+ require 'rake'
6
+
7
+ FatFreeCRM::Application.load_tasks
@@ -0,0 +1 @@
1
+ require 'fat_free_crm/cloudfuji'
data/config/routes.rb ADDED
@@ -0,0 +1,14 @@
1
+ begin
2
+ Rails.application.routes.draw do
3
+ cloudfuji_routes
4
+ end
5
+ rescue => e
6
+ puts "Error loading the Cloudfuji routes:"
7
+ puts "#{e.inspect}"
8
+ end
9
+
10
+ FatFreeCRM::Application.routes.draw do
11
+
12
+ cloudfuji_authentication_routes if Cloudfuji::Platform.on_cloudfuji?
13
+
14
+ end
@@ -0,0 +1,128 @@
1
+ # Fat Free CRM
2
+ # Copyright (C) 2008-2011 by Michael Dvorkin
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU Affero General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU Affero General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Affero General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ #------------------------------------------------------------------------------
17
+
18
+ #
19
+ # Default application settings to be loaded during installation:
20
+ #
21
+ # rake crm:settings:load
22
+ #
23
+
24
+ # Host
25
+ #------------------------------------------------------------------------------
26
+ # Host for URLS when action mailer generates emails.
27
+ #
28
+ # When sending email, you will need to set the host name so that the mailer can
29
+ # generate urls inside emails that point back to your site. Unlike controllers
30
+ # from Action Pack, the mailer instance doesn’t have any context about the
31
+ # incoming request, so you’ll need to provide all of the details needed to
32
+ # generate a URL.
33
+ #
34
+ # :host: "http://www.example.com"
35
+ #
36
+ :host: http://<%= ENV['CLOUDFUJI_DOMAIN'] %>/
37
+
38
+ # Base URL
39
+ #------------------------------------------------------------------------------
40
+ # Leave base_url blank if Fat Free CRM has been deployed in root URL, otherwise
41
+ # specify subdirectory. For example, when deployed to:
42
+ #
43
+ # http://www.domain.com => :base_url: "" # (leave blank)
44
+ # http://crm.domain.com => :base_url: "" # (leave blank)
45
+ # http://www.domain.com/crm => :base_url: "/crm" # (without trailing slash)
46
+ # http://www.domain.com/a/crm => :base_url: "/a/crm" # (without trailing slash)
47
+ #
48
+ :base_url: ""
49
+
50
+ # Locale
51
+ #------------------------------------------------------------------------------
52
+ # Default locale is American English.
53
+ #
54
+ :locale: "en-US"
55
+
56
+ # By default individual users can't pick their own locale and are presented
57
+ # with the one set above. To enable language selection in User/Profile set
58
+ # the following option to true.
59
+ #
60
+ :per_user_locale: false
61
+
62
+ # User Signup
63
+ #------------------------------------------------------------------------------
64
+ # The following setting controls user signup. Possible values are:
65
+ # :allowed -- users can sign up and use the system once they have registered.
66
+ # :not_allowed -- users can only be added by system administrator. This is the default.
67
+ # :needs_approval -- users can sign up but must be approved before they can use the system.
68
+ #
69
+ :user_signup: :not_allowed
70
+
71
+ # Default records permissions
72
+ #------------------------------------------------------------------------------
73
+ # Set the defaults permission for new records. Possible values are:
74
+ # Private -- private access, only for the creator of the record.
75
+ # Public -- public access, share with everyone. This is the default.
76
+ # Shared -- shared with selected accounts, should be selected by the user.
77
+ #
78
+ :default_access: "Public"
79
+
80
+ # Require last name on Leads and Contacts
81
+ #------------------------------------------------------------------------------
82
+ # If this validation is disabled, records will only require a first name.
83
+ #
84
+ :require_last_names: true
85
+
86
+
87
+ # Background information
88
+ #------------------------------------------------------------------------------
89
+ # Specify model names that should have background information displayed. Select any combination
90
+ # from the following list. By default no background information is shown.
91
+ # :background_info:
92
+ # - :account
93
+ # - :campaign
94
+ # - :contact
95
+ # - :lead
96
+ # - :opportunity
97
+ # - :task
98
+ #
99
+ :background_info: []
100
+
101
+ # Address format
102
+ #------------------------------------------------------------------------------
103
+ # Sets the address format for Accounts, Contacts, and Leads.
104
+ # true -- use separate street1, street2, city, state, zipcode, and country field.
105
+ # false -- use single text area field to enter the entire address. This is the default.
106
+ #
107
+ :compound_address: true
108
+
109
+ # Dropdown calendar format
110
+ #------------------------------------------------------------------------------
111
+ # The following setting controls whether to show time in dropdown calendar
112
+ # when scheduling a task for specific date.
113
+ # true -- allow selecting date and time.
114
+ # false -- allow selecting date only. This is the default.
115
+ #
116
+ task_calendar_with_time: false
117
+
118
+
119
+ # Beta features
120
+ #------------------------------------------------------------------------------
121
+ # These are features that need to be in the master branch due to extensive codebase changes,
122
+ # but are disabled by default until ready for general use.
123
+
124
+ # - Ransack advanced search
125
+ :advanced_search_enabled: true
126
+
127
+ # - PaperTrail history UI
128
+ :paper_trail_ui_enabled: true
@@ -0,0 +1,6 @@
1
+ class AddCloudfujiFieldsToUsers < ActiveRecord::Migration
2
+ def change
3
+ add_column :users, :ido_id, :text
4
+ add_column :users, :locale, :string
5
+ end
6
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'fat_free_crm/cloudfuji/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'ffcrm_cloudfuji'
7
+ s.authors = ['Sean Grove', 'Nathan Broadbent']
8
+ s.email = 's@cloudfuji.com'
9
+ s.homepage = 'http://cloudfuji.com'
10
+ s.summary = 'Fat Free CRM - Cloudfuji Integration'
11
+ s.description = 'Integrates Fat Free CRM with the Cloudfuji hosting platform.'
12
+ s.files = `git ls-files`.split("\n")
13
+ s.version = FatFreeCRM::Cloudfuji::VERSION
14
+
15
+ s.add_dependency 'fat_free_crm', '>= 0.11.3'
16
+ s.add_dependency 'cloudfuji'
17
+ s.add_dependency 'authlogic_cloudfuji', '~> 0.9'
18
+
19
+ end
data/install.rb ADDED
@@ -0,0 +1 @@
1
+ # Install hook code here
@@ -0,0 +1,6 @@
1
+ module FatFreeCRM
2
+ module Cloudfuji
3
+ class Engine < Rails::Engine
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,25 @@
1
+ module Cloudfuji
2
+ module EventObservers
3
+ class AppObserver < Cloudfuji::EventObserver
4
+ def app_claimed
5
+ puts "Updating #{User.first.inspect} with incoming data #{params.inspect}"
6
+ puts "Authlogic username column: #{::Authlogic::Cas.cas_username_column}="
7
+ puts "Setting username to: #{params.try(:[], 'ido_id')}"
8
+
9
+ user = User.first
10
+ if user
11
+ data = params['data']
12
+
13
+ user.email = data['email']
14
+ user.first_name = user.email.split('@').first
15
+ user.last_name = user.email.split('@').last
16
+ user.username = data['email']
17
+ user.deleted_at = nil
18
+ user.send("#{::Authlogic::Cas.cas_username_column}=".to_sym, params['data'].try(:[], 'ido_id'))
19
+ puts user.inspect
20
+ user.save!
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,54 @@
1
+ module Cloudfuji
2
+ module EventObservers
3
+ class CustomerObserver < Cloudfuji::EventObserver
4
+ # "customer_created"
5
+ # :account_balance => 0
6
+ # :object => "customer"
7
+ # :email => "s+cfdemo@cloudfuji.com"
8
+ # :created => 1332269951
9
+ # :id => "cus_cpkg4h0KfLD3lp"
10
+ # :livemode => true
11
+ # :human => "Customer CREATED (cus_cpkg4h0KfLD3lp), s+cfdemo@cloudfuji.com"}
12
+ def customer_created
13
+ note_customer_activity("#{data['email']} created as a customer with external id #{data['id']}") if data['livemode']
14
+ end
15
+
16
+ def customer_signed_up
17
+ note_customer_activity("#{data['first_name']} #{data['last_name']} (#{data['email']}) signed up as a customer")
18
+ end
19
+
20
+ private
21
+
22
+ def note_customer_activity(message)
23
+ subject = find_or_create_activity_subject!
24
+ puts "Found subject: #{subject.inspect}"
25
+
26
+ subject.versions.create! :event => message
27
+ end
28
+
29
+ def data
30
+ params['data']
31
+ end
32
+
33
+ def find_or_create_activity_subject!
34
+ lookups = [Account, Lead, Contact]
35
+ lookups.each do |model|
36
+ puts "#{model}.find_by_email( #{data['email']} )"
37
+ result = model.find_by_email(data['email'])
38
+ return result if result
39
+ end
40
+
41
+ lead = Lead.find_by_email(data['email'])
42
+ lead ||= Lead.new
43
+
44
+ lead.email = data['email']
45
+ lead.first_name ||= data['first_name'] || recipient.split("@").first if lead.first_name.blank?
46
+ lead.last_name ||= data['last_name'] || recipient.split("@").last if lead.last_name.blank?
47
+
48
+ lead.save
49
+
50
+ lead
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,124 @@
1
+ module Cloudfuji
2
+ module EventObservers
3
+ class EmailObserver < Cloudfuji::EventObserver
4
+ # NOTE: It'd be nice to have a before_filter.
5
+
6
+ # "email_delivered"
7
+ # :message_headers => "[[\"Received\", \"by luna.mailgun.net with SMTP mgrt 7313261; Tue, 20 Mar 2012 19:00:58 +0000\"], [\"Received\", \"from localhost.localdomain (ec2-23-20-14-40.compute-1.amazonaws.com [23.20.14.40]) by mxa.mailgun.org with ESMTP id 4f68d3e9.4ddcdf0-luna; Tue, 20 Mar 2012 19:00:57 -0000 (UTC)\"], [\"Date\", \"Tue, 20 Mar 2012 19:00:57 +0000\"], [\"From\", \"Sean Grove <sean@cloudfuji.com>\"], [\"Reply-To\", \"Cloudfuji Team <support@cloudfuji.com>\"], [\"Message-Id\", \"<4f68d3e9ad834_3c29377ea432615@ip-10-190-150-17.mail>\"], [\"X-Mailgun-Campaign-Id\", \"cloudfuji_buddies\"], [\"Repy-To\", \"support@cloudfuji.com\"], [\"To\", \"s+cfdemo@cloudfuji.com\"], [\"Subject\", \"Cloudfuji Beta: Thank you for your early support. Here's a gift for you.\"], [\"List-Unsubscribe\", \"<mailto:u+na6wcn3gmqzdszbsmrrdam3ghfstkzrxgbstgn3fgvtdgzjumvrgmyzgmm6tqnlkgetheplteuzeey3gmrsw23zfgqyge5ltnbus4zdpez2d2jjsietgipjrmi4a@email.cloudfuji.com>\"], [\"X-Mailgun-Sid\", \"WyI2NWQ4MSIsICJzK2NmZGVtb0BidXNoaS5kbyIsICIxYjgiXQ==\"], [\"Sender\", \"sean=cloudfuji.com@cloudfuji.com\"]]"
8
+ # :message_id =>"<4f68d3e9ad834_3c29377ea432615@ip-10-190-150-17.mail>"
9
+ # :recipient => "s+cfdemo@cloudfuji.com"
10
+ # :domain => "cloudfuji.com"
11
+ # :custom_variables => nil
12
+ # :human =>"Mail to s+cfdemo@cloudfuji.com successfully delievered."}}
13
+ def email_delivered
14
+ message = ""
15
+ message += "Email delivered to #{recipient}"
16
+ message += " in email campaign '#{campaign.titleize}'" if campaign
17
+
18
+ note_email_activity( message.strip )
19
+ end
20
+
21
+ # "email_opened"
22
+ # :recipient=>"s+cfdemo@cloudfuji.com"
23
+ # :domain=>"cloudfuji.com"
24
+ # :campaign_id=>"cloudfuji_buddies"
25
+ # :campaign_name=>"Cloudfuji Buddies"
26
+ # :tag=>nil
27
+ # :mailing_list=>nil
28
+ # :custom_variables=>nil
29
+ def email_opened
30
+ message = ""
31
+ message += "Email opened by #{recipient}"
32
+ message += " in email campaign '#{campaign.titleize}" if campaign
33
+
34
+ note_email_activity( message.strip )
35
+ end
36
+
37
+ # :event=>"clicked"
38
+ # :recipient=>"s+cfdemo@cloudfuji.com"
39
+ # :domain=>"cloudfuji.com"
40
+ # :campaign_id=>"cloudfuji_buddies"
41
+ # :campaign_name=>"Cloudfuji Buddies"
42
+ # :tag=>nil
43
+ # :mailing_list=>nil
44
+ # :custom_variables=>nil
45
+ # :url=>"https://cloudfuji.com/cas/invite/?invitation_token=8hswc7kqhPys6FsUJ1Nm&service=https://cloudfuji.com/users/service&redirect=https://cloudfuji.com/apps/new?app=fat_free_crm&src=icon"
46
+ # :human=>"s+cfdemo@cloudfuji.com clicked on link in Cloudfuji Buddies to https://cloudfuji.com/cas/invite/?invitation_token=8hswc7kqhPys6FsUJ1Nm&service=https://cloudfuji.com/users/service&redirect=https://cloudfuji.com/apps/new?app=fat_free_crm&src=icon"}
47
+ def email_clicked
48
+ message = "#{recipient} clicked #{data['url']}"
49
+ message += "in email campaign '#{campaign.titleize}" if campaign
50
+
51
+ note_email_activity(message)
52
+ end
53
+
54
+
55
+ def email_subscribed
56
+ note_email_activity("#{recipient} subscribed to a mailing list")
57
+ end
58
+
59
+ private
60
+
61
+ def note_email_activity(message)
62
+ subject = find_or_create_activity_subject!
63
+ puts "Found subject: #{subject.inspect}"
64
+
65
+ subject.versions.create! :event => message
66
+ end
67
+
68
+ def data
69
+ params['data']
70
+ end
71
+
72
+ def find_or_create_activity_subject!
73
+ lookups = [Account, Lead, Contact]
74
+ lookups.each do |model|
75
+ puts "#{model}.find_by_email( #{recipient} )"
76
+ result = model.find_by_email(recipient)
77
+ return result if result
78
+ end
79
+
80
+ puts "No pre-existing records found, creating a lead"
81
+ lead = Lead.find_by_email(recipient)
82
+ lead ||= Lead.new
83
+
84
+ lead.email = recipient
85
+ lead.first_name = recipient.split("@").first if lead.first_name.blank?
86
+ lead.last_name = recipient.split("@").last if lead.last_name.blank?
87
+ lead.user = User.first if lead.user_id.nil?
88
+
89
+ puts "About to save:"
90
+ puts lead.inspect
91
+
92
+ lead.save!
93
+
94
+ puts lead.inspect
95
+
96
+ lead
97
+ end
98
+
99
+ # Temp workarounds until umi delivers events properly
100
+ # Good example of the necessity of deep-schema enforcement for events
101
+ def headers
102
+ begin
103
+ JSON(data['message_headers'])
104
+ rescue => e
105
+ return []
106
+ end
107
+ end
108
+
109
+ def recipient
110
+ data['recipient']
111
+ end
112
+
113
+ def custom_variables
114
+ JSON(data['custom_variables'])
115
+ end
116
+
117
+ def campaign
118
+ campaign = data['campaign_id'] || data['campaign_name']
119
+ campaign ||= headers.select{|key, value| key == "X-Mailgun-Campaign-Id"}.try(:first).try(:last) unless headers.empty?
120
+ campaign
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,7 @@
1
+ module Cloudfuji
2
+ module EventObservers
3
+ class PaymentObserver < Cloudfuji::EventObserver
4
+ # NOTE: It'd be nice to have a before_filter.
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,52 @@
1
+ module Cloudfuji
2
+ module EventObservers
3
+ class UserObserver < Cloudfuji::EventObserver
4
+ def user_added
5
+ puts "Adding a new user with incoming data #{params.inspect}"
6
+ puts "Authlogic username column: #{::Authlogic::Cas.cas_username_column}="
7
+ puts "Setting username to: #{params['data'].try(:[], 'ido_id')}"
8
+
9
+ data = params['data']
10
+
11
+ user = User.unscoped.find_or_create_by_ido_id(data['ido_id'])
12
+
13
+ user.email = data['email']
14
+ user.first_name = user.email.split('@').first
15
+ user.last_name = user.email.split('@').last
16
+ user.username = data['email']
17
+ user.deleted_at = nil
18
+ user.send("#{::Authlogic::Cas.cas_username_column}=".to_sym, data.try(:[], 'ido_id'))
19
+
20
+ puts user.inspect
21
+
22
+ user.save!
23
+ end
24
+
25
+ def user_removed
26
+ puts "Removing user based on incoming data #{params.inspect}"
27
+ puts "Authlogic username column: #{::Authlogic::Cas.cas_username_column}="
28
+
29
+ user = User.unscoped.find_by_ido_id(params['data']['ido_id'])
30
+
31
+ # TODO: Disable the user instead of destroying them (to prevent data loss)
32
+ user.try(:destroy)
33
+ end
34
+
35
+ def user_updated
36
+ puts "Updating user based on incoming data #{params.inspect}"
37
+ puts "Authlogic username column: #{::Authlogic::Cas.cas_username_column}="
38
+
39
+ data = params['data']
40
+ user = User.unscoped.find_by_ido_id(data['ido_id'])
41
+
42
+ if user
43
+ # Re-use the CAS login method to set all the extra attributes we
44
+ # care about (first_name, last_name, email, local, timezone,
45
+ # etc.)
46
+ user.cloudfuji_extra_attributes(data)
47
+ user.save
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,5 @@
1
+ module FatFreeCRM
2
+ module Cloudfuji
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1,79 @@
1
+ module FatFreeCRM
2
+ module Cloudfuji
3
+ class << self
4
+ def enable_cloudfuji!
5
+ load_observers!
6
+ extend_user!
7
+ setup_authentication!
8
+ end
9
+
10
+ def extend_user!
11
+ puts "Extending the user model"
12
+ User.instance_eval do
13
+ include ::Cloudfuji::UserHelper
14
+
15
+ validates_presence_of :ido_id
16
+ validates_uniqueness_of :ido_id
17
+
18
+ before_create :make_admin
19
+ end
20
+
21
+ User.class_eval do
22
+ def make_admin
23
+ self.admin = true
24
+ end
25
+
26
+ def cloudfuji_extra_attributes(extra_attributes)
27
+ self.first_name = extra_attributes["first_name"]
28
+ self.last_name = extra_attributes["last_name"]
29
+ self.locale = extra_attributes["locale"]
30
+ self.email = extra_attributes["email"]
31
+ self.username ||= extra_attributes["email"].split("@").first
32
+ end
33
+ end
34
+ end
35
+
36
+ def load_observers!
37
+ Dir[File.expand_path("../cloudfuji/event_observers/*.rb", __FILE__)].each { |file| require file }
38
+ end
39
+
40
+ def setup_authentication!
41
+ Authlogic::Cas.actor_model = User
42
+ Authlogic::Cas.authentication_model = Authentication
43
+ Authlogic::Cas.setup_authentication
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+
50
+ module ActionDispatch::Routing
51
+ class RouteSet
52
+ Mapper.class_eval do
53
+ def cloudfuji_authentication_routes
54
+ Rails.application.routes.draw do
55
+ scope :module => :authlogic do
56
+ scope :module => :cas do
57
+ match "login" => "cas_authentication#new_cas_session", :as => :login
58
+ match "logout" => "cas_authentication#destroy_cas_session", :as => :logout
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+
68
+ if Cloudfuji::Platform.on_cloudfuji?
69
+ class CloudfujiRailtie < Rails::Railtie
70
+ # Enabling it via this hook means that it'll be reloaded on each
71
+ # request in development mode, so you can make changes in here and
72
+ # it'll be immeidately reflected
73
+ config.to_prepare do
74
+ puts "Enabling Cloudfuji"
75
+ FatFreeCRM::Cloudfuji.enable_cloudfuji!
76
+ puts "Finished enabling Cloudfuji"
77
+ end
78
+ end
79
+ end
@@ -0,0 +1 @@
1
+ require 'fat_free_crm/cloudfuji/engine'
data/uninstall.rb ADDED
@@ -0,0 +1 @@
1
+ # Uninstall hook code here
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ffcrm_cloudfuji
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sean Grove
9
+ - Nathan Broadbent
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-05-10 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: fat_free_crm
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 0.11.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: 0.11.3
31
+ - !ruby/object:Gem::Dependency
32
+ name: cloudfuji
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: authlogic_cloudfuji
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '0.9'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '0.9'
63
+ description: Integrates Fat Free CRM with the Cloudfuji hosting platform.
64
+ email: s@cloudfuji.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - .gitignore
70
+ - Gemfile
71
+ - Gemfile.lock
72
+ - MIT-LICENSE
73
+ - README
74
+ - Rakefile
75
+ - config/initializers/cloudfuji.rb
76
+ - config/routes.rb
77
+ - config/settings.yml
78
+ - db/migrate/20120227184555_add_cloudfuji_fields_to_users.rb
79
+ - ffcrm_cloudfuji.gemspec
80
+ - install.rb
81
+ - lib/fat_free_crm/cloudfuji.rb
82
+ - lib/fat_free_crm/cloudfuji/engine.rb
83
+ - lib/fat_free_crm/cloudfuji/event_observers/app_observer.rb
84
+ - lib/fat_free_crm/cloudfuji/event_observers/customer_observer.rb
85
+ - lib/fat_free_crm/cloudfuji/event_observers/email_observer.rb
86
+ - lib/fat_free_crm/cloudfuji/event_observers/payment_observer.rb
87
+ - lib/fat_free_crm/cloudfuji/event_observers/user_observer.rb
88
+ - lib/fat_free_crm/cloudfuji/version.rb
89
+ - lib/ffcrm_cloudfuji.rb
90
+ - uninstall.rb
91
+ homepage: http://cloudfuji.com
92
+ licenses: []
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ! '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 1.8.24
112
+ signing_key:
113
+ specification_version: 3
114
+ summary: Fat Free CRM - Cloudfuji Integration
115
+ test_files: []