fat_free_crm 0.11.0 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fat_free_crm might be problematic. Click here for more details.

Files changed (212) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +2 -2
  3. data/Gemfile +15 -2
  4. data/Gemfile.lock +34 -14
  5. data/README.md +37 -124
  6. data/app/assets/javascripts/application.js.erb +1 -1
  7. data/app/assets/javascripts/crm.js +22 -1
  8. data/app/assets/javascripts/crm_fields.js +2 -3
  9. data/app/assets/javascripts/jquery-noconflict.js +17 -0
  10. data/app/assets/stylesheets/application.css.erb +1 -0
  11. data/app/assets/stylesheets/common.scss +26 -0
  12. data/app/assets/stylesheets/ffcrm_chosen.scss +1 -1
  13. data/app/controllers/admin/application_controller.rb +1 -1
  14. data/app/controllers/application_controller.rb +0 -8
  15. data/app/controllers/{accounts_controller.rb → entities/accounts_controller.rb} +1 -13
  16. data/app/controllers/{campaigns_controller.rb → entities/campaigns_controller.rb} +1 -13
  17. data/app/controllers/{contacts_controller.rb → entities/contacts_controller.rb} +1 -7
  18. data/app/controllers/{leads_controller.rb → entities/leads_controller.rb} +1 -1
  19. data/app/controllers/{opportunities_controller.rb → entities/opportunities_controller.rb} +1 -7
  20. data/app/controllers/{tasks_controller.rb → entities/tasks_controller.rb} +1 -1
  21. data/app/controllers/{base_controller.rb → entities_controller.rb} +32 -1
  22. data/app/controllers/home_controller.rb +9 -9
  23. data/app/controllers/lists_controller.rb +17 -0
  24. data/app/helpers/admin/tags_helper.rb +1 -1
  25. data/app/helpers/application_helper.rb +14 -14
  26. data/app/helpers/crm_tags_helper.rb +1 -1
  27. data/app/helpers/home_helper.rb +13 -15
  28. data/app/helpers/lists_helper.rb +17 -0
  29. data/app/inputs/date_time_input.rb +17 -0
  30. data/app/inputs/text_input.rb +17 -1
  31. data/app/models/{base → entities}/account.rb +0 -1
  32. data/app/models/{base → entities}/account_contact.rb +0 -0
  33. data/app/models/{base → entities}/account_opportunity.rb +0 -0
  34. data/app/models/{base → entities}/campaign.rb +0 -1
  35. data/app/models/{base → entities}/contact.rb +0 -1
  36. data/app/models/{base → entities}/contact_opportunity.rb +0 -0
  37. data/app/models/{base → entities}/lead.rb +0 -1
  38. data/app/models/{base → entities}/opportunity.rb +0 -1
  39. data/app/models/{base → entities}/task.rb +5 -6
  40. data/app/models/list.rb +17 -0
  41. data/app/models/observers/lead_observer.rb +39 -0
  42. data/app/models/observers/opportunity_observer.rb +54 -0
  43. data/app/models/observers/task_observer.rb +41 -0
  44. data/app/models/polymorphic/address.rb +1 -3
  45. data/app/models/polymorphic/avatar.rb +0 -5
  46. data/app/models/polymorphic/comment.rb +2 -11
  47. data/app/models/polymorphic/email.rb +2 -9
  48. data/app/models/polymorphic/tag.rb +17 -0
  49. data/app/models/polymorphic/tagging.rb +17 -0
  50. data/app/models/users/ability.rb +13 -0
  51. data/app/models/users/user.rb +1 -4
  52. data/app/views/accounts/_account.html.haml +10 -6
  53. data/app/views/accounts/index.html.haml +1 -1
  54. data/app/views/accounts/show.html.haml +6 -24
  55. data/app/views/admin/fields/_field.html.haml +6 -6
  56. data/app/views/admin/tags/_tag.html.haml +2 -2
  57. data/app/views/admin/tags/index.html.haml +1 -1
  58. data/app/views/admin/users/_user.html.haml +3 -3
  59. data/app/views/admin/users/index.html.haml +1 -1
  60. data/app/views/campaigns/_campaign.html.haml +9 -5
  61. data/app/views/campaigns/index.html.haml +1 -1
  62. data/app/views/campaigns/show.html.haml +4 -24
  63. data/app/views/comments/_comment.html.haml +17 -14
  64. data/app/views/comments/_edit.html.haml +1 -1
  65. data/app/views/comments/_new.html.haml +3 -3
  66. data/app/views/contacts/_contact.html.haml +33 -15
  67. data/app/views/contacts/_contacts.html.haml +6 -0
  68. data/app/views/contacts/_sidebar_show.html.haml +1 -1
  69. data/app/views/contacts/index.html.haml +1 -1
  70. data/app/views/contacts/show.html.haml +3 -19
  71. data/app/views/emails/_email.html.haml +24 -21
  72. data/app/views/{base → entities}/_advanced_search.html.haml +0 -0
  73. data/app/views/{base → entities}/_condition_fields.html.haml +0 -0
  74. data/app/views/{base → entities}/_grouping_fields.html.haml +0 -0
  75. data/app/views/{base → entities}/_sort_fields.html.haml +0 -0
  76. data/app/views/{base → entities}/advanced_search.js.rjs +0 -0
  77. data/app/views/entities/contacts.js.rjs +3 -0
  78. data/app/views/entities/leads.js.rjs +3 -0
  79. data/app/views/entities/opportunities.js.rjs +3 -0
  80. data/app/views/entities/versions.js.rjs +3 -0
  81. data/app/views/home/_activity.html.haml +19 -18
  82. data/app/views/home/_events_menu.html.haml +8 -0
  83. data/app/views/home/_options.html.haml +2 -3
  84. data/app/views/home/index.html.haml +1 -1
  85. data/app/views/leads/_lead.html.haml +42 -23
  86. data/app/views/leads/_leads.html.haml +6 -0
  87. data/app/views/leads/_sidebar_show.html.haml +1 -1
  88. data/app/views/leads/index.html.haml +1 -1
  89. data/app/views/leads/show.html.haml +3 -13
  90. data/app/views/opportunities/_opportunities.html.haml +6 -0
  91. data/app/views/opportunities/_opportunity.html.haml +23 -11
  92. data/app/views/opportunities/index.html.haml +1 -1
  93. data/app/views/opportunities/show.html.haml +4 -18
  94. data/app/views/shared/_comment.html.haml +3 -3
  95. data/app/views/shared/_edit_comment.html.haml +1 -1
  96. data/app/views/shared/_recent.html.haml +4 -4
  97. data/app/views/shared/_recently.html.haml +3 -3
  98. data/app/views/shared/_timeline.html.haml +2 -3
  99. data/app/views/tasks/_assigned.html.haml +4 -4
  100. data/app/views/tasks/_completed.html.haml +2 -2
  101. data/app/views/tasks/_pending.html.haml +2 -2
  102. data/app/views/tasks/_related.html.haml +4 -5
  103. data/app/views/tasks/_tasks.html.haml +3 -0
  104. data/app/views/tasks/_title.html.haml +1 -1
  105. data/app/views/tasks/index.html.haml +1 -1
  106. data/app/views/users/_avatar.html.haml +2 -2
  107. data/app/views/versions/_version.html.haml +9 -12
  108. data/app/views/versions/_versions.html.haml +11 -0
  109. data/config/application.rb +3 -2
  110. data/config/environments/development.rb +2 -2
  111. data/config/environments/production.rb +0 -4
  112. data/config/environments/staging.rb +1 -1
  113. data/config/initializers/action_mailer.rb +9 -0
  114. data/config/initializers/paper_trail.rb +80 -0
  115. data/config/initializers/relative_url_root.rb +23 -0
  116. data/config/locales/cz_fat_free_crm.yml +1 -1
  117. data/config/locales/en-US_fat_free_crm.yml +22 -17
  118. data/config/locales/fr_fat_free_crm.yml +349 -134
  119. data/config/routes.rb +144 -140
  120. data/config/settings.default.yml +14 -2
  121. data/db/demo/addresses.yml +2 -2
  122. data/db/demo/emails.yml +2 -2
  123. data/db/migrate/20120216042541_is_paranoid_to_paper_trail.rb +1 -2
  124. data/db/migrate/20120309070209_add_versions_related.rb +6 -0
  125. data/db/migrate/20120316045804_activities_to_versions.rb +35 -0
  126. data/db/schema.rb +79 -53
  127. data/fat_free_crm.gemspec +8 -4
  128. data/lib/development_tasks/gem.rake +18 -1
  129. data/lib/development_tasks/license.rake +2 -4
  130. data/lib/development_tasks/rdoc.rake +17 -0
  131. data/lib/development_tasks/rspec.rake +17 -0
  132. data/lib/fat_free_crm.rb +20 -14
  133. data/lib/fat_free_crm/core_ext/array.rb +0 -27
  134. data/lib/fat_free_crm/dropbox.rb +11 -1
  135. data/lib/fat_free_crm/engine.rb +21 -3
  136. data/lib/fat_free_crm/gem_dependencies.rb +26 -0
  137. data/lib/fat_free_crm/gem_ext.rb +18 -1
  138. data/lib/fat_free_crm/gem_ext/active_record/schema_dumper.rb +18 -1
  139. data/lib/fat_free_crm/gem_ext/authlogic/session/cookies.rb +17 -0
  140. data/lib/fat_free_crm/gem_ext/rails/engine.rb +17 -0
  141. data/lib/fat_free_crm/gem_ext/rails/text_helper.rb +17 -0
  142. data/lib/fat_free_crm/gem_ext/rake/task.rb +17 -0
  143. data/lib/fat_free_crm/gem_ext/simple_form/action_view_extensions/form_helper.rb +18 -1
  144. data/lib/fat_free_crm/plugin_dependencies.rb +23 -5
  145. data/lib/fat_free_crm/renderers.rb +17 -0
  146. data/lib/fat_free_crm/syck_yaml.rb +17 -0
  147. data/lib/fat_free_crm/version.rb +1 -1
  148. data/lib/{country_select → plugins/country_select}/MIT-LICENSE +0 -0
  149. data/lib/{country_select → plugins/country_select}/README +0 -0
  150. data/lib/{country_select → plugins/country_select}/init.rb +0 -0
  151. data/lib/{country_select → plugins/country_select}/install.rb +0 -0
  152. data/lib/{country_select → plugins/country_select}/lib/country_select.rb +0 -0
  153. data/lib/{country_select → plugins/country_select}/uninstall.rb +0 -0
  154. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/Gemfile +0 -0
  155. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/README.textile +0 -0
  156. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/ROADMAP.textile +0 -0
  157. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/Rakefile +0 -0
  158. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/VERSION +0 -0
  159. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/gravatar_image_tag.gemspec +0 -0
  160. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/init.rb +0 -0
  161. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/lib/gravatar_image_tag.rb +0 -0
  162. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/spec/gravatar_image_tag_spec.rb +0 -0
  163. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/spec/test_helper.rb +0 -0
  164. data/lib/tasks/demo.rake +32 -29
  165. data/lib/tasks/dropbox.rake +1 -1
  166. data/lib/tasks/fat_free_crm.rake +3 -2
  167. data/lib/tasks/plugins.rake +1 -0
  168. data/spec/controllers/accounts_controller_spec.rb +7 -5
  169. data/spec/controllers/campaigns_controller_spec.rb +11 -9
  170. data/spec/controllers/contacts_controller_spec.rb +7 -5
  171. data/spec/controllers/home_controller_spec.rb +2 -2
  172. data/spec/controllers/leads_controller_spec.rb +7 -5
  173. data/spec/controllers/opportunities_controller_spec.rb +7 -5
  174. data/spec/factories/shared_factories.rb +8 -11
  175. data/spec/lib/dropbox_spec.rb +1 -0
  176. data/spec/models/polymorphic/version_spec.rb +247 -0
  177. data/spec/models/users/user_spec.rb +0 -9
  178. data/spec/spec_helper.rb +4 -0
  179. data/spec/views/home/index.haml_spec.rb +1 -1
  180. data/spec/views/home/index.rjs_spec.rb +4 -4
  181. data/spec/views/tasks/new.rjs_spec.rb +2 -2
  182. data/vendor/assets/javascripts/calendar_date_select/format_french.js +24 -0
  183. metadata +167 -126
  184. data/app/models/observers/activity_observer.rb +0 -84
  185. data/app/models/polymorphic/activity.rb +0 -106
  186. data/app/views/accounts/contacts.js.rjs +0 -3
  187. data/app/views/accounts/opportunities.js.rjs +0 -3
  188. data/app/views/campaigns/leads.js.rjs +0 -3
  189. data/app/views/campaigns/opportunities.js.rjs +0 -3
  190. data/app/views/contacts/opportunities.js.rjs +0 -3
  191. data/app/views/home/_actions_menu.html.haml +0 -8
  192. data/lib/dynamic_form/MIT-LICENSE +0 -20
  193. data/lib/dynamic_form/README +0 -13
  194. data/lib/dynamic_form/Rakefile +0 -10
  195. data/lib/dynamic_form/dynamic_form.gemspec +0 -12
  196. data/lib/dynamic_form/init.rb +0 -2
  197. data/lib/dynamic_form/lib/action_view/helpers/dynamic_form.rb +0 -301
  198. data/lib/dynamic_form/lib/action_view/locale/en-US.yml +0 -8
  199. data/lib/dynamic_form/lib/dynamic_form.rb +0 -6
  200. data/lib/dynamic_form/test/dynamic_form_i18n_test.rb +0 -42
  201. data/lib/dynamic_form/test/dynamic_form_test.rb +0 -370
  202. data/lib/dynamic_form/test/test_helper.rb +0 -10
  203. data/lib/responds_to_parent/MIT-LICENSE +0 -20
  204. data/lib/responds_to_parent/README +0 -47
  205. data/lib/responds_to_parent/Rakefile +0 -22
  206. data/lib/responds_to_parent/init.rb +0 -2
  207. data/lib/responds_to_parent/install.rb +0 -2
  208. data/lib/responds_to_parent/lib/responds_to_parent.rb +0 -70
  209. data/lib/responds_to_parent/test/responds_to_parent_test.rb +0 -11
  210. data/lib/responds_to_parent/test/test_helper.rb +0 -7
  211. data/lib/responds_to_parent/uninstall.rb +0 -2
  212. data/spec/models/polymorphic/activity_spec.rb +0 -303
