Class: GoodData::Profile

Inherits:
Rest::Resource show all
Defined in:
lib/gooddata/models/profile.rb

Constant Summary collapse

EMPTY_OBJECT =
{
  'accountSetting' => {
    'companyName' => nil,
    'country' => nil,
    'created' => nil,
    'firstName' => nil,
    'lastName' => nil,
    'login' => nil,
    'phoneNumber' => nil,
    'position' => nil,
    'timezone' => nil,
    'updated' => nil,
    'language' => nil,
    'links' => {
      'projects' => nil,
      'self' => nil
    },
    'email' => nil,
    'authenticationModes' => []
  }
}
ASSIGNABLE_MEMBERS =
[
  :company,
  :country,
  :email,
  :login,
  :first_name,
  :last_name,
  :phone,
  :position,
  :timezone,
  :language
]
PROFILE_PATH =
'/gdc/account/profile/%s'

Instance Attribute Summary collapse

Attributes inherited from Rest::Object

#client, #project

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Rest::Object

client, default_client, #saved?

Methods included from Mixin::DataPropertyReader

#data_property_reader

Methods included from Mixin::DataPropertyWriter

#data_property_writer

Methods included from Mixin::MetaPropertyReader

#metadata_property_reader

Methods included from Mixin::MetaPropertyWriter

#metadata_property_writer

Methods included from Mixin::MetaGetter

#meta

Methods included from Mixin::RootKeyGetter

#root_key

Constructor Details

#initialize(json) ⇒ Profile

Creates new instance



118
119
120
121
# File 'lib/gooddata/models/profile.rb', line 118

def initialize(json)
  @json = json
  @dirty = false
end

Instance Attribute Details

#jsonObject (readonly)

Returns the value of attribute json.



15
16
17
# File 'lib/gooddata/models/profile.rb', line 15

def json
  @json
end

#userObject (readonly)

Returns the value of attribute user.



15
16
17
# File 'lib/gooddata/models/profile.rb', line 15

def user
  @user
end

Class Method Details

.[](id, opts = { client: GoodData.connection }) ⇒ Object

Get profile by ID or URI

Parameters:

  • id

    ID or URI of user to be found

  • opts (Hash) (defaults to: { client: GoodData.connection })

    Additional optional options

Options Hash (opts):

Returns:

  • GoodData::Profile User Profile



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/gooddata/models/profile.rb', line 61

def [](id, opts = { client: GoodData.connection })
  return id if id.instance_of?(GoodData::Profile) || id.respond_to?(:profile?) && id.profile?

  if id.to_s !~ %r{^(\/gdc\/account\/profile\/)?[a-zA-Z\d]+$}
    fail(ArgumentError, 'wrong type of argument. Should be either profile ID or path')
  end

  id = id.match(/[a-zA-Z\d]+$/)[0] if id =~ %r{/}

  c = client(opts)
  fail ArgumentError, 'No :client specified' if c.nil?

  response = c.get(PROFILE_PATH % id)
  c.factory.create(Profile, response)
end

.create(attributes) ⇒ GoodData::Profile

Creates new instance from hash with attributes

Parameters:

  • attributes (Hash)

    Hash with initial attributes

Returns:



81
82
83
84
85
# File 'lib/gooddata/models/profile.rb', line 81

def create(attributes)
  res = create_object(attributes)
  res.save!
  res
end

.create_object(attributes) ⇒ Object



87
88
89
90
91
92
93
94
95
96
# File 'lib/gooddata/models/profile.rb', line 87

def create_object(attributes)
  json = GoodData::Helpers.deep_dup(EMPTY_OBJECT)
  json['accountSetting']['links']['self'] = attributes[:uri] if attributes[:uri]
  res = client.create(GoodData::Profile, json)

  attributes.each do |k, v|
    res.send("#{k}=", v) if ASSIGNABLE_MEMBERS.include? k
  end
  res
end

.currentGoodData::Profile

Gets user currently logged in

Returns:



110
111
112
# File 'lib/gooddata/models/profile.rb', line 110

def current
  client.user
end

.diff(item1, item2) ⇒ Object



98
99
100
101
102
# File 'lib/gooddata/models/profile.rb', line 98

