Noosfero/noosfero

View on GitHub
plugins/lattes_curriculum/lib/lattes_curriculum_plugin.rb

Summary

Maintainability
B
4 hrs
Test Coverage
class LattesCurriculumPlugin < Noosfero::Plugin
  def self.plugin_name
    "Lattes Curriculum Plugin"
  end

  def self.plugin_description
    _("A plugin that imports the lattes curriculum into the users profiles")
  end

  def js_files
    ["singup_complement.js"]
  end

  def stylesheet?
    true
  end

  def extra_optional_fields
    fields = []

    lattes_url = {
      name: "lattes_url",
      label: "Lattes URL",
      object_name: :academic_infos,
      method: :lattes_url,
      value: context.profile.nil? ? "" : context.profile.academic_info.lattes_url
    }

    fields << lattes_url

    return fields
  end

  def profile_tabs
    if show_lattes_tab?
      href = context.profile.academic_info.lattes_url
      html_parser = Html_parser.new
      {
        title: _("Lattes"),
        id: "lattes_tab",
        content: lambda { html_parser.get_html(href) },
        start: false
      }
    end
  end

  def profile_editor_transaction_extras
    if context.profile.person?
      if context.params.has_key?(:academic_infos)
        academic_info_transaction
      end
    end
  end

  def profile_editor_controller_filters
    validate_lattes_url_block = proc do
      parameters = params.to_h.with_indifferent_access
      if request.post?
        if !parameters[:academic_infos].blank?
          @profile_data = profile

          academic_infos = { "academic_info_attributes" => parameters[:academic_infos] }

          params_profile_data = parameters[:profile_data]
          params_profile_data = params_profile_data.merge(academic_infos)

          @profile_data.attributes = params_profile_data
          @profile_data.valid?

          @possible_domains = profile.possible_domains

          unless AcademicInfo.matches?(parameters[:academic_infos])
            @profile_data.errors.add(:lattes_url, _(" Invalid lattes url"))
            render action: :informations, profile: profile.identifier
          end
        end
      end
    end

    create_academic_info_block = proc do
      if profile && profile.person? && profile.academic_info.nil?
        profile.academic_info = AcademicInfo.new
      end
    end

    [{ type: "before_action",
       method_name: "validate_lattes_url",
       options: { only: "informations" },
       block: validate_lattes_url_block },
     { type: "before_action",
       method_name: "create_academic_info",
       options: { only: "informations" },
       block: create_academic_info_block }]
  end

  def account_controller_filters
    validate_lattes_url_block = proc do
      parameters = params.to_h.with_indifferent_access
      if request.post?
        parameters[:profile_data] ||= {}
        parameters[:profile_data][:academic_info_attributes] = parameters[:academic_infos]

        if !parameters[:academic_infos].blank? && !AcademicInfo.matches?(parameters[:academic_infos])
          @person = Person.new(parameters[:profile_data])
          @person.environment = environment
          @user = User.new(parameters[:user])
          @person.errors.add(:lattes_url, _(" Invalid lattes url"))
          render action: :signup
        end
      end
    end

    create_academic_info_block = proc do
      if profile && profile.person? && profile.academic_info.nil?
        profile.academic_info = AcademicInfo.new
      end
    end

    [{ type: "before_action",
       method_name: "validate_lattes_url",
       options: { only: "signup" },
       block: validate_lattes_url_block },
     { type: "before_action",
       method_name: "create_academic_info",
       options: { only: "informations" },
       block: create_academic_info_block }]
  end

  protected

    def academic_info_transaction
      AcademicInfo.transaction do
        context.profile.academic_info.update!(context.params[:academic_infos])
      end
    end

    def show_lattes_tab?
      return context.profile.person? && !context.profile.academic_info.nil? && !context.profile.academic_info.lattes_url.blank? && context.profile.public_fields.include?("lattes_url")
    end
end