@@ -1,17 +1,14 @@
1
1
  FactoryGirl.define do
2
- factory :activity do
3
- user
4
- subject { raise "Please specify :subject for the activity" }
5
- action nil
6
- info nil
7
- private false
8
- updated_at { FactoryGirl.generate(:time) }
2
+ factory :version do
3
+ whodunnit ""
4
+ item { raise "Please specify :item for the version" }
5
+ event "create"
9
6
  created_at { FactoryGirl.generate(:time) }
10
7
  end
11
8
 
12
9
 
13
10
  factory :comment do
14
- user
11
+ user
15
12
  commentable { raise "Please specify :commentable for the comment" }
16
13
  title { FactoryGirl.generate(:title) }
17
14
  private false
@@ -24,7 +21,7 @@ FactoryGirl.define do
24
21
 
25
22
  factory :email do
26
23
  imap_message_id { "%08x" % rand(0xFFFFFFFF) }
27
- user
24
+ user
28
25
  mediator { raise "Please specify :mediator for the email" }
29
26
  sent_from { Faker::Internet.email }
30
27
  sent_to { Faker::Internet.email }
@@ -59,7 +56,7 @@ FactoryGirl.define do
59
56
 
60
57
 
61
58
  factory :avatar do
62
- user
59
+ user
63
60
  entity { raise "Please specify :entity for the avatar" }
64
61
  image_file_size nil