def diff(item1, item2)
  x = diff_list([item1], [item2])
  return {} if x[:changed].empty?
  x[:changed].first[:diff]
end

.diff_list(list1, list2) ⇒ Object



104
105
106
# File 'lib/gooddata/models/profile.rb', line 104

def diff_list(list1, list2)
  GoodData::Helpers.diff(list1, list2, key: :login)
end

Instance Method Details

#!=(other) ⇒ Boolean

Checks objects for non-equality

Parameters:

Returns:

  • (Boolean)

    True if different else false



136
137
138
# File 'lib/gooddata/models/profile.rb', line 136

def !=(other)
  !(self == other)
end

#==(other) ⇒ Boolean

Checks objects for equality

Parameters:

Returns:

  • (Boolean)

    True if same else false



127
128
129
130
# File 'lib/gooddata/models/profile.rb', line 127

def ==(other)
  return false unless other.respond_to?(:to_hash)
  to_hash == other.to_hash
end

#authentication_modesObject



445
446
447
# File 'lib/gooddata/models/profile.rb', line 445

def authentication_modes
  @json['accountSetting']['authenticationModes'].map { |x| x.downcase.to_sym }
end

#authentication_modes=(modes) ⇒ Object



449
450
451
452
453
# File 'lib/gooddata/models/profile.rb', line 449

def authentication_modes=(modes)
  modes = Array(modes)
  @dirty = true
  @json['accountSetting']['authenticationModes'] = modes.map { |x| x.to_s.upcase }
end

#channelsObject



476
477
478
# File 'lib/gooddata/models/profile.rb', line 476

def channels
  GoodData::ChannelConfiguration.all(client: client)
end

#companyString

Gets the company name

Returns:

  • (String)

    Company name



151
152
153
# File 'lib/gooddata/models/profile.rb', line 151

def company
  @json['accountSetting']['companyName'] || ''
end

#company=(val) ⇒ Object

Set the company name

Parameters:

  • val (String)

    Company name to be set



158
159
160
161
# File 'lib/gooddata/models/profile.rb', line 158

def company=(val)
  @dirty ||= company != val
  @json['accountSetting']['companyName'] = val
end

#contentObject



418
419
420
421
# File 'lib/gooddata/models/profile.rb', line 418

def content
  keys = (data.keys - ['links'])
  data.slice(*keys)
end

#countryString

Gets the country

Returns:

  • (String)

    Country



181
182
183
# File 'lib/gooddata/models/profile.rb', line 181

def country
  @json['accountSetting']['country'] || ''
end

#country=(val) ⇒ Object

Set the country

Parameters:

  • val (String)

    Country to be set



188
189
190
191
# File 'lib/gooddata/models/profile.rb', line 188

def country=(val)
  @dirty ||= country != val
  @json['accountSetting']['country'] = val
end

#create_channelObject



472
473
474
# File 'lib/gooddata/models/profile.rb', line 472

def create_channel
  GoodData::ChannelConfiguration.create(to: email, title: email, client: client)
end

#createdDateTime

Gets date when created

Returns:

  • (DateTime)

    Created date



196
197
198
# File 'lib/gooddata/models/profile.rb', line 196

def created
  DateTime.parse(@json['accountSetting']['created'])
end

#dataObject



409
410
411
412
# File 'lib/gooddata/models/profile.rb', line 409

def data
  data = @json || {}
  data['accountSetting'] || {}
end

#deleteObject

Deletes this account settings



201
202
203
# File 'lib/gooddata/models/profile.rb', line 201

def delete
  client.delete uri
end

#diff(user) ⇒ Hash

Gets hash representing diff of profiles

Parameters:

Returns:

  • (Hash)

    Hash representing diff



209
210
211
# File 'lib/gooddata/models/profile.rb', line 209

def diff(user)
  GoodData::Profile.diff(self, user)
end

#emailString

Gets the email

Returns:

  • (String)

    Email address



216
217
218
# File 'lib/gooddata/models/profile.rb', line 216

def email
  @json['accountSetting']['email'].is_a?(String) ? @json['accountSetting']['email'].downcase : ''
end

