fat_free_crm 0.11.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

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