65
62
  image_file_name nil
@@ -67,4 +64,4 @@ FactoryGirl.define do
67
64
  updated_at { FactoryGirl.generate(:time) }
68
65
  created_at { FactoryGirl.generate(:time) }
69
66
  end
70
- end
67
+ end
@@ -6,6 +6,7 @@ require "fat_free_crm/dropbox"
6
6
  describe "IMAP Dropbox" do
7
7
  before(:each) do
8
8
  @crawler = FatFreeCRM::Dropbox.new
9
+ @crawler.stub!("expunge!").and_return(true)
9
10
  end
10
11
 
11
12
  def mock_imap
@@ -0,0 +1,247 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: versions
4
+ #
5
+ # id :integer not null, primary key
6
+ # user_id :integer
7
+ # item_id :integer
8
+ # item_type :string(255)
9
+ # event :string(32) default("create")
10
+ # info :string(255) default("")
11
+ # private :boolean default(FALSE)
12
+ # created_at :datetime
13
+ # updated_at :datetime
14
+ #
15
+
16
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
17
+
18
+ describe Version do
19
+
20
+ before do
21
+ login
22
+ PaperTrail.whodunnit = @current_user.id.to_s
23
+ end
24
+
25
+ it "should create a new instance given valid attributes" do
26
+ FactoryGirl.create(:version, :whodunnit => PaperTrail.whodunnit, :item => FactoryGirl.create(:lead))
27
+ end
28
+
29
+ describe "with multiple version records" do
30
+ before do
31
+ @lead = FactoryGirl.create(:lead)
32
+
33
+ %w(create destroy update view).each do |event|
34
+ FactoryGirl.create(:version, :event => event, :item => @lead, :whodunnit => PaperTrail.whodunnit)
35
+ FactoryGirl.create(:version, :event => event, :item => @lead, :whodunnit => "1")
36
+ end
37
+ end
38
+
39
+ it "should select all versions except one" do
40
+ @versions = Version.for(@current_user).exclude_events(:view)
41
+ @versions.map(&:event).should == %w(create destroy update)
42
+ end
43
+
44
+ it "should select all versions except many" do
45
+ @versions = Version.for(@current_user).exclude_events(:create, :update, :destroy)
46
+ @versions.map(&:event).should == %w(view)
47
+ end
48
+
49
+ it "should select one requested version" do
50
+ @versions = Version.for(@current_user).include_events(:destroy)
51
+ @versions.map(&:event).should == %w(destroy)
52
+ end
53
+
54
+ it "should select many requested versions" do
55
+ @versions = Version.for(@current_user).include_events(:create, :update)
56
+ @versions.map(&:event).sort.should == %w(create update)
57
+ end
58
+
59
+ it "should select versions for given user" do
60
+ @versions = Version.for(@current_user)
61
+ @versions.map(&:event).sort.should == %w(create destroy update view)
62
+ end
63
+ end
64
+
65
+ %w(account campaign contact lead opportunity task).each do |item|
66
+ describe "Create, update, and delete (#{item})" do
67
+ before :each do
68
+ PaperTrail.enabled = true
69
+ @item = FactoryGirl.create(item.to_sym, :user => @current_user)
70
+ @conditions = {:item_id => @item.id, :item_type => @item.class.name, :whodunnit => PaperTrail.whodunnit}
71
+ end
72
+
73
+ it "should add a version when creating new #{item}" do
74
+ @version = Version.where(@conditions.merge(:event => 'create')).first
75
+ @version.should_not == nil
76
+ end
77
+
78
+ it "should add a version when updating existing #{item}" do
79
+ if @item.respond_to?(:full_name)
80
+ @item.update_attributes(:first_name => "Billy", :last_name => "Bones")
81
+ else
82
+ @item.update_attributes(:name => "Billy Bones")
83
+ end
84
+ @version = Version.where(@conditions.merge(:event => 'update')).first
85
+
86
+ @version.should_not == nil
87
+ end
88
+
89
+ it "should add a version when deleting #{item}" do
90
+ @item.destroy
91
+ @version = Version.where(@conditions.merge(:event => 'destroy')).first
92
+
93
+ @version.should_not == nil
94
+ end
95
+
96
+ it "should add a version when commenting on a #{item}" do
97
+ @comment = FactoryGirl.create(:comment, :commentable => @item, :user => @current_user)
98
+
99
+ @version = Version.where({:related_id => @item.id, :related_type => @item.class.name, :whodunnit => PaperTrail.whodunnit, :event => 'create'}).first
100
+ @version.should_not == nil
101
+ end
102
+ end
103
+ end
104
+
105
+ describe "Recently viewed items (task)" do
106
+ before do
107
+ PaperTrail.enabled = true
108
+ @task = FactoryGirl.create(:task)
109
+ @conditions = {:item_id => @task.id, :item_type => @task.class.name}
110
+ end
111
+
112
+ it "creating a new task should not add it to recently viewed items list" do
113
+ @versions = Version.where(@conditions)
114
+
115
+ @versions.map(&:event).should == %w(create) # but not view
116
+ end
117
+
118
+ it "updating a new task should not add it to recently viewed items list" do
119
+ @task.update_attribute(:updated_at, 1.second.ago)
120
+ @versions = Version.where(@conditions)
121
+
122
+ @versions.map(&:event).sort.should == %w(create update) # but not view
123
+ end
124
+ end
125
+
126
+ describe "Action refinements for task updates" do
127
+ before do
128
+ @task = FactoryGirl.create(:task, :user => @current_user)
129
+ @conditions = {:item_id => @task.id, :item_type => @task.class.name, :whodunnit => PaperTrail.whodunnit}
130
+ end
131
+
132
+ it "should create 'completed' task event" do
133
+ @task.update_attribute(:completed_at, 1.second.ago)
134
+ @versions = Version.where(@conditions)
135
+
136
+ @versions.map(&:event).sort.should == %w(complete)
137
+ end
138
+
139
+ it "should create 'reassigned' task event" do
140
+ @task.update_attribute(:assigned_to, @current_user.id + 1)
141
+ @versions = Version.where(@conditions)
142
+
143
+ @versions.map(&:event).sort.should == %w(reassign)
144
+ end
145
+
146
+ it "should create 'rescheduled' task event" do
147
+ @task.update_attribute(:bucket, "due_tomorrow") # FactoryGirl creates :due_asap task
148
+ @versions = Version.where(@conditions)
149
+
150
+ @versions.map(&:event).sort.should == %w(reschedule)
151
+ end
152
+ end
153
+
154
+ describe "Rejecting a lead" do
155
+ before do
156
+ @lead = FactoryGirl.create(:lead, :user => @current_user, :status => "new")
157
+ @conditions = {:item_id => @lead.id, :item_type => @lead.class.name, :whodunnit => PaperTrail.whodunnit}
158
+ end
159
+
160
+ it "should create 'rejected' lead event" do
161
+ @lead.update_attribute(:status, "rejected")
162
+ @versions = Version.where(@conditions)
163
+
164
+ @versions.map(&:event).sort.should == %w(reject)
165
+ end
166
+ end
167
+
168
+ describe "Permissions" do
169
+ before do
170
+ @user = FactoryGirl.create(:user)
171
+ Version.delete_all
172
+ PaperTrail.enabled = true
173
+ end
174
+
175
+ it "should not show the create/update versions if the item is private" do
176
+ @item = FactoryGirl.create(:account, :user => @current_user, :access => "Private")
177
+ @item.update_attribute(:updated_at, 1.second.ago)
178
+
179
+ @versions = Version.where({:item_id => @item.id, :item_type => @item.class.name})
180
+ @versions.map(&:event).sort.should == %w(create update)
181
+ @versions = Version.latest.visible_to(@user)
182
+ @versions.should == []
183
+ end
184
+
185
+ it "should not show the destroy version if the item is private" do
186
+ @item = FactoryGirl.create(:account, :user => @current_user, :access => "Private")
187
+ @item.destroy
188
+
189
+ @versions = Version.where({:item_id => @item.id, :item_type => @item.class.name})
190
+ @versions.map(&:event).sort.should == %w(create destroy)
191
+ @versions = Version.latest.visible_to(@user)
192
+ @versions.should == []
193
+ end
194
+
195
+ it "should not show create/update versions if the item was not shared with the user" do
196
+ @item = FactoryGirl.create(:account,
197
+ :user => @current_user,
198
+ :access => "Shared",
199
+ :permissions => [ FactoryGirl.build(:permission, :user => @current_user, :asset => @item) ]
200
+ )
201
+ @item.update_attribute(:updated_at, 1.second.ago)
202
+
203
+ @versions = Version.where({:item_id => @item.id, :item_type => @item.class.name})
204
+ @versions.map(&:event).sort.should == %w(create update)
205
+ @versions = Version.latest.visible_to(@user)
206
+ @versions.should == []
207
+ end
208
+
209
+ it "should not show the destroy version if the item was not shared with the user" do
210
+ @item = FactoryGirl.create(:account,
211
+ :user => @current_user,
212
+ :access => "Shared",
213
+ :permissions => [ FactoryGirl.build(:permission, :user => @current_user, :asset => @item) ]
214
+ )
215
+ @item.destroy
216
+
217
+ @versions = Version.where({:item_id => @item.id, :item_type => @item.class.name})
218
+ @versions.map(&:event).sort.should == %w(create destroy)
219
+ @versions = Version.latest.visible_to(@user)
220
+ @versions.should == []
221
+ end
222
+
223
+ it "should show create/update versions if the item was shared with the user" do
224
+ @item = FactoryGirl.create(:account,
225
+ :user => @current_user,
226
+ :access => "Shared",
227
+ :permissions => [ FactoryGirl.build(:permission, :user => @user, :asset => @item) ]
228
+ )
229
+ @item.update_attribute(:updated_at, 1.second.ago)
230
+
231
+ @versions = Version.where({:item_id => @item.id, :item_type => @item.class.name})
232
+ @versions.map(&:event).sort.should == %w(create update)
233
+ @versions = Version.latest.visible_to(@user)
234
+ @versions.map(&:event).sort.should == %w(create update)
235
+ end
236
+ end
237
+
238
+ describe "Exportable" do
239
+ before do
240
+ FactoryGirl.create(:version, :whodunnit => FactoryGirl.create(:user).id, :item => FactoryGirl.create(:account))
241
+ FactoryGirl.create(:version, :whodunnit => FactoryGirl.create(:user, :first_name => nil, :last_name => nil).id, :item => FactoryGirl.create(:account))
242
+ end
243
+ it_should_behave_like("exportable") do
244
+ let(:exported) { Version.all }
245
+ end
246
+ end
247
+ end
@@ -89,15 +89,6 @@ describe User do
89
89
  @user.destroyed?.should == true
