activerecord_sqlserver_crm 4.2.5 → 4.2.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 04c61257ab2299b47f3e71dfc4e0967dc0dd82c3
4
- data.tar.gz: 4335bc027dbba84fae3db4769696bd5217428bf6
3
+ metadata.gz: f60deb0c4b8b3d968d6a9beffce6a21186a91c3c
4
+ data.tar.gz: bbd7a7947fb944d16878bc52b8a6cd1f87c78d24
5
5
  SHA512:
6
- metadata.gz: 92c6fa1ea3379529feab1dbc5fb9bbcf112a53f96b8339eab27a15312749302e8f080d967b876f0d32e78ec357d66e5978b5b8c8cd574b93c6adcd0fa77441c5
7
- data.tar.gz: 09e4ee73ea5d37e3e0dcd6f05ce11e1b1049573440cab4c3d198b366a91951f5bc0b45b7e87766c2f6e124d78c8177d350e8b238669558ce737e618907dbfe2e
6
+ metadata.gz: 8c744ec6364c6093220bd1e9d07e41ff41428c2507f19dceada6bd003421c10b62ab9ca95d0787d61c601ac5f9c8b87050f09938bee6b7b223704b6a4a5642fb
7
+ data.tar.gz: d9365320580a729353d27c5d97a91b5e62ea1afacce39f234ac2d9c8fa51b198d8ee9feb4fc9c0a05bcafee9e2f693afbda3a5e9ec7af8e67eb6311ea9cd7a11
@@ -69,6 +69,11 @@ module ActiveRecordExtension
69
69
  @belongs_to_fields.select{|f| f.foreign_key == field}.first
70
70
  end
71
71
 
72
+ def belongs_to_field_by_name(name)
73
+ @belongs_to_fields ||= belongs_to_fields
74
+ @belongs_to_fields.select{|f| f.name.to_s == name}.first
75
+ end
76
+
72
77
  def belongs_to_fields
73
78
  associations = reflect_on_all_associations
74
79
  associations.select { |a| a.macro == :belongs_to }
@@ -83,6 +88,17 @@ module ActiveRecordExtension
83
88
  @odata_table_reference = value
84
89
  end
85
90
 
91
+ # OData does not allow creating an entry for a table that is used in a many to many joining table. You must
92
+ # associate tables together. If a table uses this field, it indicates its a joining many to many table.
93
+ # An array of the 2 associated tables, eg [Table1, Table2]
94
+ def many_to_many_associated_tables
95
+ @many_to_many_associated_tables
96
+ end
97
+
98
+ def many_to_many_associated_tables=(value)
99
+ @many_to_many_associated_tables = value
100
+ end
101
+
86
102
  # In some cases the odata field name is different than the database field name. This method is used for this mapping
87
103
  def odata_field(field, options)
88
104
  @odata_property_key ||= {}
@@ -1,3 +1,3 @@
1
1
  module ActiverecordSqlserverCrm
2
- VERSION = "4.2.5"
2
+ VERSION = "4.2.6"
3
3
  end
@@ -7,6 +7,9 @@ module OData
7
7
  id = response.headers['OData-EntityId'].scan(/\(([\w-]*)\)/)
8
8
  @ar.id = id[0][0] unless id.nil? || id[0].nil?
9
9
  @ar.errors[:base] << "Failed to #{operation_callback_name} entity. [http code #{response.code}]" if @ar.id.nil?
10
+ elsif response.code >= 200 && response.code < 300
11
+ # Associating record does not return any body, just a positive response code
12
+ @ar.id = saved_many_to_many_id
10
13
  else
11
14
  @ar.errors[:base] << "Could not #{operation_callback_name} entity. [http code #{response.code}]" if @ar.id.nil?
12
15
  end
@@ -20,8 +23,12 @@ module OData
20
23
  # If a belongs to field, add association the way OData wants it
21
24
  if @ar.class.belongs_to_field?(field)
22
25
  belongs_to_field = @ar.class.belongs_to_field(field)
