redmine_crm 0.0.38 → 0.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5ade85cd3ada9dbdf2283e26488fc7a8ae0eeb93
4
- data.tar.gz: 1c872961e53a3f1186ee4283cb08a15b264b3fe2
3
+ metadata.gz: cec54924c890caa40b9affa944a8cf4186e4ca7c
4
+ data.tar.gz: 1b0b5395bc2f1e5f2c03ee4504725a6cbb153b57
5
5
  SHA512:
6
- metadata.gz: 07c4211ffc5be1a3322a8eec1dc7ccfdaabe77b8edc8cade7a486b0a51852a728b78144c31c3f5c998c18ef11d954a24000f646f58f23bb98e57723dda3dca4d
7
- data.tar.gz: 6527ee07dbcc1e52cd240e03c70dbf6ac00d32ef43b0af638940572896eb239e8cc7bb444927a74570845ca3501d474615a584fb126860fa52401499c9ef24bd
6
+ metadata.gz: 2cbb08c06c06fa75356b93d25a23483f776b1c96a9f505f1ace7a54ae6123057dc1972145a93dd0632cf3ac8c8260c88513ec9d333f5912d4c39653d5a1c7406
7
+ data.tar.gz: 29c51f79b3d048c7d4ad59ff48be8f2757c85230fb1b5aa082fa4d07033d867142f3331d804363c10567d0f7aadfca404f273570f0056eb6ae440d7cb6291e60
data/README.md CHANGED
@@ -73,7 +73,7 @@ puts message.save_draft
73
73
  # => true
74
74
 
75
75
  # You can also save draft linked to a particular user.
76
- Message.new(subject: 'baz').save_draft(current_user)
76
+ Message.new(subject: 'baz').save_draft(user: current_user)
77
77
 
78
78
  # And restore message from some user's draft.
79
79
  user_draft = Message.drafts(current_user).last
@@ -94,9 +94,15 @@ user_message.save!
94
94
  puts Message.drafts(current_user).count
95
95
  # => 0
96
96
 
97
- # Draft won't be saved for a persisted instance.
98
- puts user_message.save_draft
97
+ # Drafts will be saved only for new (not persisted) or changed instances.
98
+ puts Message.new.save_draft
99
+ # => true
100
+ persisted = Message.last
101
+ puts persisted.save_draft
99
102
  # => false
