user.rb 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. module Import
  2. module OTRS
  3. class User
  4. include Import::Helper
  5. include Import::OTRS::Helper
  6. MAPPING = {
  7. ChangeTime: :updated_at,
  8. CreateTime: :created_at,
  9. CreateBy: :created_by_id,
  10. ChangeBy: :updated_by_id,
  11. UserID: :id,
  12. Comment: :note,
  13. UserEmail: :email,
  14. UserFirstname: :firstname,
  15. UserLastname: :lastname,
  16. UserLogin: :login,
  17. }.freeze
  18. def initialize(user)
  19. import(user)
  20. end
  21. private
  22. def import(user)
  23. create_or_update(map(user))
  24. end
  25. def create_or_update(user)
  26. ensure_unique_login(user)
  27. return if updated?(user)
  28. create(user)
  29. end
  30. def updated?(user)
  31. @local_user = ::User.find_by(id: user[:id])
  32. return false if !@local_user
  33. # only update roles if different (reduce sql statements)
  34. if @local_user.role_ids == user[:role_ids]
  35. user.delete(:role_ids)
  36. end
  37. log "update User.find_by(id: #{user[:id]})"
  38. @local_user.update_attributes(user)
  39. true
  40. end
  41. def create(user)
  42. log "add User.find_by(id: #{user[:id]})"
  43. @local_user = ::User.new(user)
  44. @local_user.id = user[:id]
  45. @local_user.save
  46. reset_primary_key_sequence('users')
  47. end
  48. def ensure_unique_login(user)
  49. user[:login] = unique_login(user)
  50. end
  51. def unique_login(user)
  52. login = user[:login]
  53. return login if ::User.where('login = ? AND id != ?', login.downcase, user[:id]).count.zero?
  54. "#{login}_#{user[:id]}"
  55. end
  56. def map(user)
  57. {
  58. created_by_id: 1,
  59. updated_by_id: 1,
  60. active: active?(user),
  61. source: 'OTRS Import',
  62. role_ids: role_ids(user),
  63. group_ids: group_ids(user),
  64. password: password(user),
  65. }
  66. .merge(from_mapping(user))
  67. end
  68. def password(user)
  69. return if !user['UserPw']
  70. "{sha2}#{user['UserPw']}"
  71. end
  72. def group_ids(user)
  73. result = []
  74. queues = Import::OTRS::Requester.load('Queue')
  75. queues.each { |queue|
  76. permissions = user['GroupIDs'][ queue['GroupID'] ]
  77. next if !permissions
  78. next if !permissions.include?('rw')
  79. result.push queue['QueueID']
  80. }
  81. # lookup by roles
  82. # roles of user
  83. # groups of roles
  84. # queues of group
  85. result
  86. end
  87. def role_ids(user)
  88. local_role_ids = []
  89. roles(user).each { |role|
  90. role_lookup = Role.lookup(name: role)
  91. next if !role_lookup
  92. local_role_ids.push role_lookup.id
  93. }
  94. local_role_ids
  95. end
  96. def roles(user)
  97. local_roles = ['Agent']
  98. local_roles += groups_from_otrs_groups(user)
  99. local_roles += groups_from_otrs_roles(user)
  100. local_roles.uniq
  101. end
  102. def groups_from_otrs_groups(role_object)
  103. groups = Import::OTRS::Requester.load('Group')
  104. groups_from_groups(role_object, groups)
  105. end
  106. def groups_from_groups(role_object, groups)
  107. result = []
  108. groups.each { |group|
  109. result += groups_from_otrs_group(role_object, group)
  110. }
  111. result
  112. end
  113. def groups_from_otrs_group(role_object, group)
  114. result = []
  115. return result if role_object['GroupIDs'].empty?
  116. permissions = role_object['GroupIDs'][ group['ID'] ]
  117. return result if !permissions
  118. if group['Name'] == 'admin' && permissions.include?('rw')
  119. result.push 'Admin'
  120. end
  121. return result if group['Name'] !~ /^(stats|report)/
  122. return result if !( permissions.include?('ro') || permissions.include?('rw') )
  123. result.push 'Report'
  124. result
  125. end
  126. def groups_from_otrs_roles(user)
  127. result = []
  128. roles = Import::OTRS::Requester.load('Role')
  129. roles.each { |role|
  130. next if !user['RoleIDs'].include?(role['ID'])
  131. result += groups_from_otrs_groups(role['GroupIDs'])
  132. }
  133. result
  134. end
  135. end
  136. end
  137. end