#email=(val) ⇒ Object

Set the email

Parameters:

  • val (String)

    Email to be set



223
224
225
226
# File 'lib/gooddata/models/profile.rb', line 223

def email=(val)
  @dirty ||= email != val
  @json['accountSetting']['email'] = val
end

#first_nameString

Gets the first name

Returns:

  • (String)

    First name



231
232
233
# File 'lib/gooddata/models/profile.rb', line 231

def first_name
  @json['accountSetting']['firstName'] || ''
end

#first_name=(val) ⇒ Object

Set the first name

Parameters:

  • val (String)

    First name to be set



238
239
240
241
# File 'lib/gooddata/models/profile.rb', line 238

def first_name=(val)
  @dirty ||= first_name != val
  @json['accountSetting']['firstName'] = val
end

#full_nameObject Also known as: title

Get full name

NOTE: This can be tricky to implement correctly for i18n

Returns:

  • String Full Name



247
248
249
# File 'lib/gooddata/models/profile.rb', line 247

def full_name
  "#{first_name} #{last_name}"
end

#languageString

Gets the language

Returns:

  • (String)

    Language



166
167
168
# File 'lib/gooddata/models/profile.rb', line 166

def language
  @json['accountSetting']['language'] || 'en-US'
end

#language=(val) ⇒ Object

Set the language

Parameters:

  • val (String)

    Language to be set



173
174
175
176
# File 'lib/gooddata/models/profile.rb', line 173

def language=(val)
  @dirty ||= language != val
  @json['accountSetting']['language'] = val
end

#last_nameString

Gets the last name

Returns:

  • (String)

    Last name



256
257
258
# File 'lib/gooddata/models/profile.rb', line 256

def last_name
  @json['accountSetting']['lastName'] || ''
end

#last_name=(val) ⇒ Object

Set the last name

Parameters:

  • val (String)

    Last name to be set



263
264
265
266
# File 'lib/gooddata/models/profile.rb', line 263

def last_name=(val)
  @dirty ||= last_name != val
  @json['accountSetting']['lastName'] = val
end


414
415
416
# File 'lib/gooddata/models/profile.rb', line 414

def links
  data['links'] || {}
end

#loginString

Gets the login

Returns:

  • (String)

    Login



271
272
273
# File 'lib/gooddata/models/profile.rb', line 271

def 
  @json['accountSetting']['login'] || ''
end

#login=(val) ⇒ Object

Set the login

Parameters:

  • val (String)

    Login to be set



278
279
280
281
# File 'lib/gooddata/models/profile.rb', line 278

def login=(val)
  @dirty ||=  != val
  @json['accountSetting']['login'] = val
end

#nameObject



423
424
425
# File 'lib/gooddata/models/profile.rb', line 423

def name
  (first_name || '') + (last_name || '')
end

#obj_idString Also known as: account_setting_id

Gets the resource identifier

Returns:

  • (String)

    Resource identifier



286
287
288
# File 'lib/gooddata/models/profile.rb', line 286

def obj_id
  uri.split('/').last
end

#passwordObject



427
428
429
# File 'lib/gooddata/models/profile.rb', line 427

def password
  @json['accountSetting']['password']
end

#password=(a_password) ⇒ Object



431
432
433
434
# File 'lib/gooddata/models/profile.rb', line 431

def password=(a_password)
  @dirty = true
  @json['accountSetting']['password'] = a_password
end

#phoneString Also known as: phone_number

Gets the phone

Returns:

  • (String)

    Phone



295
296
297
# File 'lib/gooddata/models/profile.rb', line 295

def phone
  @json['accountSetting']['phoneNumber'] || ''
end

#phone=(val) ⇒ Object Also known as: phone_number=

Set the phone

Parameters:

  • val (String)

    Phone to be set



304
305
306
307
# File 'lib/gooddata/models/profile.rb', line 304

def phone=(val)
  @dirty ||= phone != val
  @json['accountSetting']['phoneNumber'] = val
end

#positionString

Gets the position in company

Returns:

  • (String)

    Position in company



314
315
316
# File 'lib/gooddata/models/profile.rb', line 314

def position
  @json['accountSetting']['position'] || ''
