data_privacy_task.rb 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class DataPrivacyTask < ApplicationModel
  3. include DataPrivacyTask::HasActivityStreamLog
  4. include ChecksClientNotification
  5. store :preferences
  6. belongs_to :created_by, class_name: 'User'
  7. belongs_to :updated_by, class_name: 'User'
  8. # optional because related data will get deleted and it would
  9. # cause validation errors if e.g. the created_by_id of the task
  10. # would need to get mapped by a deletion
  11. belongs_to :deletable, polymorphic: true, optional: true
  12. before_create :prepare_deletion_preview
  13. validates_with DataPrivacyTask::Validation
  14. def perform
  15. return if deletable.blank?
  16. prepare_deletion_preview
  17. save!
  18. if delete_organization?
  19. deletable.organization.destroy
  20. else
  21. deletable.destroy
  22. end
  23. update!(state: 'completed')
  24. rescue => e
  25. handle_exception(e)
  26. end
  27. def handle_exception(e)
  28. Rails.logger.error e
  29. preferences[:error] = "ERROR: #{e.inspect}"
  30. self.state = 'failed'
  31. save!
  32. end
  33. def delete_organization?
  34. return false if preferences[:delete_organization].blank?
  35. return false if preferences[:delete_organization] != 'true'
  36. return false if !deletable.organization
  37. return false if deletable.organization.members.count != 1
  38. true
  39. end
  40. def prepare_deletion_preview
  41. prepare_deletion_preview_tickets
  42. prepare_deletion_preview_user
  43. prepare_deletion_preview_organization
  44. prepare_deletion_preview_anonymize
  45. end
  46. def prepare_deletion_preview_tickets
  47. preferences[:owner_tickets] = deletable.owner_tickets.order(id: 'DESC').map(&:number)
  48. preferences[:customer_tickets] = deletable.customer_tickets.order(id: 'DESC').map(&:number)
  49. end
  50. def prepare_deletion_preview_user
  51. preferences[:user] = {
  52. firstname: deletable.firstname,
  53. lastname: deletable.lastname,
  54. email: deletable.email,
  55. }
  56. end
  57. def prepare_deletion_preview_organization
  58. return if !deletable.organization
  59. preferences[:user][:organization] = deletable.organization.name
  60. end
  61. def prepare_deletion_preview_anonymize
  62. preferences[:user] = Pseudonymisation.of_hash(preferences[:user])
  63. end
  64. end