103
+ persisted.subject = 'other subject'
104
+ puts persisted.save_draft
105
+ # => true
100
106
  ```
101
107
 
102
108
  ### Tags
data/doc/CHANGELOG CHANGED
@@ -4,6 +4,12 @@ Redmine crm gem - general functions for plugins (tags, vote, viewing, currency)
4
4
  Copyright (C) 2011-2018 RedmineUP
5
5
  https://www.redmineup.com/
6
6
 
7
+ == 2018-09-28 v0.0.40
8
+
9
+ * acts_as_draftable adopted for Redmine projects
10
+ * New Liquid Drops: JournalsDrop, JournalDrop, TimeEntriesDrop, TimeEntryDrop
11
+ * New liquid properties for issues: done_ratio, estimated_hours, spent_hours, total_spent_hours, total_estimated_hours, is_private, closed_on, assignee, tracker, status, priority, category, version, time_entries, parent, project, subtasks, notes, journals
12
+
7
13
  == 2018-03-28 v0.0.37
8
14
 
9
15
  * Added rcrm_acts_as_draftable
data/lib/redmine_crm.rb CHANGED
@@ -27,11 +27,14 @@ require 'redmine_crm/liquid/drops/issues_drop'
27
27
  require 'redmine_crm/liquid/drops/news_drop'
28
28
  require 'redmine_crm/liquid/drops/projects_drop'
29
29
  require 'redmine_crm/liquid/drops/users_drop'
30
+ require 'redmine_crm/liquid/drops/time_entries_drop'
30
31
 
31
32
  require 'redmine_crm/helpers/external_assets_helper'
32
33
  require 'redmine_crm/helpers/form_tag_helper'
33
34
  require 'redmine_crm/assets_manager'
34
35
 
36
+ require 'redmine_crm/compatibility/application_controller_patch'
37
+
35
38
  module RedmineCrm
36
39
  GEM_NAME = 'redmine_crm'.freeze
37
40
  end
@@ -55,7 +55,7 @@ module RedmineCrm
55
55
  end
56
56
 
57
57
  attr_accessor :draft_id
58
- after_create :clear_draft
58
+ before_save :clear_draft
59
59
 
60
60
  extend RedmineCrm::ActsAsDraftable::ClassMethods
61
61
  include RedmineCrm::ActsAsDraftable::InstanceMethods
@@ -74,39 +74,56 @@ module RedmineCrm
74
74
  target = draft.target_type.constantize.new
75
75
  target.load_from_draft(draft.data)
76
76
 
77
- target.send("#{draft_parent}=", draft.parent) if draft_parent
78
77
  target.draft_id = draft.id
79
78
  target
80
79
  end
81
80
 
82
81
  def drafts(user)
83
- Draft.where(user: user, target_type: name)
82
+ Draft.where(user_id: user.id, target_type: name)
84
83
  end
85
84
  end # ClassMethods
86
85
 
87
86
  module InstanceMethods
88
- def save_draft(user = nil)
89
- return false unless self.new_record?
90
-
91
- draft = Draft.find_by_id(self.draft_id) || Draft.new
87
+ def save_draft
88
+ return false unless new_record? || changed?
92
89
 
90
+ draft = self.draft || Draft.new
93
91
  draft.data = dump_to_draft
92
+ draft.user_id = User.current.try(:id)
93
+ draft.parent = parent_for_draft
94
94
  draft.target_type = self.class.name
95
- draft.user = user
96
- draft.parent = self.send(self.class.draft_parent) if self.class.draft_parent
97
95
 
98
96
  result = draft.save
99
97
  self.draft_id = draft.id if result
100
98
  result
101
99
  end
102
100
 
103
- def update_draft(user, attributes)
101
+ def update_draft(attributes)
104
102
  with_transaction_returning_status do
105
103
  assign_attributes(attributes)
106
- save_draft(user)
104
+ save_draft
107
105
  end
108
106
  end
109
107
 
108
+ def draft
109
+ Draft.find_by_id(draft_id)
110
+ end
111
+
112
+ def parent_for_draft
113
+ return self if id.present?
114
+
115
+ self.class.draft_parent.present? ? send(self.class.draft_parent) : self
116
+ end
117
+
118
+ def last_draft
119
+ @last_draft ||= RedmineCrm::ActsAsDraftable::Draft.where(
120
+ target_type: self.class.name,
121
+ parent_type: parent_for_draft.try(:class).try(:to_s),
122
+ parent_id: parent_for_draft.try(:id),
123
+ user_id: User.current.try(:id)
124
+ ).last
125
+ end
126
+
110
127
  def dump_to_draft
111
128
  Marshal.dump(instance_values)
112
129
  end
@@ -119,11 +136,9 @@ module RedmineCrm
119
136
  end
120
137
  end
121
138
 
122
- private
123
-
124
139
  def clear_draft
125
- if draft = Draft.find_by_id(self.draft_id)
126
- self.draft_id = nil if draft.destroy
140
+ if last_draft && last_draft.destroy
141
+ self.draft_id = nil
127
142
  end
128
143
  end
129
144
  end # InstanceMethods
@@ -135,7 +150,7 @@ module RedmineCrm
135
150
  connection.create_table :drafts do |t|
136
151
  t.string :target_type, limit: 150, null: false
137
152
  t.references :user
138
- t.references :parent, polymorphic: true, index: true
153
+ t.references :parent, polymorphic: true
139
154
  t.binary :data, limit: 16777215, null: false
140
155
  t.datetime :updated_at, null: false
141
156
  end
@@ -104,8 +104,8 @@ module RedmineCrm
104
104
  self.acts_as_viewed_options = { :viewing_class => viewing_class,
105
105
  :viewer_class => viewer_class }
106
106
  class_eval do
107
- has_many :viewings, :as => :viewed, :dependent => :delete_all, :class_name => viewing_class.to_s
108
- has_many(:viewers, :through => :viewings, :class_name => viewer_class.to_s)
107
+ has_many :viewings, as: :viewed, dependent: :delete_all, class_name: viewing_class.to_s
108
+ has_many :viewers, through: :viewings, class_name: viewer_class.to_s
109
109
 
110
110
  before_create :init_viewing_fields
111
111
  end
@@ -113,9 +113,9 @@ module RedmineCrm
113
113
  # Add to the User (or whatever the viewer is) a has_many viewings
114
114
  viewer_as_class = viewer_class.constantize
115
115
  return if viewer_as_class.instance_methods.include?('find_in_viewings')
116
- viewer_as_class.class_eval <<-EOS
117
- has_many :viewings, foreign_key: :viewer_id, class_name: '#{viewing_class.to_s}', dependent: :delete_all
118
- EOS
116
+ viewer_as_class.class_eval do
117
+ has_many :viewings, foreign_key: :viewer_id, class_name: viewing_class.to_s, dependent: :delete_all
118
+ end
119
119
  end
120
120
  end
121
121
 
@@ -0,0 +1,29 @@
1
+ module RedmineCrm
2
+ module Patches
3
+ module ApplicationControllerPatch
4
+ def self.included(base) # :nodoc:
5
+ base.extend(ClassMethods)
6
+ base.class_eval do
7
+ unloadable # Send unloadable so it will not be unloaded in development
8
+ end
9
+ end
10
+
11
+ module ClassMethods
12
+ def before_action(*filters, &block)
13
+ before_filter(*filters, &block)
14
+ end
15
+
16
+ def skip_before_action(*filters, &block)
17
+ skip_before_filter(*filters, &block)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ unless ActionController::Base.methods.include?(:before_action)
25
+ ActionController::Base.send(
26
+ :include,
27
+ RedmineCrm::Patches::ApplicationControllerPatch
28
+ )
29
+ end
@@ -3,13 +3,12 @@ module RedmineCrm
3
3
  module Loader
4
4
  DATA_PATH = File.expand_path("../../../../config", __FILE__)
5
5
 
6
- # Loads and returns the currencies stored in JSON files in the config directory.
6
+ # Loads and returns the currencies stored in JSON files
7
+ # in the config directory.
7
8
  #
8
9
  # @return [Hash]
9
10
  def load_currencies
10
- currencies = parse_currency_file("currency_iso.json")
11
- # currencies.merge! parse_currency_file("currency_non_iso.json")
12
- # currencies.merge! parse_currency_file("currency_backwards_compatible.json")
11
+ parse_currency_file('currency_iso.json')
13
12
  end
14
13
 
15
14
  private
@@ -17,7 +16,7 @@ module RedmineCrm
17
16
  def parse_currency_file(filename)
18
17
  json = File.read("#{DATA_PATH}/#{filename}")
19
18
  json.force_encoding(::Encoding::UTF_8) if defined?(::Encoding)
20
- JSON.parse(json, :symbolize_names => true)
19
+ JSON.parse(json, symbolize_names: true)
21
20
  end
22
21
  end
23
22
  end
@@ -16,6 +16,10 @@ module RedmineCrm
16
16
  end
17
17
  end
18
18
 
19
+ def visible
20
+ @visible ||= @all.select(&:visible?)
21
+ end
22
+
19
23
  def each(&block)
20
24
  all.each(&block)
21
25
  end
@@ -36,7 +40,13 @@ module RedmineCrm
36
40
  :start_date,
37
41
  :due_date,
38
42
  :overdue?,
39
- :completed_percent,
43
+ :done_ratio,
44
+ :estimated_hours,
45
+ :spent_hours,
46
+ :total_spent_hours,
47
+ :total_estimated_hours,
48
+ :is_private?,
49
+ :closed_on,
40
50
  :updated_on,
41
51
  :created_on,
42
52
  :to => :@issue
@@ -57,10 +67,104 @@ module RedmineCrm
57
67
  @user ||= UserDrop.new(@issue.author)
58
68
  end
59
69
 
70
+ def assignee
71
+ @assignee ||= UserDrop.new(@issue.assigned_to)
72
+ end
73
+
74
+ def tracker
75
+ @tracker ||= @issue.tracker && @issue.tracker.name
76
+ end
77
+
78
+ def status
79
+ @status ||= @issue.status && @issue.status.name
80
+ end
81
+
82
+ def priority
83
+ @priority ||= @issue.priority && @issue.priority.name
84
+ end
85
+
86
+ def category
87
+ @category ||= @issue.category && @issue.category.name
88
+ end
89
+
90
+ def version
91
+ @version ||= @issue.fixed_version && @issue.fixed_version.name
92
+ end
93
+
94
+ def time_entries
95
+ @time_entries ||= TimeEntriesDrop.new @issue.time_entries
96
+ end
97
+
98
+ def parent
99
+ @parent ||= IssueDrop.new @issue.parent if @issue.parent
100
+ end
101
+
102
+ def project
103
+ @project ||= ProjectDrop.new @issue.project if @issue.project
104
+ end
105
+
106
+ def subtasks
107
+ @subtasks ||= IssuesDrop.new @issue.children
108
+ end
109
+
110
+ def notes
111
+ @notes ||= @issue.journals.where("#{Journal.table_name}.notes IS NOT ?", nil).order(:created_on).map(&:notes)
112
+ end
113
+
114
+ def journals
115
+ @journals ||= JournalsDrop.new @issue.journals.where("#{Journal.table_name}.notes IS NOT ?", nil)
116
+ end
117
+
60
118
  def custom_field_values
61
119
  @issue.custom_field_values
62
120
  end
63
121
 
64
122
  end
123
+
124
+ class JournalsDrop < ::Liquid::Drop
125
+ def initialize(journals)
126
+ @journals = journals
127
+ end
128
+
129
+ def all
130
+ @all ||= @journals.map do |journal|
131
+ JournalDrop.new journal
132
+ end
133
+ end
134
+
135
+ def visible
136
+ @visible ||= @all.select(&:visible?)
137
+ end
138
+
139
+ def each(&block)
140
+ all.each(&block)
141
+ end
142
+
143
+ def size
144
+ @journals.size
145
+ end
146
+ end
147
+
148
+ class JournalDrop < ::Liquid::Drop
149
+ delegate :id,
150
+ :notes,
151
+ :created_on,
152
+ :private_notes,
153
+ :to => :@journal
154
+
155
+ def initialize(journal)
156
+ @journal = journal
157
+ end
158
+
159
+ def user
160
+ @user ||= UserDrop.new(@journal.user)
161
+ end
162
+
163
+ def issue
164
+ @issue ||= IssueDrop.new @journal.issue if @journal.issue
165
+ end
166
+
167
+ end
168
+
65
169
  end
66
170
  end
@@ -67,7 +67,7 @@ module RedmineCrm
67
67
  end
68
68
 
69
69
  def issues
70
- @issues ||= IssuesDrop.new @project.issues.visible
70
+ @issues ||= IssuesDrop.new @project.issues
71
71
  end
72
72
 
73
73
  def users
@@ -0,0 +1,64 @@
1
+ module RedmineCrm
2
+ module Liquid
3
+ class TimeEntriesDrop < ::Liquid::Drop
4
+ def initialize(time_entries)
5
+ @time_entries = time_entries
6
+ end
7
+
8
+ def all
9
+ @all ||= @time_entries.map do |time_entry|
10
+ TimeEntryDrop.new time_entry
11
+ end
12
+ end
13
+
14
+ def visible
15
+ @visible ||= @all.select(&:visible?)
16
+ end
17
+
18
+ def each(&block)
19
+ all.each(&block)
20
+ end
21
+
22
+ def size
23
+ @time_entries.size
24
+ end
25
+ end
26
+
27
+ class TimeEntryDrop < ::Liquid::Drop
28
+ include ActionView::Helpers::UrlHelper
29
+
30
+ delegate :id,
31
+ :hours,
32
+ :comments,
33
+ :spent_on,
34
+ :tyear,
35
+ :tmonth,
36
+ :tweek,
37
+ :visible?,
38
+ :updated_on,
39
+ :created_on,
40
+ :to => :@time_entry
41
+
42
+ def initialize(time_entry)
43
+ @time_entry = time_entry
44
+ end
45
+
46
+ def user
47
+ @user ||= UserDrop.new(@time_entry.user)
48
+ end
49
+
50
+ def issue
51
+ @issue ||= IssueDrop.new(@time_entry.issue)
52
+ end
53
+
54
+ def activity
55
+ @activity ||= @time_entry.activity && @time_entry.activity.name
56
+ end
57
+
58
+ def custom_field_values
59
+ @time_entry.custom_field_values
60
+ end
61
+
62
+ end
63
+ end
64
+ end
@@ -39,9 +39,9 @@ module RedmineCrm
39
39
  end
40
40
 
41
41
  def all_currencies
42
- Currency.table.inject([]) do |array, (id, attributes)|
42
+ Currency.table.inject([]) do |array, (_, attributes)|
43
43
  array ||= []
44
- array << ["#{attributes[:name]}" + (attributes[:symbol].blank? ? "" : " (#{attributes[:symbol]})"), attributes[:iso_code]]
44
+ array << [attributes[:name].to_s + (attributes[:symbol].blank? ? '' : " (#{attributes[:symbol]})"), attributes[:iso_code]]
45
45
  array
46
46
  end.sort{|x, y| x[0] <=> y[0]}
47
47
  end
@@ -1,3 +1,3 @@
1
1
  module RedmineCrm
2
- VERSION = '0.0.38'
2
+ VERSION = '0.0.40'
3
3
  end
@@ -4,7 +4,7 @@ class DraftTest < ActiveSupport::TestCase
4
4
  def test_restore
5
5
  issue = Issue.new(subject: 'some subject', description: 'some description')
6
6
 
7
- issue.save_draft(current_user)
7
+ issue.save_draft
8
8
  restored_issue = RedmineCrm::ActsAsDraftable::Draft.find(issue.draft_id).restore
9
9
 
10
10
  assert_equal issue.subject, restored_issue.subject
@@ -13,9 +13,9 @@ class DraftTest < ActiveSupport::TestCase
13
13
 
14
14
  def test_restore_all
15
15
  first_issue = Issue.new(subject: 'first subject')
16
- first_issue.save_draft(current_user)
16
+ first_issue.save_draft
17
17
  second_issue = Issue.new(subject: 'second subject')
18
- second_issue.save_draft(current_user)
18
+ second_issue.save_draft
19
19
 
20
20
  restored_issues = RedmineCrm::ActsAsDraftable::Draft.restore_all
21
21
  assert_equal [first_issue.subject, second_issue.subject], restored_issues.map(&:subject).sort
@@ -34,16 +34,18 @@ class RcrmActsAsDraftableTest < ActiveSupport::TestCase
34
34
  end
35
35
 
36
36
  def test_drafts
37
+ Issue.rcrm_acts_as_draftable parent: :project
37
38
  issue = Issue.new
38
- issue.save_draft(current_user)
39
+ issue.save_draft
39
40
 
40
41
  assert_equal 1, Issue.drafts(current_user).count
41
42
  assert_equal RedmineCrm::ActsAsDraftable::Draft, Issue.drafts(current_user).first.class
42
43
  end
43
44
 
44
45
  def test_from_draft
46
+ Issue.rcrm_acts_as_draftable parent: :project
45
47
  issue = Issue.new(subject: 'subject')
46
- issue.save_draft(current_user)
48
+ issue.save_draft
47
49
 
48
50
  issue_from_draft = Issue.from_draft(issue.draft_id)
49
51
 
@@ -56,11 +58,11 @@ class RcrmActsAsDraftableTest < ActiveSupport::TestCase
56
58
 
57
59
  def test_draft_deleted_after_save
58
60
  issue = Issue.new(subject: 'subject')
59
- issue.save_draft(current_user)
61
+ issue.save_draft
60
62
 
61
63
  issue_from_draft = Issue.from_draft(issue.draft_id)
62
64
 
63
- assert_difference 'Issue.count', 1 do
65
+ assert_difference 'Issue.count' do
64
66
  assert_difference 'RedmineCrm::ActsAsDraftable::Draft.count', -1 do
65
67
  issue_from_draft.save!
66
68
  end
@@ -78,7 +80,7 @@ class RcrmActsAsDraftableTest < ActiveSupport::TestCase
78
80
  Project.rcrm_acts_as_draftable
79
81
 
80
82
  project = Project.new
81
- project.save_draft(current_user)
83
+ project.save_draft
82
84
 
83
85
  assert_raises do
84
86
  Issue.from_draft(project.draft_id)
@@ -89,7 +91,7 @@ class RcrmActsAsDraftableTest < ActiveSupport::TestCase
89
91
  assert_equal String, Issue.new.dump_to_draft.class
90
92
  end
91
93
 
92
- def test_load_to_draft
94
+ def test_load_from_draft
93
95
  attributes = {subject: 'subject', description: 'description'}
94
96
  draft = Issue.new(attributes).dump_to_draft
95
97
 
@@ -101,17 +103,17 @@ class RcrmActsAsDraftableTest < ActiveSupport::TestCase
101
103
  end
102
104
 
103
105
  def test_save_draft
104
- attributes = {subject: 'subject'}
106
+ Issue.rcrm_acts_as_draftable parent: :project
107
+ attributes = { subject: 'subject' }
105
108
  issue = Issue.new(attributes)
106
109
 
107
- assert_difference 'Issue.count', 0 do
108
- assert_difference 'RedmineCrm::ActsAsDraftable::Draft.count', 1 do
109
- result = issue.save_draft(current_user)
110
+ assert_no_difference 'Issue.count' do
111
+ assert_difference 'RedmineCrm::ActsAsDraftable::Draft.count' do
112
+ result = issue.save_draft
110
113
  assert_equal true, result
111
114
  end
112
115
  end
113
- assert_equal Fixnum, issue.draft_id.class
114
-
116
+ assert_not_nil issue.draft_id
115
117
 
116
118
  draft = RedmineCrm::ActsAsDraftable::Draft.find(issue.draft_id)
117
119
  assert_equal 'Issue', draft.target_type
@@ -119,36 +121,24 @@ class RcrmActsAsDraftableTest < ActiveSupport::TestCase
119
121
  assert_equal attributes[:subject], draft.restore.subject
120
122
  end
121
123
 
122
- def test_save_draft_without_user
123
- issue = Issue.new
124
-
125
- assert_difference 'Issue.count', 0 do
126
- assert_difference 'RedmineCrm::ActsAsDraftable::Draft.count', 1 do
127
- result = issue.save_draft
128
- assert_equal true, result
129
- end
130
- end
131
-
132
- draft = RedmineCrm::ActsAsDraftable::Draft.find(issue.draft_id)
133
- assert_nil draft.user_id
134
- end
135
-
136
124
  def test_save_draft_with_associations
125
+ Issue.rcrm_acts_as_draftable parent: :project
137
126
  issue = Issue.new(project: projects(:second_project))
138
- issue.save_draft(current_user)
127
+ issue.save_draft
139
128
 
140
129
  draft = RedmineCrm::ActsAsDraftable::Draft.find(issue.draft_id)
141
130
  assert_equal issue.project.name, draft.restore.project.name
142
131
  end
143
132
 
144
133
  def test_save_draft_updates_existing_draft
134
+ Issue.rcrm_acts_as_draftable parent: :project
145
135
  issue = Issue.new
146
- issue.save_draft(current_user)
136
+ issue.save_draft
147
137
 
148
138
  issue.subject = 'changed subject'
149
- assert_difference 'Issue.count', 0 do
150
- assert_difference 'RedmineCrm::ActsAsDraftable::Draft.count', 0 do
151
- issue.save_draft(current_user)
139
+ assert_no_difference 'Issue.count' do
140
+ assert_no_difference 'RedmineCrm::ActsAsDraftable::Draft.count' do
141
+ issue.save_draft
152
142
  end
153
143
  end
154
144
 
@@ -156,20 +146,24 @@ class RcrmActsAsDraftableTest < ActiveSupport::TestCase
156
146
  assert_equal issue.subject, draft.restore.subject
157
147
  end
158
148
 
159
- def test_save_draft_does_not_save_persisted_model
160
- issue = Issue.new
161
- issue.save_draft(current_user)
162
- issue.save!
163
- assert_equal false, issue.save_draft(current_user)
149
+ def test_save_draft_does_not_save_persisted_object
150
+ issue = issues(:second_issue)
151
+ assert_equal false, issue.save_draft
152
+ end
153
+
154
+ def test_save_draft_saves_persisted_but_changed_object
155
+ issue = issues(:second_issue)
156
+ issue.subject = 'changed subject'
157
+ assert_equal true, issue.save_draft
164
158
  end
165
159
 
166
160
  def test_update_draft
167
161
  issue = Issue.new(subject: 'subject')
168
- issue.save_draft(current_user)
162
+ issue.save_draft
169
163
 
170
- assert_difference 'Issue.count', 0 do
171
- assert_difference 'RedmineCrm::ActsAsDraftable::Draft.count', 0 do
172
- issue.update_draft(current_user, subject: 'updated_subject')
164
+ assert_no_difference 'Issue.count' do
165
+ assert_no_difference 'RedmineCrm::ActsAsDraftable::Draft.count' do
166
+ issue.update_draft(subject: 'updated_subject')
173
167
  end
174
168
  end
175
169
 
data/test/schema.rb CHANGED
@@ -2,6 +2,8 @@ ActiveRecord::Schema.define version: 0 do
2
2
 
3
3
  create_table :drafts, force: true do |t|
4
4
  t.string :target_type
5
+ t.integer :target_id
6
+ t.references :project
5
7
  t.references :user
6
8
  t.references :parent, polymorphic: true
7
9
  t.binary :data
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redmine_crm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.38
4
+ version: 0.0.40
5
5
  platform: ruby
6
6
  authors:
7
7
  - RedmineUP
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-23 00:00:00.000000000 Z
11
+ date: 2018-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -111,6 +111,7 @@ files:
111
111
  - lib/redmine_crm/acts_as_votable/vote.rb
112
112
  - lib/redmine_crm/acts_as_votable/voter.rb
113
113
  - lib/redmine_crm/assets_manager.rb
114
+ - lib/redmine_crm/compatibility/application_controller_patch.rb
114
115
  - lib/redmine_crm/currency.rb
115
116
  - lib/redmine_crm/currency/formatting.rb
116
117
  - lib/redmine_crm/currency/heuristics.rb
@@ -122,6 +123,7 @@ files:
122
123
  - lib/redmine_crm/liquid/drops/issues_drop.rb
123
124
  - lib/redmine_crm/liquid/drops/news_drop.rb
124
125
  - lib/redmine_crm/liquid/drops/projects_drop.rb
126
+ - lib/redmine_crm/liquid/drops/time_entries_drop.rb
125
127
  - lib/redmine_crm/liquid/drops/users_drop.rb
126
128
  - lib/redmine_crm/liquid/filters/arrays.rb
127
129
  - lib/redmine_crm/liquid/filters/base.rb