infopark_crm_connector 0.9.2 → 1.0.0

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.
Files changed (40) hide show
  1. data/.yardopts +8 -0
  2. data/CHANGELOG.markdown +94 -0
  3. data/LICENSE +2 -0
  4. data/README.markdown +110 -0
  5. data/lib/crm_connector.rb +11 -15
  6. data/lib/crm_connector/account.rb +31 -2
  7. data/lib/crm_connector/activity.rb +61 -3
  8. data/lib/crm_connector/configuration.rb +2 -4
  9. data/lib/crm_connector/contact.rb +123 -3
  10. data/lib/crm_connector/core/continuation_support.rb +2 -1
  11. data/lib/crm_connector/core/enumerator.rb +20 -11
  12. data/lib/crm_connector/core/known_attributes.rb +3 -1
  13. data/lib/crm_connector/core/resource.rb +108 -16
  14. data/lib/crm_connector/core/search_support.rb +3 -1
  15. data/lib/crm_connector/custom_type.rb +20 -3
  16. data/lib/crm_connector/{default.rb → errors.rb} +1 -1
  17. data/lib/crm_connector/errors/authentication_failed.rb +10 -0
  18. data/lib/crm_connector/errors/base.rb +8 -0
  19. data/lib/crm_connector/event.rb +37 -2
  20. data/lib/crm_connector/event_contact.rb +38 -2
  21. data/lib/crm_connector/mailing.rb +35 -2
  22. data/lib/crm_connector/role.rb +7 -2
  23. data/lib/crm_connector/system.rb +14 -8
  24. metadata +22 -53
  25. data/CHANGELOG.rdoc +0 -87
  26. data/README.rdoc +0 -59
  27. data/lib/crm_connector/base.rb +0 -4
  28. data/lib/crm_connector/core/base.rb +0 -111
  29. data/lib/crm_connector/debugging.rb +0 -21
  30. data/lib/crm_connector/default/account.rb +0 -30
  31. data/lib/crm_connector/default/activity.rb +0 -54
  32. data/lib/crm_connector/default/contact.rb +0 -112
  33. data/lib/crm_connector/default/custom_type.rb +0 -24
  34. data/lib/crm_connector/default/event.rb +0 -23
  35. data/lib/crm_connector/default/event_contact.rb +0 -57
  36. data/lib/crm_connector/default/mailing.rb +0 -33
  37. data/lib/crm_connector/default/resource.rb +0 -10
  38. data/lib/crm_connector/default/role.rb +0 -9
  39. data/lib/crm_connector/inheriting_resource.rb +0 -30
  40. data/lib/crm_connector/resource.rb +0 -15
@@ -1,5 +1,6 @@
1
- # :stopdoc:
2
1
  module Infopark; module Crm; module Core
2
+
3
+ # @private
3
4
  module ContinuationSupport
4
5
  def self.included(klass)
5
6
  klass.extend(ClassMethods)
@@ -1,42 +1,51 @@
1
1
  require 'backports'
2
2
 
3
3
  module Infopark; module Crm; module Core
4
- # Transparent wrapper for the web service's continuation ability
4
+ # Transparent wrapper for the web services continuation ability
5
5
  class Enumerator < Enumerator
6
- def initialize(collection, continuation_handle, size, &block) #:nodoc:
6
+
7
+ # @private
8
+ def initialize(collection, continuation_handle, size, &block)
7
9
  update(collection, continuation_handle, size)
8
10
  super &block
9
11
  end
10
12
 
13
+ ##
11
14
  # The +continuation_handle+ parameter to be passed to the next find or search request for
12
- # programmatic paging
15
+ # programmatic paging.
16
+ # @return [String]
17
+ # @private
13
18
  def continuation_handle
14
19
  @continuation_handle
15
20
  end
16
21
 
17
- # The results of the last response as an array,
18
- # the array's size is less than or equal to the +limit+ parameter value
22
+ ##
23
+ # The results of the last response as an array.
24
+ # The size of the array is less than or equal to the +limit+ parameter value.
25
+ # @return [Array]
19
26
  def within_limit
20
27
  @collection
21
28
  end
22
29
 
23
30
  ##
24
- # :method: size
31
+ # @!method size
25
32
  # The total count given by the last search response, if available.
26
- # #size is undefined otherwise.
33
+ # If not available this method is undefiend.
34
+ # @return [Integer] The total count given by the last search response, if available.
27
35
  ##
28
36
 
29
- #--
37
+ ##
30
38
  # Note: We don't want size to return nil for compatibility for count's behavior
31
- #++
32
- def update(collection, continuation_handle, size) # :nodoc:
39
+ # @private
40
+ def update(collection, continuation_handle, size)
33
41
  @collection = collection
34
42
  @continuation_handle = continuation_handle
35
43
  @size = size
36
44
  define_singleton_method(:size) {@size} if @size
37
45
  end
38
46
 
39
- def inspect #:nodoc:
47
+ # @private
48
+ def inspect
40
49
  "#{super.chop}, @within_limit=#{within_limit.inspect}" +
41
50
  ", @continuation_handle=#{continuation_handle.inspect}>"
42
51
  end
@@ -1,8 +1,10 @@
1
- # :stopdoc:
2
1
  module Infopark; module Crm; module Core
2
+
3
+ # @private
3
4
  class KnownAttributes < Array
4
5
  def include?(val)
5
6
  val.start_with?('custom_') || super(val)
6
7
  end
7
8
  end
9
+
8
10
  end; end; end
@@ -1,18 +1,37 @@
1
- # :stopdoc:
2
- require 'ostruct'
1
+ require 'active_support/core_ext/class/attribute_accessors'
3
2
 
4
3
  module Infopark; module Crm; module Core
5
- class Resource < Infopark::Crm::Base
6
- include Core::ContinuationSupport
7
- include Core::SearchSupport
4
+ ##
5
+ # Base class for every resource model
6
+ #
7
+ # Supports the ActiveResource::Base lifecycle methods, such as
8
+ # * Resource.create(attributes)
9
+ # * Resource.new(attributes)
10
+ # * Resource.find(id)
11
+ # * resource.update_attributes(attributes)
12
+ # * resource.save
13
+ #
14
+ # See the {http://rubydoc.info/gems/activeresource/3.2.8/frames ActiveResource documentation} for a detailed description.
15
+ class Resource < ActiveResource::Base
16
+ include ContinuationSupport
17
+ include SearchSupport
8
18
 
9
- def self.site
10
- Infopark::Crm::Base.site + 'api/'
19
+ self.format = :json
20
+ self.include_root_in_json = true
21
+
22
+ cattr_accessor :locale
23
+ cattr_accessor :http_host
24
+
25
+ # @private
26
+ def self.element_name
27
+ @element_name ||= first_resource_child.model_name.element
11
28
  end
12
29
 
30
+ # @private
13
31
  @@deprecation_warnings = true
14
32
  cattr_writer :deprecation_warnings
15
33
 
34
+ # @private
16
35
  def self.deprecated(deprecated, hint = nil)
17
36
  return unless @@deprecation_warnings
18
37
  text = "[WebCrmConnector] #{deprecated} is deprecated."
@@ -24,21 +43,94 @@ module Infopark; module Crm; module Core
24
43
  end
25
44
  end
26
45
 
46
+ # @private
27
47
  def known_attributes
28
- KnownAttributes.new(super)
48
+ Core::KnownAttributes.new(super)
29
49
  end
30
50
 
31
- # Inheritable Resources
32
- def self.defines_webservice?
33
- true
51
+ ##
52
+ # @webcrm_todo remove when https://github.com/rails/rails/issues/2479 is done
53
+ # @private
54
+ def self.delete(id, options = {})
55
+ connection.delete(element_path(id, options), headers)
34
56
  end
35
57
 
36
- def self.inherited(sub)
37
- super
38
- sub.__send__(:include, InheritingResource) unless sub.defines_webservice?
58
+ # @private
59
+ def self.headers
60
+ headers = super
61
+ headers.merge!({"Accept-Language" => self.locale}) if self.locale
62
+ headers.merge!({"Host" => self.http_host}) if self.http_host
63
+ headers
39
64
  end
40
65
 
41
- # /Inheritable Resources
42
- end
66
+ # @private
67
+ def self.configure(configuration)
68
+ self.site = configuration.url + '/api/' if configuration.url
69
+ self.user = configuration.login
70
+ self.password = configuration.api_key
71
+ self.locale = configuration.locale
72
+ self.http_host = configuration.http_host
73
+ end
74
+
75
+ # @private
76
+ def self.schema=(definition)
77
+ ares_compatible_definition = {}
78
+ definition.each do |k, v|
79
+ ares_compatible_definition[k] = SchemaSupport.schema_type(v)
80
+ end
81
+ super(ares_compatible_definition)
82
+ end
83
+
84
+ ###
85
+ # @webcrm_todo drop when ActiveResource 3.0 support is dropped
86
+ # @private
87
+ class SchemaSupport
88
+ def self.schema_mapping
89
+ @schema_mapping ||= {}
90
+ end
91
+
92
+ def self.add(mapping)
93
+ schema_mapping.merge!(mapping)
94
+ end
95
+
96
+ def self.schema_type(type)
97
+ default_mapping = ::ActiveResource::Schema::KNOWN_ATTRIBUTE_TYPES
98
+ return type if default_mapping.include?(type.to_s)
99
+ return schema_mapping[type.to_sym]
100
+ end
43
101
 
102
+ add :text => :string
103
+ add :date => :string
104
+ add :boolean => nil
105
+ end
106
+
107
+ # Support for field associatable errors (without humanized name guessing)
108
+ # @private
109
+ def errors
110
+ @errors ||= Errors.new(self)
111
+ end
112
+
113
+ # @private
114
+ class Errors < ActiveResource::Errors
115
+
116
+ ##
117
+ # @webcrm_todo temporary patch from https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/5616
118
+ def from_json(json, save_cache = false)
119
+ errors = ActiveSupport::JSON.decode(json)
120
+ clear unless save_cache
121
+ errors.each do |attr_name, messages|
122
+ Array.wrap(messages).each { |message| add(attr_name.to_sym, message) }
123
+ end
124
+ end
125
+
126
+ end
127
+
128
+ private
129
+
130
+ def self.first_resource_child
131
+ ancestors.each_cons(2) do |child, parent|
132
+ return child if (parent == Infopark::Crm::Core::Resource)
133
+ end
134
+ end
135
+ end
44
136
  end; end; end
@@ -1,5 +1,6 @@
1
- # :stopdoc:
2
1
  module Infopark; module Crm; module Core
2
+
3
+ # @private
3
4
  module SearchSupport
4
5
  def self.included(klass)
5
6
  klass.extend(ClassMethods)
@@ -18,4 +19,5 @@ module Infopark; module Crm; module Core
18
19
 
19
20
  end
20
21
  end
22
+
21
23
  end; end; end
@@ -1,7 +1,24 @@
1
1
  module Infopark; module Crm
2
- # This is an extendable class. See Default::CustomType for documentation
3
- class CustomType < Default::CustomType
4
- class CustomAttribute < Default::CustomType::CustomAttribute #:nodoc:
2
+ class CustomType < Core::Resource
3
+ self.schema = {
4
+ :custom_attributes => :hash,
5
+ :icon_css_class => :string,
6
+ :kind => :string,
7
+ :name => :string,
8
+ :states => :array,
9
+ }
10
+
11
+ # @private
12
+ class CustomAttribute < Core::Resource
13
+
14
+ self.include_root_in_json = false
15
+
16
+ ###
17
+ # @webcrm_todo this method is only needed until the deprecated Object#type is removed
18
+ # Better: define self.schema
19
+ def type
20
+ attributes['type']
21
+ end
5
22
  end
6
23
  end
7
24
  end; end
@@ -1,6 +1,6 @@
1
1
  module Infopark
2
2
  module Crm
3
- module Default
3
+ module Errors
4
4
  Infopark::Crm.setup_autoload(self, __FILE__)
5
5
  end
6
6
  end
@@ -0,0 +1,10 @@
1
+ module Infopark; module Crm; module Errors
2
+
3
+ ##
4
+ # Raised when a contact provides wrong credentials (token/password)
5
+ #
6
+ # This differs from the case when the web services API credentials are not accepted
7
+ # (an ActiveResource error is raised then)
8
+ class AuthenticationFailed < Base; end
9
+
10
+ end; end; end
@@ -0,0 +1,8 @@
1
+ module Infopark; module Crm; module Errors
2
+
3
+ ##
4
+ # Super class of all connector errors
5
+ class Base < StandardError
6
+ end
7
+
8
+ end; end; end
@@ -1,4 +1,39 @@
1
1
  module Infopark; module Crm
2
- # This is an extendable class. See Default::Event for documentation
3
- class Event < Default::Event; end
2
+ class Event < Core::Resource
3
+
4
+ ##
5
+ # @!method self.search(input)
6
+ # Searches for events
7
+ # @param input [Hash] A hash containing a +params+ key. The value of this key is a hash containing the actual search query.
8
+ # @return [Array<Infopark::Crm::Event>]
9
+ # @webcrm_rest_url <code>GET /api/events/search</code>
10
+ # @example
11
+ # results = Infopark::Crm::Event.search(:params => {:kind => kind})
12
+ # results = Infopark::Crm::Event.search(:params => {:event_set => event_set})
13
+ # results = Infopark::Crm::Event.search(:params => {:q => 'full-text search'})
14
+ has_search
15
+
16
+ self.schema = {
17
+ :custom_attributes => :hash,
18
+ :dtend_at => :time,
19
+ :dtstart_at => :time,
20
+ :event_set => :string,
21
+ :kind => :string,
22
+ :location => :string,
23
+ :title => :string,
24
+ }
25
+ end
26
+
27
+ # @private
28
+ class Event::CustomAttribute < Core::Resource
29
+
30
+ self.include_root_in_json = false
31
+
32
+ ##
33
+ # @webcrm_todo this method is only needed until the deprecated Object#type is removed
34
+ # Better: define self.schema
35
+ def type
36
+ attributes['type']
37
+ end
38
+ end
4
39
  end; end
@@ -1,4 +1,40 @@
1
1
  module Infopark; module Crm
2
- # This is an extendable class. See Default::EventContact for documentation
3
- class EventContact < Default::EventContact; end
2
+ class EventContact < Core::Resource
3
+
4
+ ##
5
+ # @!method self.search(input)
6
+ # Searches for event contacts
7
+ # @param input [Hash] A hash containing a +params+ key. The value of this key is a hash containing the actual search query.
8
+ # @return [Array<Infopark::Crm::EventContact>]
9
+ # @webcrm_rest_url <code>GET /api/event_contacts/search</code>
10
+ # @example
11
+ # results = Infopark::Crm::EventContacts.search(:params => {:event_id => eid})
12
+ # results = Infopark::Crm::EventContacts.search(:params => {:contact_id => cid})
13
+ # results = Infopark::Crm::EventContacts.search(:params => {:state => state})
14
+ # results = Infopark::Crm::EventContacts.search(:params => {:q => 'full-text search'})
15
+ has_search
16
+
17
+ self.schema = {
18
+ :state => :string,
19
+ :contact_id => :string,
20
+ :event_id => :string,
21
+ }
22
+
23
+ ##
24
+ # Queries the WebCRM for the Contact with the id +contact_id+.
25
+ # @return [Infopark::Crm::Contact] The contact associated with this event contact, if +contact_id+ is present.
26
+ # @webcrm_rest_url <code>GET /api/contacts/_contact_id_</code>
27
+ def contact
28
+ Infopark::Crm::Contact.find(contact_id) if contact_id
29
+ end
30
+
31
+ ##
32
+ # Queries the WebCRM for the Event with the id +event_id+.
33
+ # @return [Infopark::Crm::Event] The event associated with this event contact, if +event_id+ is present.
34
+ # @webcrm_rest_url <code>GET /api/events/_event_id_</code>
35
+ def event
36
+ Infopark::Crm::Event.find(event_id) if event_id
37
+ end
38
+
39
+ end
4
40
  end; end
@@ -1,4 +1,37 @@
1
1
  module Infopark; module Crm
2
- # This is an extendable class. See Default::Mailing for documentation
3
- class Mailing < Default::Mailing; end
2
+ class Mailing < Core::Resource
3
+
4
+ ##
5
+ # @!method self.search(input)
6
+ # Searches for mailings
7
+ # @param input [Hash] A hash containing a +params+ key. The value of this key is a hash containing the actual search query.
8
+ # @return [Array<Infopark::Crm::Mailing>]
9
+ # @webcrm_rest_url <code>GET /api/mailings/search</code>
10
+ # @example
11
+ # results = Infopark::Crm::Mailing.search(:params => {:event_id => event_id})
12
+ # results = Infopark::Crm::Mailing.search(:params => {:only_unreleased => true})
13
+ # results = Infopark::Crm::Mailing.search(:params => {:q => 'full-text search'})
14
+ has_search
15
+
16
+ self.schema = {
17
+ :body => :string,
18
+ :dtstart_at => :time,
19
+ :email_from => :string,
20
+ :email_reply_to => :string,
21
+ :email_subject => :string,
22
+ :event_id => :string,
23
+ :html_body => :string,
24
+ :mailing_type => :string,
25
+ :title => :string,
26
+ }
27
+
28
+ ##
29
+ # Queries the WebCRM for the Event with the id +event_id+.
30
+ # @return [Infopark::Crm::Event] The event associated with this event contact, if +event_id+ is present.
31
+ # @webcrm_rest_url <code>GET /api/events/_event_id_</code>
32
+ def event
33
+ Infopark::Crm::Event.find(event_id) if event_id
34
+ end
35
+ end
36
+
4
37
  end; end
@@ -1,4 +1,9 @@
1
1
  module Infopark; module Crm
2
- # This is an extendable class. See Default::Role for documentation
3
- class Role < Default::Role; end
2
+ class Role < Core::Resource
3
+ self.schema = {
4
+ :description => :string,
5
+ :name => :string,
6
+ :permissions => :array,
7
+ }
8
+ end
4
9
  end; end