/app/forms/gobierto_admin/admin_form.rb

https://github.com/PopulateTools/gobierto · Ruby · 153 lines · 118 code · 31 blank · 4 comment · 10 complexity · 7d4cca93efca151a3fe2a071c85f34ef MD5 · raw file

  1. # frozen_string_literal: true
  2. module GobiertoAdmin
  3. class AdminForm < BaseForm
  4. attr_accessor(
  5. :id,
  6. :site,
  7. :name,
  8. :email,
  9. :password,
  10. :password_confirmation,
  11. :creation_ip,
  12. :last_sign_in_at,
  13. :last_sign_in_ip
  14. )
  15. attr_reader :permitted_sites, :sites, :admin_group_ids, :admin_groups
  16. attr_writer :authorization_level
  17. delegate :persisted?, to: :admin
  18. validates :name, :email, :site, presence: true
  19. validates :email, format: { with: Admin::EMAIL_ADDRESS_REGEXP }
  20. validates :password, presence: { if: :new_record? }, confirmation: true
  21. def initialize(attributes = {})
  22. parsed_attributes = attributes.to_h.with_indifferent_access
  23. super(parsed_attributes.except(:permitted_sites, :admin_group_ids))
  24. set_permitted_sites(parsed_attributes)
  25. set_admin_groups(parsed_attributes)
  26. end
  27. def save
  28. @new_record = admin.new_record?
  29. return false unless valid?
  30. if save_admin
  31. send_invitation if send_invitation?
  32. admin
  33. end
  34. end
  35. def admin
  36. @admin ||= Admin.find_by(id: id).presence || build_admin
  37. end
  38. def authorization_level
  39. @authorization_level ||= "regular"
  40. end
  41. private
  42. def build_admin
  43. Admin.new
  44. end
  45. def email_changed?
  46. @email_changed
  47. end
  48. def new_record?
  49. @new_record
  50. end
  51. def set_permitted_sites(attributes)
  52. if authorization_level != "regular"
  53. @permitted_sites = []
  54. @sites = Site.none
  55. elsif attributes[:permitted_sites].present?
  56. @permitted_sites = attributes[:permitted_sites].select(&:present?).map(&:to_i).compact
  57. @sites = Site.where(id: permitted_sites)
  58. elsif @admin
  59. @permitted_sites = @admin.sites.pluck(:id)
  60. @sites = @admin.sites
  61. else
  62. @permitted_sites = []
  63. @sites = Site.none
  64. end
  65. end
  66. def set_admin_groups(attributes)
  67. @admin_group_ids = if authorization_level != "regular"
  68. []
  69. elsif attributes[:admin_group_ids].present?
  70. attributes[:admin_group_ids].select(&:present?).map(&:to_i).compact
  71. elsif @admin
  72. @admin.admin_groups.pluck(:id)
  73. else
  74. []
  75. end
  76. @admin_groups = AdminGroup.normal.where(id: admin_group_ids)
  77. end
  78. def allowed_admin_groups
  79. permitted_sites_existing_groups = @admin.admin_groups.normal.where(site: sites.where.not(id: site.id))
  80. site_groups = admin_groups.normal.where(site: site)
  81. system_groups = @admin.admin_groups.system
  82. permitted_sites_existing_groups + site_groups + system_groups
  83. end
  84. def save_admin
  85. @admin = admin.tap do |admin_attributes|
  86. admin_attributes.name = name
  87. admin_attributes.email = email
  88. admin_attributes.password = password if password
  89. admin_attributes.authorization_level = authorization_level if authorization_level.present?
  90. admin_attributes.creation_ip = creation_ip
  91. end
  92. # Check changes
  93. @email_changed = @admin.email_changed?
  94. if @admin.valid?
  95. ActiveRecord::Base.transaction do
  96. @admin.save unless persisted?
  97. # TODO: site permissions are being duplicated, add constraints or something
  98. # AR has no way to tell 2 records represent the same
  99. @admin.sites = []
  100. @admin.sites = sites # This is a has_many through association
  101. @admin.admin_groups = allowed_admin_groups
  102. @admin.save
  103. end
  104. @admin
  105. else
  106. promote_errors(@admin.errors)
  107. false
  108. end
  109. end
  110. def send_invitation?
  111. new_record?
  112. end
  113. def send_invitation
  114. admin.regenerate_invitation_token
  115. deliver_invitation_email
  116. end
  117. protected
  118. def deliver_invitation_email
  119. AdminMailer.invitation_instructions(admin).deliver_later
  120. end
  121. end
  122. end