90
90
  end
91
91
 
92
- it "once the user gets deleted all her activity records must be deleted too" do
93
- login
94
- FactoryGirl.create(:activity, :user => @user, :subject => FactoryGirl.create(:account))
95
- FactoryGirl.create(:activity, :user => @user, :subject => FactoryGirl.create(:contact))
96
- @user.activities.count.should == 2
97
- @user.destroy
98
- @user.activities.count.should == 0
99
- end
100
-
101
92
  it "once the user gets deleted all her permissions must be deleted too" do
102
93
  FactoryGirl.create(:permission, :user => @user, :asset => FactoryGirl.create(:account))
103
94
  FactoryGirl.create(:permission, :user => @user, :asset => FactoryGirl.create(:contact))
@@ -54,6 +54,10 @@ Spork.prefork do
54
54
  config.include(SharedControllerSpecs, :type => :controller)
55
55
  config.include(SharedModelSpecs, :type => :model)
56
56
 
57
+ config.before(:each) do
58
+ PaperTrail.enabled = false
59
+ end
60
+
57
61
  config.before(:each, :type => :view) do
58
62
  I18n.locale = 'en-US'
59
63
  end
@@ -8,7 +8,7 @@ describe "/home/index" do
8
8
  end
9
9
 
10
10
  it "should render list of activities if it's not empty" do
11
- assign(:activities, [ FactoryGirl.create(:activity, :action => "updated", :subject => FactoryGirl.create(:account)) ])
11
+ assign(:activities, [ FactoryGirl.create(:version, :event => "update", :item => FactoryGirl.create(:account)) ])
12
12
 
13
13
  render
14
14
  view.should render_template(:partial => "_activity")
@@ -8,12 +8,12 @@ describe "/home/index" do
8
8
  end
9
9
 
10
10
  it "should render [activity] template with @activities collection" do
11
- assign(:activities, [ FactoryGirl.create(:activity, :id => 42, :action => "updated", :subject => FactoryGirl.create(:account)) ])
11
+ assign(:activities, [ FactoryGirl.create(:version, :id => 42, :event => "update", :item => FactoryGirl.create(:account), :whodunnit => @current_user.id.to_s) ])
12
12
 
13
13
  render :template => 'home/index', :formats => [:js]
14
-
14
+
15
15
  rendered.should have_rjs("activities") do |rjs|
16
- with_tag("li[id=activity_42]")
16
+ with_tag("li[id=version_42]")
17
17
  end
18
18
  end
19
19
 
@@ -21,7 +21,7 @@ describe "/home/index" do
21
21
  assign(:activities, [])
22
22
 
23
23
  render :template => 'home/index', :formats => [:js]
24
-
24
+
25
25
  rendered.should have_rjs("activities")
26
26
  rendered.should include("No activity records found.")
27
27
  end
@@ -18,8 +18,8 @@ describe "/tasks/new" do
18
18
  end
19
19
 
20
20
  describe "new task" do
21
- before(:all) { @task_with_time = Setting.task_calendar_with_time }
22
- after(:all) { Setting.task_calendar_with_time = @task_with_time }
21
+ before { @task_with_time = Setting.task_calendar_with_time }
22
+ after { Setting.task_calendar_with_time = @task_with_time }
23
23
 
24
24
  it "create: should render [new] template into :create_task div" do
25
25
  params[:cancel] = nil
@@ -0,0 +1,24 @@
1
+ // French Format: 31/12/2000 à 23:00
2
+ // Thanks, Materazzi!
3
+
4
+ Date.prototype.toFormattedString = function(include_time){
5
+ str = this.getDate() + "/" + (this.getMonth() + 1) + "/" + this.getFullYear();
6
+ if (include_time) { str += " à " + this.getHours() + ":" + this.getPaddedMinutes() }
7
+ return str;
8
+ }
9
+
10
+ Date.parseFormattedString = function (string) {
11
+ var regexp = '([0-9]{1,2})/(([0-9]{1,2})/(([0-9]{4})( ?à? ([0-9]{1,2}):([0-9]{2})? *)?)?)?';
12
+ var d = string.match(new RegExp(regexp, "i"));
13
+ if (d==null) return Date.parse(string); // at least give javascript a crack at it.
14
+ var offset = 0;
15
+ var date = new Date(d[5], 0, 1);
16
+ if (d[3]) { date.setMonth(d[3] - 1); }
17
+ if (d[5]) { date.setDate(d[1]); }
18
+ if (d[7]) {
19
+ date.setHours(parseInt(d[7], 10));
20
+ }
21
+ if (d[8]) { date.setMinutes(d[8]); }
22
+ if (d[10]) { date.setSeconds(d[10]); }
23
+ return date;
24
+ }
metadata CHANGED
@@ -1,22 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fat_free_crm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.11.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Michael Dvorkin
9
- - Nathan Broadbent
10
9
  - Ben Tillman
10
+ - Nathan Broadbent
11
11
  - Stephen Kenworthy
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2012-03-10 00:00:00.000000000Z
15
+ date: 2012-03-30 00:00:00.000000000Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rails
19
- requirement: &76899560 !ruby/object:Gem::Requirement
19
+ requirement: &23503020 !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
22
  - - ~>