23
- odata_table_ref = @ar.class.odata_table_reference || table_pluralize(belongs_to_field.table_name).downcase
24
- body["#{belongs_to_field.options[:crm_key]}@odata.bind"] = "/#{odata_table_ref}(#{values[1]})"
26
+ if many_to_many_table?
27
+ body["@odata.id"] = "#{base_url}#{many_to_many_entity_name(1)}(#{many_to_many_entity_id(1)})"
28
+ else
29
+ odata_table_ref = @ar.class.odata_table_reference || table_pluralize(belongs_to_field.table_name).downcase
30
+ body["#{belongs_to_field.options[:crm_key]}@odata.bind"] = "/#{odata_table_ref}(#{values[1]})"
31
+ end
25
32
  else
26
33
  key = @ar.class.odata_field_value(field.to_sym) || field.downcase
27
34
  body[key] = values[1]
@@ -35,7 +42,12 @@ module OData
35
42
  end
36
43
 
37
44
  def operation_url
38
- "#{base_url}#{entity_name}"
45
+ if many_to_many_table?
46
+ # In the form "/table1s(00000000-0000-0000-0000-000000000002)/table2s/$ref"
47
+ "#{base_url}#{many_to_many_entity_name(0)}(#{many_to_many_entity_id(0)})/#{many_to_many_table_name}/$ref"
48
+ else
49
+ "#{base_url}#{entity_name}"
50
+ end
39
51
  end
40
52
 
41
53
  def operation_callback_name
@@ -26,13 +26,37 @@ module OData
26
26
  end
27
27
 
28
28
  def entity_name
29
- table_pluralize(@ar.class.table_name).downcase
29
+ @ar.class.odata_table_reference || table_pluralize(@ar.class.table_name).downcase
30
30
  end
31
31
 
32
32
  def handle_operation_response(response)
33
33
  raise NotImplementedError
34
34
  end
35
35
 
36
+ def many_to_many_table?
37
+ @ar.class.many_to_many_associated_tables.present?
38
+ end
39
+
40
+ def many_to_many_entity_name(index)
41
+ @ar.class.many_to_many_associated_tables[index].odata_table_reference || table_pluralize(@ar.class.many_to_many_associated_tables[index].table_name).downcase
42
+ end
43
+
44
+ def many_to_many_class_name(index)
45
+ @ar.class.many_to_many_associated_tables[index].name.demodulize.underscore
46
+ end
47
+
48
+ def many_to_many_entity_id(index)
49
+ @ar.send(many_to_many_class_name(index)).id
50
+ end
51
+
52
+ def many_to_many_foreign_key(index)
53
+ @ar.class.belongs_to_field_by_name(many_to_many_class_name(index)).foreign_key
54
+ end
55
+
56
+ def many_to_many_table_name
57
+ @ar.class.odata_table_reference || @ar.class.table_name.downcase
58
+ end
59
+
36
60
  def operation_body
37
61
  nil
38
62
  end
@@ -44,7 +68,9 @@ module OData
44
68
  def operation_headers
45
69
  {
46
70
  'Accept' => 'application/json',
47
- 'Content-Type' => 'application/json; charset=utf-8'
71
+ 'Content-Type' => 'application/json; charset=utf-8',
72
+ 'OData-MaxVersion' => '4.0',
73
+ 'OData-Version' => '4.0'
48
74
  }
49
75
  end
50
76
 
@@ -73,9 +99,13 @@ module OData
73
99
  handle_operation_response(response)
74
100
  end
75
101
 
102
+ def saved_many_to_many_id
103
+ @ar.class.where("#{many_to_many_foreign_key(0)} = '#{many_to_many_entity_id(0)}' AND #{many_to_many_foreign_key(1)} = '#{many_to_many_entity_id(1)}'").first.id
104
+ end
105
+
76
106
  def send_odata
77
107
  @ar.run_callbacks operation_callback_name do
78
- if Rails.env.development?
108
+ if Rails.env.development? || Rails.env.test?
79
109
  Rails.logger.debug "SEND_ODATA URL: #{operation_url}"
80
110
  Rails.logger.debug "SEND_ODATA METHOD: #{operation_method}"
81
111
  Rails.logger.debug "SEND_ODATA BODY: #{operation_body}"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord_sqlserver_crm
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.5
4
+ version: 4.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rolf Lawrenz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-13 00:00:00.000000000 Z
11
+ date: 2016-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails