infopark_crm_connector 0.9.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +8 -0
- data/CHANGELOG.markdown +94 -0
- data/LICENSE +2 -0
- data/README.markdown +110 -0
- data/lib/crm_connector.rb +11 -15
- data/lib/crm_connector/account.rb +31 -2
- data/lib/crm_connector/activity.rb +61 -3
- data/lib/crm_connector/configuration.rb +2 -4
- data/lib/crm_connector/contact.rb +123 -3
- data/lib/crm_connector/core/continuation_support.rb +2 -1
- data/lib/crm_connector/core/enumerator.rb +20 -11
- data/lib/crm_connector/core/known_attributes.rb +3 -1
- data/lib/crm_connector/core/resource.rb +108 -16
- data/lib/crm_connector/core/search_support.rb +3 -1
- data/lib/crm_connector/custom_type.rb +20 -3
- data/lib/crm_connector/{default.rb → errors.rb} +1 -1
- data/lib/crm_connector/errors/authentication_failed.rb +10 -0
- data/lib/crm_connector/errors/base.rb +8 -0
- data/lib/crm_connector/event.rb +37 -2
- data/lib/crm_connector/event_contact.rb +38 -2
- data/lib/crm_connector/mailing.rb +35 -2
- data/lib/crm_connector/role.rb +7 -2
- data/lib/crm_connector/system.rb +14 -8
- metadata +22 -53
- data/CHANGELOG.rdoc +0 -87
- data/README.rdoc +0 -59
- data/lib/crm_connector/base.rb +0 -4
- data/lib/crm_connector/core/base.rb +0 -111
- data/lib/crm_connector/debugging.rb +0 -21
- data/lib/crm_connector/default/account.rb +0 -30
- data/lib/crm_connector/default/activity.rb +0 -54
- data/lib/crm_connector/default/contact.rb +0 -112
- data/lib/crm_connector/default/custom_type.rb +0 -24
- data/lib/crm_connector/default/event.rb +0 -23
- data/lib/crm_connector/default/event_contact.rb +0 -57
- data/lib/crm_connector/default/mailing.rb +0 -33
- data/lib/crm_connector/default/resource.rb +0 -10
- data/lib/crm_connector/default/role.rb +0 -9
- data/lib/crm_connector/inheriting_resource.rb +0 -30
- data/lib/crm_connector/resource.rb +0 -15
data/.yardopts
ADDED
data/CHANGELOG.markdown
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
## Version 1.0.0 - 2012-09-14
|
2
|
+
* Enabled support for `event.custom_attributes`
|
3
|
+
* Removed deprecated functions `EventContact.find_by` and `EventContact.find_by_event_id_and_contact_id`. Please user `EventContact.search` instead.
|
4
|
+
* Removed `configuration.debug`.
|
5
|
+
* Renamed `Infopark::Crm::AuthenticationFailed` to `Infopark::Crm::Errors::AuthenticationFailed`.
|
6
|
+
* Merged `Infopark::Crm::Core::Base` and `Infopark::Crm::Resource` into `Infopark::Crm::Core:Resource`.
|
7
|
+
|
8
|
+
## Version 0.9.2 - 2012-03-19
|
9
|
+
* Security improvement for `Contact.authenticate`, `Contact.password_set` and `contact.password_request`
|
10
|
+
|
11
|
+
## Version 0.9.1 - 2012-02-28
|
12
|
+
* Removed `Diary`. Please use `Activity` instead.
|
13
|
+
* Added `Mailing`
|
14
|
+
* Added `appointment_*` and `task_*` fields to `Activity`
|
15
|
+
* Added `role_names` field to `Contact`
|
16
|
+
* Added `tags` field to `Activity`, `Account` and `Contact`
|
17
|
+
|
18
|
+
## Version 0.9 - 2012-01-27
|
19
|
+
Initial Release of Infopark CRM Connector
|
20
|
+
|
21
|
+
### Changes from OMC Connector to CRM Connector
|
22
|
+
* Namespace changed from `OmcConector::` to `Infopark::Crm::`
|
23
|
+
* Attribute names may have changed. For new attributes please refer to [Web Services API documentation](http://kb.infopark.de/crm-api).
|
24
|
+
* Works only with Infopark WebCRM.
|
25
|
+
|
26
|
+
#### Changed configuration
|
27
|
+
* `live_server_groups_callback` - replaces `contact_roles_callback`
|
28
|
+
|
29
|
+
#### New classes
|
30
|
+
* `CustomType`
|
31
|
+
* `Role`
|
32
|
+
* `System`
|
33
|
+
|
34
|
+
#### New methods
|
35
|
+
* `Account.search`
|
36
|
+
* `Activity.search`
|
37
|
+
* `Contact.search`
|
38
|
+
* `Event.search`
|
39
|
+
* `EventContact.search`
|
40
|
+
* `contact.live_server_groups` - replaces `contact.roles`
|
41
|
+
|
42
|
+
#### Removed classes
|
43
|
+
* `AccountCollection`
|
44
|
+
* `InquiryKind` - use `CustomType`
|
45
|
+
* `InquiryLink`
|
46
|
+
* `Inquiry` - use `Activity`
|
47
|
+
* `Location` - use `contact` and `account` properties
|
48
|
+
* `Mailing`
|
49
|
+
* `RegistrationInquiry`
|
50
|
+
* `Session`
|
51
|
+
|
52
|
+
|
53
|
+
#### Removed methods
|
54
|
+
* `account.contacts` - use `Contact.search(:params => {:acount_id => acount_id})`
|
55
|
+
* `Account.find_by_name` - use `Account.search`
|
56
|
+
* `account.inquiries` - use `Activity.search(:params => {:account_id => account_id})`
|
57
|
+
* `account.locations`
|
58
|
+
* `contact.account_activities` - use `Activity.search(:query => {:account_id => account_id})`
|
59
|
+
* `contact.activities` - use `Activity.search(:params => {:contact_id => contact_id})`
|
60
|
+
* `contact.create_activity`
|
61
|
+
* `contact.create_diary`
|
62
|
+
* `contact.create_location_with_account_association`
|
63
|
+
* `contact.create_location`
|
64
|
+
* `contact.create_registration_request`
|
65
|
+
* `contact.event_participation`
|
66
|
+
* `contact.find_activity`
|
67
|
+
* `Contact.find_by_email` - use `Contact.search(:params => {:email => email})`
|
68
|
+
* `Contact.find_by_login` - use `Contact.search(:params => {:login => login})`
|
69
|
+
* `Contact.languages`
|
70
|
+
* `contact.location`
|
71
|
+
* `Contact.lookup_uptions`
|
72
|
+
* `contact.move_location`
|
73
|
+
* `contact.roles` - use `contact.live_server_groups`
|
74
|
+
* `contact.serialized_attributes` - use `contact.attributes`
|
75
|
+
* `contact.subscriptions`
|
76
|
+
* `Contact.titles`
|
77
|
+
* `contact.update_location`
|
78
|
+
* `contact.update_subscriptions`
|
79
|
+
* `contact.validate_login` - use `Contact.search(:params => {:login => login})`
|
80
|
+
* `event.attend(!)`
|
81
|
+
* `event.contacts` - use `EventContact.search(:event_id => event_id)`
|
82
|
+
* `Event.find_by_name`
|
83
|
+
* `event.inquire(!)`
|
84
|
+
* `event.refuse(!)`
|
85
|
+
* `event.register(!)`
|
86
|
+
* `event_contact.attend` - use `event_contact.status = 'attended'`
|
87
|
+
* `event_contact.inquire` - use `event_contact.status = 'unregistered'`
|
88
|
+
* `event_contact.refuse` - use `event_contact.status = 'refused'`
|
89
|
+
* `event_contact.register` - use `event_contact.status = 'registered'`
|
90
|
+
* `event_contact.update_details`
|
91
|
+
* `inquiry.create_diary`
|
92
|
+
* `inquiry.create_link`
|
93
|
+
* `inquiry.diaries`
|
94
|
+
* `inquiry.links`
|
data/LICENSE
CHANGED
data/README.markdown
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
<img alt="Infopark WebCRM Connector" src="data:image/png;base64,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" />
|
2
|
+
|
3
|
+
|
4
|
+
Infopark WebCRM Connector is the official Ruby SDK for [Infopark WebCRM](http://www.infopark.de/webcrm). It basically wraps the [WebCRM web services API](http://kb.infopark.de/crm-api) using [Active Resource](http://rubydoc.info/gems/activeresource/3.2.8/frames). Currently, Active Resource 3.0, 3.1 and 3.2 in combination with Ruby 1.8.7 and 1.9.x are tested and supported.
|
5
|
+
|
6
|
+
# Installation
|
7
|
+
|
8
|
+
Add `infopark_crm_connector` to your `gemfile`:
|
9
|
+
|
10
|
+
gem 'infopark_crm_connector'
|
11
|
+
|
12
|
+
Install the gem with [Bundler](http://gembundler.com/):
|
13
|
+
|
14
|
+
bundle install
|
15
|
+
|
16
|
+
# Configuration
|
17
|
+
|
18
|
+
require 'infopark_crm_connector'
|
19
|
+
|
20
|
+
Infopark::Crm.configure do |configuration|
|
21
|
+
configuration.url = "https://webcrm.server/url"
|
22
|
+
configuration.login = "webcrm_user"
|
23
|
+
configuration.api_key = "api_key_of_webcrm_user"
|
24
|
+
end
|
25
|
+
|
26
|
+
# See, if it is working
|
27
|
+
Infopark::Crm::Contact.first.last_name
|
28
|
+
|
29
|
+
See {Infopark::Crm.configure} for a complete list of configuration keys.
|
30
|
+
|
31
|
+
# Example Usage
|
32
|
+
|
33
|
+
This Ruby SDK provides the WebCRM's domain models {Infopark::Crm::Account Account}, {Infopark::Crm::Activity Activity}, {Infopark::Crm::Contact Contact}, {Infopark::Crm::Event Event}, {Infopark::Crm::Mailing Mailing}, among others. All domain models are subclasses of {Infopark::Crm::Core::Resource} which itself inherits from {ActiveResource::Base} and provides methods such as `find(id)`, `create(hash)`, `update(hash)`, `search(params)` and others.
|
34
|
+
|
35
|
+
## Contact
|
36
|
+
# Retrieve the contact identified by the login 'root'
|
37
|
+
contact = Infopark::Crm::Contact.search(:params => {:login => 'root'}).first
|
38
|
+
|
39
|
+
# Change this contact's mail address
|
40
|
+
contact.update_attribute(:email, 'root@example.com')
|
41
|
+
|
42
|
+
# Send a new password request mail to the contact's address
|
43
|
+
contact.password_request
|
44
|
+
|
45
|
+
## Activity
|
46
|
+
|
47
|
+
# Create a new activity kind
|
48
|
+
Infopark::Crm::CustomType.create(:name => 'support case', :kind => 'Activity',
|
49
|
+
:states => ['created'])
|
50
|
+
|
51
|
+
# Create a new activity
|
52
|
+
activity = Infopark::Crm::Activity.new(:kind => 'support case')
|
53
|
+
|
54
|
+
# Set properties of this activity
|
55
|
+
activity.title = 'Sprechen Sie Deutsch?'
|
56
|
+
|
57
|
+
# Switch to a different request locale
|
58
|
+
Infopark::Crm.configure {|c| c.locale = 'de'}
|
59
|
+
|
60
|
+
# Post the activity (which is going to fail)
|
61
|
+
activity.save
|
62
|
+
# => false
|
63
|
+
|
64
|
+
# Get to know what's missing
|
65
|
+
activity.errors.to_hash
|
66
|
+
# => {:state=>["ist kein gültiger Wert"]}
|
67
|
+
|
68
|
+
# Contributing
|
69
|
+
|
70
|
+
The source code is freely available at (https://github.com/infopark/crm_connector). Pull requests are welcome.
|
71
|
+
|
72
|
+
## Get started
|
73
|
+
|
74
|
+
git clone git@github.com:infopark/crm_connector.git
|
75
|
+
cd crm_connector/
|
76
|
+
bundle
|
77
|
+
|
78
|
+
## Run tests
|
79
|
+
|
80
|
+
Configure `test/config.json` with an empty WebCRM tenant (see `test/config_template.json`)
|
81
|
+
|
82
|
+
Run tests with the current version of Active Resource:
|
83
|
+
|
84
|
+
bundle exec rake test
|
85
|
+
|
86
|
+
|
87
|
+
Run tests with all supported versions of Active Resource:
|
88
|
+
|
89
|
+
bundle exec rake appraisal:install
|
90
|
+
bundle exec rake appraisal
|
91
|
+
|
92
|
+
## Build and install gem
|
93
|
+
|
94
|
+
bundle exec rake gem #build
|
95
|
+
bundle exec rake install #build and install
|
96
|
+
|
97
|
+
## Documentation
|
98
|
+
|
99
|
+
bundle exec rake yard
|
100
|
+
open doc/index.html
|
101
|
+
|
102
|
+
# Changelog
|
103
|
+
|
104
|
+
{include:file:CHANGELOG.markdown}
|
105
|
+
|
106
|
+
# License
|
107
|
+
|
108
|
+
Copyright (c) 2009 - 2012 Infopark AG (http://www.infopark.com)
|
109
|
+
|
110
|
+
This software can be used and modified under the LGPLv3. Please refer to http://www.gnu.org/licenses/lgpl-3.0.html for the license text.
|
data/lib/crm_connector.rb
CHANGED
@@ -2,6 +2,7 @@ require 'active_resource'
|
|
2
2
|
require 'active_support/core_ext/string/conversions'
|
3
3
|
|
4
4
|
module Infopark; module Crm
|
5
|
+
# @private
|
5
6
|
def self.setup_autoload(mod, mod_source)
|
6
7
|
dir = File.expand_path(".", mod_source)[0..-4] # - ".rb"
|
7
8
|
pattern = "#{dir}/*.rb"
|
@@ -13,24 +14,20 @@ module Infopark; module Crm
|
|
13
14
|
end
|
14
15
|
|
15
16
|
setup_autoload(self, __FILE__)
|
16
|
-
|
17
|
-
# exceptions (defined elsewhere)
|
18
|
-
autoload :AuthenticationFailed, File.expand_path('../crm_connector/core/base', __FILE__)
|
19
|
-
|
20
17
|
end; end
|
21
18
|
|
22
19
|
module Infopark; module Crm
|
23
20
|
|
24
|
-
# Configures the web
|
21
|
+
# Configures the web services connection
|
25
22
|
#
|
26
|
-
# View {README
|
23
|
+
# View {file:README.markdown README} for a usage example.
|
27
24
|
#
|
28
25
|
# Supported configuration keys are:
|
29
|
-
# [url]
|
26
|
+
# [url] The web services server url (schema, host, port, path (up to, but not including /api)).
|
30
27
|
#
|
31
|
-
# [login]
|
28
|
+
# [login] The user name (login) of the WebCRM contact person.
|
32
29
|
#
|
33
|
-
# [api_key]
|
30
|
+
# [api_key] The WebCRM user's valid API key (web services credential).
|
34
31
|
#
|
35
32
|
# [locale] The locale to use when sending requests to the server. Can be
|
36
33
|
# redefined at any time.
|
@@ -43,9 +40,9 @@ module Infopark; module Crm
|
|
43
40
|
#
|
44
41
|
# Infopark::Crm::Contact.create.errors.full_messages
|
45
42
|
#
|
46
|
-
# [live_server_groups_callback] A custom definition of what
|
47
|
-
#
|
48
|
-
#
|
43
|
+
# [live_server_groups_callback] A custom definition of what a contact's live_server_groups field
|
44
|
+
# returns. Provide a lambda that takes the contact instance as an
|
45
|
+
# argument and returns an array of live_server_groups (strings).
|
49
46
|
#
|
50
47
|
# Example:
|
51
48
|
#
|
@@ -60,13 +57,12 @@ module Infopark; module Crm
|
|
60
57
|
# }
|
61
58
|
# end
|
62
59
|
#
|
63
|
-
# [debug] When set to true, includes the module Debugging into every resource, which
|
64
|
-
# provides a logger method. Cannot be reverted by setting to +false+
|
65
60
|
#
|
61
|
+
# @return [void]
|
66
62
|
def self.configure(&block)
|
67
63
|
yield Configuration
|
68
64
|
|
69
|
-
Core::
|
65
|
+
Core::Resource.configure(Configuration)
|
70
66
|
end
|
71
67
|
|
72
68
|
end; end
|
@@ -1,4 +1,33 @@
|
|
1
1
|
module Infopark; module Crm
|
2
|
-
|
3
|
-
class Account <
|
2
|
+
|
3
|
+
class Account < Core::Resource
|
4
|
+
|
5
|
+
##
|
6
|
+
# @!method self.search(input)
|
7
|
+
# Searches for accounts
|
8
|
+
# @param input [Hash] A hash containing a +params+ key. The value of this key is a hash containing the actual search query.
|
9
|
+
# @return [Core::Enumerator<Infopark::Crm::Account>]
|
10
|
+
# @webcrm_rest_url <code>GET /api/accounts/search</code>
|
11
|
+
# @example
|
12
|
+
# results = Infopark::Crm::Account.search(:params => {:account_group => 'account_group_name'})
|
13
|
+
# results = Infopark::Crm::Account.search(:params => {:q => 'full-text search'})
|
14
|
+
has_search
|
15
|
+
|
16
|
+
self.schema = {
|
17
|
+
:account_group => :string,
|
18
|
+
:country => :string,
|
19
|
+
:extended_address => :string,
|
20
|
+
:home_page => :string,
|
21
|
+
:locality => :string,
|
22
|
+
:name => :string,
|
23
|
+
:org_name_address => :string,
|
24
|
+
:org_unit_address => :string,
|
25
|
+
:phone => :string,
|
26
|
+
:postalcode => :string,
|
27
|
+
:region => :string,
|
28
|
+
:street_address => :string,
|
29
|
+
:tags => :array,
|
30
|
+
:want_geo_location => :boolean,
|
31
|
+
}
|
32
|
+
end
|
4
33
|
end; end
|
@@ -1,5 +1,63 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
1
3
|
module Infopark; module Crm
|
2
|
-
|
3
|
-
|
4
|
-
|
4
|
+
class Activity < Core::Resource
|
5
|
+
|
6
|
+
##
|
7
|
+
# @!method self.search(input)
|
8
|
+
# Searches for activities
|
9
|
+
# @param input [Hash] A hash containing a +params+ key. The value of this key is a hash containing the actual search query.
|
10
|
+
# @return [Array<Infopark::Crm::Activity>]
|
11
|
+
# @webcrm_rest_url <code>GET /api/activities/search</code>
|
12
|
+
# @example
|
13
|
+
# results = Infopark::Crm::Activity.search(:params => {:state => 'created'})
|
14
|
+
# results = Infopark::Crm::Activity.search(:params => {:kind => 'support case'})
|
15
|
+
# results = Infopark::Crm::Activity.search(:params => {:contact_id => cid})
|
16
|
+
# results = Infopark::Crm::Activity.search(:params => {:account_id => aid})
|
17
|
+
# results = Infopark::Crm::Activity.search(:params => {:q => 'full-text search'})
|
18
|
+
has_search
|
19
|
+
|
20
|
+
self.schema = {
|
21
|
+
:account_id => :string,
|
22
|
+
:appointment_contact_id => :string,
|
23
|
+
:appointment_dtend_at => :time,
|
24
|
+
:appointment_dtstart_at => :time,
|
25
|
+
:appointment_location => :string,
|
26
|
+
:comment_notes => :string,
|
27
|
+
:comment_published => :boolean,
|
28
|
+
:contact_id => :string,
|
29
|
+
:email_cc => :string,
|
30
|
+
:kind => :string,
|
31
|
+
:state => :string,
|
32
|
+
:tags => :array,
|
33
|
+
:task_due_at => :time,
|
34
|
+
:task_owner_id => :string,
|
35
|
+
:title => :string,
|
36
|
+
}
|
5
37
|
|
38
|
+
##
|
39
|
+
# Queries the WebCRM for the Contact with the id +contact_id+.
|
40
|
+
# @return [Infopark::Crm::Contact] The contact associated with this activity, if +contact_id+ is present.
|
41
|
+
# @webcrm_rest_url <code>GET /api/contacts/_contact_id_</code>
|
42
|
+
def contact
|
43
|
+
Infopark::Crm::Contact.find(contact_id) if contact_id
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# Queries the WebCRM for the Account with the id +account_id+.
|
48
|
+
# @return [Infopark::Crm::Account] The account associated with this activity, if +account_id+ is present.
|
49
|
+
# @webcrm_rest_url <code>GET /api/accounts/_account_id_</code>
|
50
|
+
def account
|
51
|
+
Infopark::Crm::Account.find(account_id) if account_id
|
52
|
+
end
|
53
|
+
|
54
|
+
##
|
55
|
+
# Queries the WebCRM for the CustomType with the id +kind+.
|
56
|
+
# @return [Infopark::Crm::CustomType] The custom type associated with this activity, if +kind+ is present.
|
57
|
+
# @webcrm_rest_url <code>GET /api/custom_types/_kind_</code>
|
58
|
+
def custom_type
|
59
|
+
Infopark::Crm::CustomType.find(kind) if kind
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end; end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
# :stopdoc:
|
2
|
-
|
3
1
|
require 'active_support/core_ext/class/attribute_accessors'
|
4
2
|
|
5
3
|
module Infopark; module Crm
|
4
|
+
|
5
|
+
# @private
|
6
6
|
class Configuration
|
7
7
|
|
8
8
|
cattr_accessor :api_key
|
@@ -17,8 +17,6 @@ module Infopark; module Crm
|
|
17
17
|
|
18
18
|
cattr_accessor :live_server_groups_callback
|
19
19
|
|
20
|
-
cattr_accessor :debug
|
21
|
-
|
22
20
|
self.login = "webservice"
|
23
21
|
|
24
22
|
self.live_server_groups_callback = lambda {|contact| []}
|
@@ -1,5 +1,125 @@
|
|
1
1
|
module Infopark; module Crm
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
class Contact < Core::Resource
|
3
|
+
|
4
|
+
##
|
5
|
+
# @!method self.search(input)
|
6
|
+
# Searches for 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::Contact>]
|
9
|
+
# @webcrm_rest_url <code>GET /api/contacts/search</code>
|
10
|
+
# @example
|
11
|
+
# results = Infopark::Crm::Contact.search(:params => {:login => 'the_login'})
|
12
|
+
# results = Infopark::Crm::Contact.search(:params => {:email => 'email@example.com'})
|
13
|
+
# results = Infopark::Crm::Contact.search(:params => {:q => 'full-text search'})
|
14
|
+
has_search
|
15
|
+
|
16
|
+
self.schema = {
|
17
|
+
:account_id => :string,
|
18
|
+
:country => :string,
|
19
|
+
:email => :string,
|
20
|
+
:extended_address => :string,
|
21
|
+
:fax => :string,
|
22
|
+
:first_name => :string,
|
23
|
+
:gender => :string,
|
24
|
+
:job_title => :string,
|
25
|
+
:language => :string,
|
26
|
+
:last_name => :string,
|
27
|
+
:locality => :string,
|
28
|
+
:login => :string,
|
29
|
+
:mobile_phone => :string,
|
30
|
+
:name_prefix => :string,
|
31
|
+
:org_name_address => :string,
|
32
|
+
:org_unit_address => :string,
|
33
|
+
:phone => :string,
|
34
|
+
:postalcode => :string,
|
35
|
+
:region => :string,
|
36
|
+
:role_names => :array,
|
37
|
+
:street_address => :string,
|
38
|
+
:tags => :array,
|
39
|
+
:want_email => :boolean,
|
40
|
+
:want_geo_location => :boolean,
|
41
|
+
:want_phonecall => :boolean,
|
42
|
+
:want_snailmail => :boolean,
|
43
|
+
}
|
44
|
+
|
45
|
+
##
|
46
|
+
# Queries the WebCRM for the Account with the id +account_id+.
|
47
|
+
# @return [Infopark::Crm::Account] The account associated with this contact, if +account_id+ is present.
|
48
|
+
# @webcrm_rest_url <code>GET /api/accounts/_account_id_</code>
|
49
|
+
def account
|
50
|
+
Infopark::Crm::Account.find(account_id) if account_id
|
51
|
+
end
|
52
|
+
|
53
|
+
##
|
54
|
+
# Looks for the user with the given +login+ and check whether the +password+ is correct.
|
55
|
+
# @param login [String]
|
56
|
+
# @param password [String]
|
57
|
+
# @return [Infopark::Crm::Contact] The found and authenticated contact.
|
58
|
+
# @raise [Infopark::Crm::Errors::AuthenticationFailed] if provided +password+ is not correct.
|
59
|
+
# @webcrm_rest_url <code>POST /api/contacts/authenticate</code>
|
60
|
+
def self.authenticate(login, password)
|
61
|
+
begin
|
62
|
+
response = post(:authenticate, {}, format.encode({:login => login, :password => password}))
|
63
|
+
result = format.decode(response.body)
|
64
|
+
return find(result['id']) if result.kind_of? Hash # ActiveResource 3.0
|
65
|
+
find(result)
|
66
|
+
rescue ActiveResource::ResourceInvalid
|
67
|
+
raise Errors::AuthenticationFailed
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# Sets a new +password+ for the contact, which is associated with the given +token+.
|
73
|
+
# @param password [String] The new password.
|
74
|
+
# @param token [String] The token provided by +password_request+ which is associated with a contact.
|
75
|
+
# @return [String] The result message from the server.
|
76
|
+
# @webcrm_rest_url <code>POST /api/contacts/password_set</code>
|
77
|
+
def self.password_set(password, token)
|
78
|
+
response = post(:password_set, {}, format.encode({:password => password, :token => token}))
|
79
|
+
result = format.decode(response.body)
|
80
|
+
return result['message'] if result.kind_of? Hash # ActiveResource 3.0
|
81
|
+
result
|
82
|
+
end
|
5
83
|
|
84
|
+
##
|
85
|
+
# Sets the password of this contact to +password+.
|
86
|
+
# @param password [String] the new password
|
87
|
+
# @return [void]
|
88
|
+
def password_set(password)
|
89
|
+
token = password_request(:params => {:only_get_token => true})
|
90
|
+
self.class.password_set(password, token)
|
91
|
+
end
|
92
|
+
|
93
|
+
##
|
94
|
+
# Instructs the WebCRM to send the user an e-mail to let them set a new password.
|
95
|
+
# @param options [Hash]
|
96
|
+
# @webcrm_rest_url <code>GET /api/contacts/_id_/password_request</code>
|
97
|
+
# @webcrm_todo return nil instead of message for default parameters?
|
98
|
+
def password_request(options = {})
|
99
|
+
params = options[:params] || {}
|
100
|
+
response = post(:password_request, {}, self.class.format.encode(params))
|
101
|
+
result = self.class.format.decode(response.body)
|
102
|
+
return result.values.first if result.kind_of? Hash # ActiveResource 3.0
|
103
|
+
result
|
104
|
+
end
|
105
|
+
|
106
|
+
# Returns the live_server_groups of this contact as defined by +Configuration.live_server_groups_callback+
|
107
|
+
# @return [Array<String>] The calculated roles of this contact.
|
108
|
+
def live_server_groups
|
109
|
+
return @live_server_groups if defined?(@live_server_groups)
|
110
|
+
callback = Configuration.live_server_groups_callback
|
111
|
+
@live_server_groups = callback.call(self) if callback.respond_to?(:call)
|
112
|
+
raise "live_server_groups_callback: not defined or unexpected result!" unless @live_server_groups
|
113
|
+
|
114
|
+
@live_server_groups
|
115
|
+
end
|
116
|
+
|
117
|
+
##
|
118
|
+
# Overwrites +live_server_groups+, so live_server_groups_callback is not called for this object.
|
119
|
+
# @return [void]
|
120
|
+
def live_server_groups=(value)
|
121
|
+
@live_server_groups = value
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end; end
|