@@ -24,10 +24,10 @@ dependencies:
24
24
  version: 3.2.2
25
25
  type: :runtime
26
26
  prerelease: false
27
- version_requirements: *76899560
27
+ version_requirements: *23503020
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: prototype-rails
30
- requirement: &76899350 !ruby/object:Gem::Requirement
30
+ requirement: &23502600 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
33
  - - ! '>='
@@ -35,10 +35,10 @@ dependencies:
35
35
  version: '0'
36
36
  type: :runtime
37
37
  prerelease: false
38
- version_requirements: *76899350
38
+ version_requirements: *23502600
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: jquery-rails
41
- requirement: &76899120 !ruby/object:Gem::Requirement
41
+ requirement: &23502140 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
44
  - - ! '>='
@@ -46,21 +46,21 @@ dependencies:
46
46
  version: '0'
47
47
  type: :runtime
48
48
  prerelease: false
49
- version_requirements: *76899120
49
+ version_requirements: *23502140
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: simple_form
52
- requirement: &76898870 !ruby/object:Gem::Requirement
52
+ requirement: &23501640 !ruby/object:Gem::Requirement
53
53
  none: false
54
54
  requirements:
55
55
  - - ~>
56
56
  - !ruby/object:Gem::Version
57
- version: 1.5.2
57
+ version: 2.0.1
58
58
  type: :runtime
59
59
  prerelease: false
60
- version_requirements: *76898870
60
+ version_requirements: *23501640
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: will_paginate
63
- requirement: &76898610 !ruby/object:Gem::Requirement
63
+ requirement: &23501120 !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
66
66
  - - ~>
@@ -68,21 +68,21 @@ dependencies:
68
68
  version: 3.0.2
69
69
  type: :runtime
70
70
  prerelease: false
71
- version_requirements: *76898610
71
+ version_requirements: *23501120
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: paperclip
74
- requirement: &76898360 !ruby/object:Gem::Requirement
74
+ requirement: &23500660 !ruby/object:Gem::Requirement
75
75
  none: false
76
76
  requirements:
77
77
  - - ~>
78
78
  - !ruby/object:Gem::Version
79
- version: 2.5.2
79
+ version: 2.7.0
80
80
  type: :runtime
81
81
  prerelease: false
82
- version_requirements: *76898360
82
+ version_requirements: *23500660
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: paper_trail
85
- requirement: &76898170 !ruby/object:Gem::Requirement
85
+ requirement: &23500280 !ruby/object:Gem::Requirement
86
86
  none: false
87
87
  requirements:
88
88
  - - ! '>='
@@ -90,10 +90,10 @@ dependencies:
90
90
  version: '0'
91
91
  type: :runtime
92
92
  prerelease: false
93
- version_requirements: *76898170
93
+ version_requirements: *23500280
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: authlogic
96
- requirement: &76897890 !ruby/object:Gem::Requirement
96
+ requirement: &23499740 !ruby/object:Gem::Requirement
97
97
  none: false
98
98
  requirements:
99
99
  - - ~>
@@ -101,10 +101,10 @@ dependencies:
101
101
  version: 3.1.0
102
102
  type: :runtime
103
103
  prerelease: false
104
- version_requirements: *76897890
104
+ version_requirements: *23499740
105
105
  - !ruby/object:Gem::Dependency
106
106
  name: acts_as_commentable
107
- requirement: &76897630 !ruby/object:Gem::Requirement
107
+ requirement: &23499220 !ruby/object:Gem::Requirement
108
108
  none: false
109
109
  requirements:
110
110
  - - ~>
@@ -112,10 +112,10 @@ dependencies:
112
112
  version: 3.0.1
113
113
  type: :runtime
114
114
  prerelease: false
115
- version_requirements: *76897630
115
+ version_requirements: *23499220
116
116
  - !ruby/object:Gem::Dependency
117
117
  name: acts-as-taggable-on
118
- requirement: &76897400 !ruby/object:Gem::Requirement
118
+ requirement: &23498760 !ruby/object:Gem::Requirement
119
119
  none: false
120
120
  requirements:
121
121
  - - ~>
@@ -123,10 +123,32 @@ dependencies:
123
123
  version: 2.2.1
124
124
  type: :runtime
125
125
  prerelease: false
126
- version_requirements: *76897400
126
+ version_requirements: *23498760
127
+ - !ruby/object:Gem::Dependency
128
+ name: responds_to_parent
129
+ requirement: &23498380 !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ! '>='
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ type: :runtime
136
+ prerelease: false
137
+ version_requirements: *23498380
138
+ - !ruby/object:Gem::Dependency
139
+ name: dynamic_form
140
+ requirement: &23497920 !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: *23497920
127
149
  - !ruby/object:Gem::Dependency
128
150
  name: haml
129
- requirement: &76897150 !ruby/object:Gem::Requirement
151
+ requirement: &23492000 !ruby/object:Gem::Requirement
130
152
  none: false
131
153
  requirements:
132
154
  - - ~>
@@ -134,10 +156,10 @@ dependencies:
134
156
  version: 3.1.3
135
157
  type: :runtime
136
158
  prerelease: false
137
- version_requirements: *76897150
159
+ version_requirements: *23492000
138
160
  - !ruby/object:Gem::Dependency
139
161
  name: sass
140
- requirement: &76896910 !ruby/object:Gem::Requirement
162
+ requirement: &23491480 !ruby/object:Gem::Requirement
141
163
  none: false
142
164
  requirements:
143
165
  - - ~>
@@ -145,10 +167,10 @@ dependencies:
145
167
  version: 3.1.15
146
168
  type: :runtime
147
169
  prerelease: false
148
- version_requirements: *76896910
170
+ version_requirements: *23491480
149
171
  - !ruby/object:Gem::Dependency
150
172
  name: acts_as_list
151
- requirement: &76896670 !ruby/object:Gem::Requirement
173
+ requirement: &23490940 !ruby/object:Gem::Requirement
152
174
  none: false
153
175
  requirements:
154
176
  - - ~>
@@ -156,10 +178,10 @@ dependencies:
156
178
  version: 0.1.4
157
179
  type: :runtime
158
180
  prerelease: false
159
- version_requirements: *76896670
181
+ version_requirements: *23490940
160
182
  - !ruby/object:Gem::Dependency
161
183
  name: ffaker
162
- requirement: &76896440 !ruby/object:Gem::Requirement
184
+ requirement: &23490480 !ruby/object:Gem::Requirement
163
185
  none: false
164
186
  requirements:
165
187
  - - ! '>='
@@ -167,10 +189,10 @@ dependencies:
167
189
  version: 1.12.0
168
190
  type: :runtime
169
191
  prerelease: false
170
- version_requirements: *76896440
192
+ version_requirements: *23490480
171
193
  - !ruby/object:Gem::Dependency
172
194
  name: uglifier
173
- requirement: &76896240 !ruby/object:Gem::Requirement
195
+ requirement: &23490080 !ruby/object:Gem::Requirement
174
196
  none: false
175
197
  requirements:
176
198
  - - ! '>='
@@ -178,10 +200,10 @@ dependencies:
178
200
  version: '0'
179
201
  type: :runtime
180
202
  prerelease: false
181
- version_requirements: *76896240
203
+ version_requirements: *23490080
182
204
  - !ruby/object:Gem::Dependency
183
205
  name: chosen-rails
184
- requirement: &76896000 !ruby/object:Gem::Requirement
206
+ requirement: &23489560 !ruby/object:Gem::Requirement
185
207
  none: false
186
208
  requirements:
187
209
  - - ! '>='
@@ -189,10 +211,10 @@ dependencies:
189
211
  version: '0'
190
212
  type: :runtime
191
213
  prerelease: false
192
- version_requirements: *76896000
214
+ version_requirements: *23489560
193
215
  - !ruby/object:Gem::Dependency
194
216
  name: ajax-chosen-rails
195
- requirement: &76895750 !ruby/object:Gem::Requirement
217
+ requirement: &23489060 !ruby/object:Gem::Requirement
196
218
  none: false