end

#position=(val) ⇒ Object

Set the position

Parameters:

  • val (String)

    Position to be set



321
322
323
324
# File 'lib/gooddata/models/profile.rb', line 321

def position=(val)
  @dirty ||= position != val
  @json['accountSetting']['position'] = val
end

#projects(limit = nil, offset = nil) ⇒ Array<GoodData::Project>

Gets the array of projects

Parameters:

  • limit (Integer) (defaults to: nil)

    maximum number of projects to get.

  • offset (Integer) (defaults to: nil)

    offset of the first project, start from 0.

Returns:

Raises:

  • (ArgumentError)


330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
# File 'lib/gooddata/models/profile.rb', line 330

def projects(limit = nil, offset = nil)
  url = @json['accountSetting']['links']['projects']

  all_projects = []

  raise ArgumentError, 'Params limit and offset are expected' if !offset.nil? && limit.nil?

  if limit.nil?
    url += "?limit=500"
    loop do
      projects = client.get url
      projects['projects']['items'].each do |project|
        all_projects << client.create(GoodData::Project, project)
      end
      if !projects['projects']['paging'].nil? && !projects['projects']['paging']['next'].nil?
        url = projects['projects']['paging']['next']
      else
        break
      end
    end
  else
    limit = [limit, 500].min if limit.is_a?(Integer) && limit > 0

    url += "?limit=#{limit}"
    url += "&offset=#{offset}" if !offset.nil? && offset.is_a?(Integer) && offset > 0

    projects = client.get url
    projects['projects']['items'].each do |project|
      all_projects << client.create(GoodData::Project, project)
    end
  end

  all_projects
end

#save!Object

Saves object if dirty, clears dirty flag



366
367
368
369
370
371
372
373
374
375
376
377
378
# File 'lib/gooddata/models/profile.rb', line 366

def save!
  if @dirty
    raw = @json.dup
    raw['accountSetting'].delete('login')

    if uri && !uri.empty?
      url = "/gdc/account/profile/#{obj_id}"
      @json = client.put url, raw
      @dirty = false
    end
  end
  self
end

#sso_providerObject



436
437
438
# File 'lib/gooddata/models/profile.rb', line 436

def sso_provider
  @json['accountSetting']['ssoProvider']
end

#sso_provider=(an_sso_provider) ⇒ Object



440
441
442
443
# File 'lib/gooddata/models/profile.rb', line 440

def sso_provider=(an_sso_provider)
  @dirty = true
  @json['accountSetting']['ssoProvider'] = an_sso_provider
end

#timezoneString

Gets the preferred timezone

Returns:

  • (String)

    Preferred timezone



383
384
385
# File 'lib/gooddata/models/profile.rb', line 383

def timezone
  @json['accountSetting']['timezone'] || ''
end

#timezone=(val) ⇒ Object

Set the timezone

Parameters:

  • val (String)

    Timezone to be set



390
391
392
393
# File 'lib/gooddata/models/profile.rb', line 390

def timezone=(val)
  @dirty ||= timezone != val
  @json['accountSetting']['timezone'] = val
end

#to_hashObject



455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
# File 'lib/gooddata/models/profile.rb', line 455

def to_hash
  tmp = GoodData::Helpers.symbolize_keys(content.merge(uri: uri))
  [
    [:companyName, :company],
    [:phoneNumber, :phone],
    [:firstName, :first_name],
    [:lastName, :last_name],
    [:authenticationModes, :authentication_modes],
    [:ssoProvider, :sso_provider]
  ].each do |vals|
    wire, rb = vals
    tmp[rb] = tmp[wire]
    tmp.delete(wire)
  end
  tmp
end

#updatedDateTime

Gets the date when updated

Returns:

  • (DateTime)

    Updated date



398
399
400
# File 'lib/gooddata/models/profile.rb', line 398

def updated
  DateTime.parse(@json['accountSetting']['updated'])
end

#uriString

Gets the resource REST URI

Returns:

  • (String)

    Resource URI



405
406
407
# File 'lib/gooddata/models/profile.rb', line 405

def uri
  GoodData::Helpers.get_path(@json, %w(accountSetting links self))
end