197
219
  requirements:
198
220
  - - ! '>='
@@ -200,10 +222,21 @@ dependencies:
200
222
  version: 0.1.5
201
223
  type: :runtime
202
224
  prerelease: false
203
- version_requirements: *76895750
225
+ version_requirements: *23489060
204
226
  - !ruby/object:Gem::Dependency
205
227
  name: ransack
206
- requirement: &76895530 !ruby/object:Gem::Requirement
228
+ requirement: &23488620 !ruby/object:Gem::Requirement
229
+ none: false
230
+ requirements:
231
+ - - ! '>='
232
+ - !ruby/object:Gem::Version
233
+ version: '0'
234
+ type: :runtime
235
+ prerelease: false
236
+ version_requirements: *23488620
237
+ - !ruby/object:Gem::Dependency
238
+ name: cancan
239
+ requirement: &23488080 !ruby/object:Gem::Requirement
207
240
  none: false
208
241
  requirements:
209
242
  - - ! '>='
@@ -211,10 +244,10 @@ dependencies:
211
244
  version: '0'
212
245
  type: :runtime
213
246
  prerelease: false
214
- version_requirements: *76895530
247
+ version_requirements: *23488080
215
248
  - !ruby/object:Gem::Dependency
216
249
  name: rspec-rails
217
- requirement: &76895240 !ruby/object:Gem::Requirement
250
+ requirement: &23487560 !ruby/object:Gem::Requirement
218
251
  none: false
219
252
  requirements:
220
253
  - - ~>
@@ -222,10 +255,10 @@ dependencies:
222
255
  version: 2.8.1
223
256
  type: :development
224
257
  prerelease: false
225
- version_requirements: *76895240
258
+ version_requirements: *23487560
226
259
  - !ruby/object:Gem::Dependency
227
260
  name: capybara
228
- requirement: &76895010 !ruby/object:Gem::Requirement
261
+ requirement: &23487080 !ruby/object:Gem::Requirement
229
262
  none: false
230
263
  requirements:
231
264
  - - ! '>='
@@ -233,10 +266,10 @@ dependencies:
233
266
  version: '0'
234
267
  type: :development
235
268
  prerelease: false
236
- version_requirements: *76895010
269
+ version_requirements: *23487080
237
270
  - !ruby/object:Gem::Dependency
238
271
  name: sass-rails
239
- requirement: &76894780 !ruby/object:Gem::Requirement
272
+ requirement: &23486620 !ruby/object:Gem::Requirement
240
273
  none: false
241
274
  requirements:
242
275
  - - ! '>='
@@ -244,10 +277,10 @@ dependencies:
244
277
  version: '0'
245
278
  type: :development
246
279
  prerelease: false
247
- version_requirements: *76894780
280
+ version_requirements: *23486620
248
281
  - !ruby/object:Gem::Dependency
249
282
  name: coffee-rails
250
- requirement: &76894560 !ruby/object:Gem::Requirement
283
+ requirement: &23486180 !ruby/object:Gem::Requirement
251
284
  none: false
252
285
  requirements:
253
286
  - - ! '>='
@@ -255,10 +288,10 @@ dependencies:
255
288
  version: '0'
256
289
  type: :development
257
290
  prerelease: false
258
- version_requirements: *76894560
291
+ version_requirements: *23486180
259
292
  - !ruby/object:Gem::Dependency
260
293
  name: therubyracer
261
- requirement: &76894350 !ruby/object:Gem::Requirement
294
+ requirement: &23485740 !ruby/object:Gem::Requirement
262
295
  none: false
263
296
  requirements:
264
297
  - - ! '>='
@@ -266,10 +299,10 @@ dependencies:
266
299
  version: '0'
267
300
  type: :development
268
301
  prerelease: false
269
- version_requirements: *76894350
302
+ version_requirements: *23485740
270
303
  - !ruby/object:Gem::Dependency
271
304
  name: spork
272
- requirement: &76894130 !ruby/object:Gem::Requirement
305
+ requirement: &23485320 !ruby/object:Gem::Requirement
273
306
  none: false
274
307
  requirements:
275
308
  - - ! '>='
@@ -277,10 +310,10 @@ dependencies:
277
310
  version: '0'
278
311
  type: :development
279
312
  prerelease: false
280
- version_requirements: *76894130
313
+ version_requirements: *23485320
281
314
  - !ruby/object:Gem::Dependency
282
315
  name: database_cleaner
283
- requirement: &76893910 !ruby/object:Gem::Requirement
316
+ requirement: &23484900 !ruby/object:Gem::Requirement
284
317
  none: false
285
318
  requirements:
286
319
  - - ! '>='
@@ -288,10 +321,10 @@ dependencies:
288
321
  version: '0'
289
322
  type: :development
290
323
  prerelease: false
291
- version_requirements: *76893910
324
+ version_requirements: *23484900
292
325
  - !ruby/object:Gem::Dependency
293
326
  name: fuubar
294
- requirement: &76893690 !ruby/object:Gem::Requirement
327
+ requirement: &23484480 !ruby/object:Gem::Requirement
295
328
  none: false
296
329
  requirements:
297
330
  - - ! '>='
@@ -299,10 +332,10 @@ dependencies:
299
332
  version: '0'
300
333
  type: :development
301
334
  prerelease: false
302
- version_requirements: *76893690
335
+ version_requirements: *23484480
303
336
  - !ruby/object:Gem::Dependency
304
337
  name: factory_girl
305
- requirement: &76893430 !ruby/object:Gem::Requirement
338
+ requirement: &23477680 !ruby/object:Gem::Requirement
306
339
  none: false
307
340
  requirements:
308
341
  - - ~>
@@ -310,11 +343,23 @@ dependencies:
310
343
  version: 2.6.1
311
344
  type: :development
312
345
  prerelease: false
313
- version_requirements: *76893430
346
+ version_requirements: *23477680
347
+ - !ruby/object:Gem::Dependency
348
+ name: factory_girl_rails
349
+ requirement: &23477160 !ruby/object:Gem::Requirement
350
+ none: false
351
+ requirements:
352
+ - - ~>
353
+ - !ruby/object:Gem::Version
354
+ version: 1.7.0
355
+ type: :development
356
+ prerelease: false
357
+ version_requirements: *23477160
314
358
  description: An open source, Ruby on Rails customer relationship management platform
315
359
  email:
316
360
  - mike@fatfreecrm.com
317
361
  - nathan@fatfreecrm.com
362
+ - warp@fatfreecrm.com
318
363
  executables: []
319
364
  extensions: []
320
365
  extra_rdoc_files: []
@@ -376,7 +421,6 @@ files:
376
421
  - app/assets/stylesheets/print.css.scss
377
422
  - app/assets/stylesheets/rails.scss
378
423
  - app/assets/stylesheets/safari.scss
379
- - app/controllers/accounts_controller.rb
380
424
  - app/controllers/admin/application_controller.rb
381
425
  - app/controllers/admin/field_groups_controller.rb
382
426
  - app/controllers/admin/fields_controller.rb
@@ -386,17 +430,18 @@ files:
386
430
  - app/controllers/admin/users_controller.rb
387
431
  - app/controllers/application_controller.rb
388
432
  - app/controllers/authentications_controller.rb
389
- - app/controllers/base_controller.rb
390
- - app/controllers/campaigns_controller.rb
391
433
  - app/controllers/comments_controller.rb
392
- - app/controllers/contacts_controller.rb
393
434
  - app/controllers/emails_controller.rb
435
+ - app/controllers/entities/accounts_controller.rb
436
+ - app/controllers/entities/campaigns_controller.rb
437
+ - app/controllers/entities/contacts_controller.rb
438
+ - app/controllers/entities/leads_controller.rb
439
+ - app/controllers/entities/opportunities_controller.rb
440
+ - app/controllers/entities/tasks_controller.rb
441
+ - app/controllers/entities_controller.rb
394
442
  - app/controllers/home_controller.rb
395
- - app/controllers/leads_controller.rb
396
443
  - app/controllers/lists_controller.rb
397
- - app/controllers/opportunities_controller.rb
398
444
  - app/controllers/passwords_controller.rb
399
- - app/controllers/tasks_controller.rb
400
445
  - app/controllers/users_controller.rb
401
446
  - app/helpers/accounts_helper.rb
402
447
  - app/helpers/addresses_helper.rb
@@ -424,23 +469,24 @@ files:
424
469
  - app/helpers/users_helper.rb
425
470
  - app/inputs/date_time_input.rb
426
471
  - app/inputs/text_input.rb
427
- - app/models/base/account.rb
428
- - app/models/base/account_contact.rb
429
- - app/models/base/account_opportunity.rb
430
- - app/models/base/campaign.rb
431
- - app/models/base/contact.rb
432
- - app/models/base/contact_opportunity.rb
433
- - app/models/base/lead.rb
434
- - app/models/base/opportunity.rb
435
- - app/models/base/task.rb
472
+ - app/models/entities/account.rb
473
+ - app/models/entities/account_contact.rb
474
+ - app/models/entities/account_opportunity.rb
475
+ - app/models/entities/campaign.rb
476
+ - app/models/entities/contact.rb
477
+ - app/models/entities/contact_opportunity.rb
478
+ - app/models/entities/lead.rb
479
+ - app/models/entities/opportunity.rb
480
+ - app/models/entities/task.rb
436
481
  - app/models/fields/core_field.rb
437
482
  - app/models/fields/custom_field.rb
438
483
  - app/models/fields/field.rb
439
484
  - app/models/fields/field_group.rb
440
485
  - app/models/list.rb
441
486
  - app/models/mailers/notifier.rb
442
- - app/models/observers/activity_observer.rb
443
- - app/models/polymorphic/activity.rb
487
+ - app/models/observers/lead_observer.rb
488
+ - app/models/observers/opportunity_observer.rb
489
+ - app/models/observers/task_observer.rb
444
490
  - app/models/polymorphic/address.rb
445
491
  - app/models/polymorphic/avatar.rb
446
492
  - app/models/polymorphic/comment.rb
@@ -448,6 +494,7 @@ files:
448
494
  - app/models/polymorphic/tag.rb
449
495
  - app/models/polymorphic/tagging.rb
450
496
  - app/models/setting.rb
497
+ - app/models/users/ability.rb
451
498
  - app/models/users/authentication.rb
452
499
  - app/models/users/permission.rb
453
500
  - app/models/users/preference.rb
@@ -461,14 +508,12 @@ files:
461
508
  - app/views/accounts/_sidebar_index.html.haml
462
509
  - app/views/accounts/_sidebar_show.html.haml
463
510
  - app/views/accounts/_top_section.html.haml
464
- - app/views/accounts/contacts.js.rjs
465
511
  - app/views/accounts/create.js.rjs
466
512
  - app/views/accounts/destroy.js.rjs
467
513
  - app/views/accounts/edit.js.rjs
468
514
  - app/views/accounts/index.html.haml
469
515
  - app/views/accounts/index.js.rjs
470
516
  - app/views/accounts/new.js.rjs
471
- - app/views/accounts/opportunities.js.rjs
472
517
  - app/views/accounts/options.js.rjs
473
518
  - app/views/accounts/show.html.haml
474
519
  - app/views/accounts/update.js.rjs
@@ -533,11 +578,6 @@ files:
533
578
  - app/views/admin/users/suspend.js.rjs
534
579
  - app/views/admin/users/update.js.rjs
535
580
  - app/views/authentications/new.html.haml
536
- - app/views/base/_advanced_search.html.haml
537
- - app/views/base/_condition_fields.html.haml
538
- - app/views/base/_grouping_fields.html.haml
539
- - app/views/base/_sort_fields.html.haml
540
- - app/views/base/advanced_search.js.rjs
541
581
  - app/views/campaigns/_campaign.html.haml
542
582
  - app/views/campaigns/_edit.html.haml
543
583
  - app/views/campaigns/_metrics.html.haml
@@ -554,9 +594,7 @@ files:
554
594
  - app/views/campaigns/edit.js.rjs
555
595
  - app/views/campaigns/index.html.haml
556
596
  - app/views/campaigns/index.js.rjs
557
- - app/views/campaigns/leads.js.rjs
558
597
  - app/views/campaigns/new.js.rjs
559
- - app/views/campaigns/opportunities.js.rjs
560
598
  - app/views/campaigns/options.js.rjs
561
599
  - app/views/campaigns/show.html.haml
562
600
  - app/views/campaigns/update.js.rjs
@@ -569,6 +607,7 @@ files:
569
607
  - app/views/comments/new.js.rjs
570
608
  - app/views/comments/update.js.rjs
571
609
  - app/views/contacts/_contact.html.haml
610
+ - app/views/contacts/_contacts.html.haml
572
611
  - app/views/contacts/_edit.html.haml
573
612
  - app/views/contacts/_extra.html.haml
574
613
  - app/views/contacts/_new.html.haml
@@ -584,20 +623,28 @@ files:
584
623
  - app/views/contacts/index.html.haml
585
624
  - app/views/contacts/index.js.rjs
586
625
  - app/views/contacts/new.js.rjs
587
- - app/views/contacts/opportunities.js.rjs
588
626
  - app/views/contacts/options.js.rjs
589
627
  - app/views/contacts/show.html.haml
590
628
  - app/views/contacts/update.js.rjs
591
629
  - app/views/emails/_email.html.haml
592
630
  - app/views/emails/destroy.js.rjs
631
+ - app/views/entities/_advanced_search.html.haml
632
+ - app/views/entities/_condition_fields.html.haml
633
+ - app/views/entities/_grouping_fields.html.haml
634
+ - app/views/entities/_sort_fields.html.haml
635
+ - app/views/entities/advanced_search.js.rjs
636
+ - app/views/entities/contacts.js.rjs
637
+ - app/views/entities/leads.js.rjs
638
+ - app/views/entities/opportunities.js.rjs
639
+ - app/views/entities/versions.js.rjs
593
640
  - app/views/fields/_group.html.haml
594
641
  - app/views/fields/_groups.html.haml
595
642
  - app/views/fields/_sidebar_show.html.haml
596
643
  - app/views/fields/group.js.rjs
597
- - app/views/home/_actions_menu.html.haml
598
644
  - app/views/home/_activity.html.haml
599
645
  - app/views/home/_assets_menu.html.haml
600
646
  - app/views/home/_duration_menu.html.haml
647
+ - app/views/home/_events_menu.html.haml
601
648
  - app/views/home/_options.html.haml
602
649
  - app/views/home/_users_menu.html.haml
603
650
  - app/views/home/index.atom.builder
@@ -621,6 +668,7 @@ files:
621
668
  - app/views/leads/_convert_permissions.html.haml
622
669
  - app/views/leads/_edit.html.haml
623
670
  - app/views/leads/_lead.html.haml
671
+ - app/views/leads/_leads.html.haml
624
672
  - app/views/leads/_new.html.haml
625
673
  - app/views/leads/_opportunity.html.haml
626
674
  - app/views/leads/_options.html.haml
@@ -648,6 +696,7 @@ files:
648
696
  - app/views/notifier/password_reset_instructions.html.haml
649
697
  - app/views/opportunities/_edit.html.haml
650
698
  - app/views/opportunities/_new.html.haml
699
+ - app/views/opportunities/_opportunities.html.haml
651
700
  - app/views/opportunities/_opportunity.html.haml
652
701
  - app/views/opportunities/_options.html.haml
653
702
  - app/views/opportunities/_permissions.html.haml
@@ -701,6 +750,7 @@ files:
701
750
  - app/views/tasks/_related.html.haml
702
751
  - app/views/tasks/_selector.html.haml
703
752
  - app/views/tasks/_sidebar_index.html.haml
753
+ - app/views/tasks/_tasks.html.haml
704
754
  - app/views/tasks/_title.html.haml
705
755
  - app/views/tasks/_top_section.html.haml
706
756
  - app/views/tasks/complete.js.rjs
@@ -727,6 +777,7 @@ files:
727
777
  - app/views/users/update.js.rjs
728
778
  - app/views/users/upload_avatar.js.rjs
729
779
  - app/views/versions/_version.html.haml
780
+ - app/views/versions/_versions.html.haml
730
781
  - config.ru
731
782
  - config/application.rb
732
783
  - config/boot.rb
@@ -744,6 +795,7 @@ files:
744
795
  - config/initializers/mime_types.rb
745
796
  - config/initializers/paginate_arrays.rb
746
797
  - config/initializers/paper_trail.rb
798
+ - config/initializers/relative_url_root.rb
747
799
  - config/initializers/sass.rb
748
800
  - config/initializers/secret_token.rb
749
801
  - config/initializers/simple_form.rb
@@ -841,31 +893,16 @@ files:
841
893
  - db/migrate/20120216042541_is_paranoid_to_paper_trail.rb
842
894
  - db/migrate/20120220233724_add_versions_object_changes.rb
843
895
  - db/migrate/20120224073107_remove_default_value_and_clear_settings.rb
896
+ - db/migrate/20120309070209_add_versions_related.rb
897
+ - db/migrate/20120316045804_activities_to_versions.rb
844
898
  - db/schema.rb
845
899
  - db/seeds.rb
846
900
  - db/seeds/fields.rb
847
901
  - fat_free_crm.gemspec
848
- - lib/country_select/MIT-LICENSE
849
- - lib/country_select/README
850
- - lib/country_select/init.rb
851
- - lib/country_select/install.rb
852
- - lib/country_select/lib/country_select.rb
853
- - lib/country_select/uninstall.rb
854
902
  - lib/development_tasks/gem.rake
855
903
  - lib/development_tasks/license.rake
856
904
  - lib/development_tasks/rdoc.rake
857
905
  - lib/development_tasks/rspec.rake
858
- - lib/dynamic_form/MIT-LICENSE
859
- - lib/dynamic_form/README
860
- - lib/dynamic_form/Rakefile
861
- - lib/dynamic_form/dynamic_form.gemspec
862
- - lib/dynamic_form/init.rb
863
- - lib/dynamic_form/lib/action_view/helpers/dynamic_form.rb
864
- - lib/dynamic_form/lib/action_view/locale/en-US.yml
865
- - lib/dynamic_form/lib/dynamic_form.rb
866
- - lib/dynamic_form/test/dynamic_form_i18n_test.rb
867
- - lib/dynamic_form/test/dynamic_form_test.rb
868
- - lib/dynamic_form/test/test_helper.rb
869
906
  - lib/fat_free_crm.rb
870
907
  - lib/fat_free_crm/callback.rb
871
908
  - lib/fat_free_crm/core_ext.rb
@@ -898,25 +935,22 @@ files:
898
935
  - lib/fat_free_crm/syck_yaml.rb
899
936
  - lib/fat_free_crm/tabs.rb
900
937
  - lib/fat_free_crm/version.rb
901
- - lib/gravatar_image_tag/Gemfile
902
- - lib/gravatar_image_tag/README.textile
903
- - lib/gravatar_image_tag/ROADMAP.textile
904
- - lib/gravatar_image_tag/Rakefile
905
- - lib/gravatar_image_tag/VERSION
906
- - lib/gravatar_image_tag/gravatar_image_tag.gemspec
907
- - lib/gravatar_image_tag/init.rb
908
- - lib/gravatar_image_tag/lib/gravatar_image_tag.rb
909
- - lib/gravatar_image_tag/spec/gravatar_image_tag_spec.rb
910
- - lib/gravatar_image_tag/spec/test_helper.rb
911
- - lib/responds_to_parent/MIT-LICENSE
912
- - lib/responds_to_parent/README
913
- - lib/responds_to_parent/Rakefile
914
- - lib/responds_to_parent/init.rb
915
- - lib/responds_to_parent/install.rb
916
- - lib/responds_to_parent/lib/responds_to_parent.rb
917
- - lib/responds_to_parent/test/responds_to_parent_test.rb
918
- - lib/responds_to_parent/test/test_helper.rb
919
- - lib/responds_to_parent/uninstall.rb
938
+ - lib/plugins/country_select/MIT-LICENSE
939
+ - lib/plugins/country_select/README
940
+ - lib/plugins/country_select/init.rb
941
+ - lib/plugins/country_select/install.rb
942
+ - lib/plugins/country_select/lib/country_select.rb
943
+ - lib/plugins/country_select/uninstall.rb
944
+ - lib/plugins/gravatar_image_tag/Gemfile
945
+ - lib/plugins/gravatar_image_tag/README.textile
946
+ - lib/plugins/gravatar_image_tag/ROADMAP.textile
947
+ - lib/plugins/gravatar_image_tag/Rakefile
948
+ - lib/plugins/gravatar_image_tag/VERSION
949
+ - lib/plugins/gravatar_image_tag/gravatar_image_tag.gemspec
950
+ - lib/plugins/gravatar_image_tag/init.rb
951
+ - lib/plugins/gravatar_image_tag/lib/gravatar_image_tag.rb
952
+ - lib/plugins/gravatar_image_tag/spec/gravatar_image_tag_spec.rb
953
+ - lib/plugins/gravatar_image_tag/spec/test_helper.rb
920
954
  - lib/tasks/.gitkeep
921
955
  - lib/tasks/.gitkeep~master
922
956
  - lib/tasks/demo.rake
@@ -996,11 +1030,11 @@ files:
996
1030
  - spec/models/fields/field_group_spec.rb
997
1031
  - spec/models/fields/field_spec.rb
998
1032
  - spec/models/list_spec.rb
999
- - spec/models/polymorphic/activity_spec.rb
1000
1033
  - spec/models/polymorphic/address_spec.rb
1001
1034
  - spec/models/polymorphic/avatar_spec.rb
1002
1035
  - spec/models/polymorphic/comment_spec.rb
1003
1036
  - spec/models/polymorphic/email_spec.rb
1037
+ - spec/models/polymorphic/version_spec.rb
1004
1038
  - spec/models/setting_spec.rb
1005
1039
  - spec/models/users/authentication_spec.rb
1006
1040
  - spec/models/users/permission_spec.rb
@@ -1137,6 +1171,7 @@ files:
1137
1171
  - vendor/assets/javascripts/calendar_date_select/format_euro_24hr.js
1138
1172
  - vendor/assets/javascripts/calendar_date_select/format_euro_24hr_ymd.js
1139
1173
  - vendor/assets/javascripts/calendar_date_select/format_finnish.js
1174
+ - vendor/assets/javascripts/calendar_date_select/format_french.js
1140
1175
  - vendor/assets/javascripts/calendar_date_select/format_hyphen_ampm.js
1141
1176
  - vendor/assets/javascripts/calendar_date_select/format_iso_date.js
1142
1177
  - vendor/assets/javascripts/calendar_date_select/format_italian.js
@@ -1181,15 +1216,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
1181
1216
  - - ! '>='
1182
1217
  - !ruby/object:Gem::Version
1183
1218
  version: '0'
1219
+ segments:
1220
+ - 0
1221
+ hash: -109531187312954119
1184
1222
  required_rubygems_version: !ruby/object:Gem::Requirement
1185
1223
  none: false
1186
1224
  requirements:
1187
1225
  - - ! '>='
1188
1226
  - !ruby/object:Gem::Version
1189
1227
  version: '0'
1228
+ segments:
1229
+ - 0
1230
+ hash: -109531187312954119
1190
1231
  requirements: []
1191
1232
  rubyforge_project:
1192
- rubygems_version: 1.8.17
1233
+ rubygems_version: 1.8.8
1193
1234
  signing_key:
1194
1235
  specification_version: 3
1195
1236
  summary: Fat Free CRM