class Decidim::Proposals::ProposalSerializer

This class serializes a Proposal so can be exported to CSV, JSON or other formats.

Attributes

proposal[R]

Public Class Methods

new(proposal) click to toggle source

Public: Initializes the serializer with a proposal.

# File lib/decidim/proposals/proposal_serializer.rb, line 13
def initialize(proposal)
  @proposal = proposal
end

Public Instance Methods

serialize() click to toggle source

Public: Exports a hash with the serialized data for this proposal.

# File lib/decidim/proposals/proposal_serializer.rb, line 18
def serialize
  {
    id: proposal.id,
    category: {
      id: proposal.category.try(:id),
      name: proposal.category.try(:name) || empty_translatable
    },
    scope: {
      id: proposal.scope.try(:id),
      name: proposal.scope.try(:name) || empty_translatable
    },
    participatory_space: {
      id: proposal.participatory_space.id,
      url: Decidim::ResourceLocatorPresenter.new(proposal.participatory_space).url
    },
    component: { id: component.id },
    title: proposal.title,
    body: proposal.body,
    state: proposal.state.to_s,
    reference: proposal.reference,
    answer: ensure_translatable(proposal.answer),
    supports: proposal.proposal_votes_count,
    endorsements: {
      total_count: proposal.endorsements.count,
      user_endorsements: user_endorsements
    },
    comments: proposal.comments_count,
    attachments: proposal.attachments.count,
    followers: proposal.followers.count,
    published_at: proposal.published_at,
    url: url,
    meeting_urls: meetings,
    related_proposals: related_proposals,
    is_amend: proposal.emendation?,
    original_proposal: {
      title: proposal&.amendable&.title,
      url: original_proposal_url
    }
  }
end

Private Instance Methods

component() click to toggle source
# File lib/decidim/proposals/proposal_serializer.rb, line 63
def component
  proposal.component
end
meetings() click to toggle source
# File lib/decidim/proposals/proposal_serializer.rb, line 67
def meetings
  proposal.linked_resources(:meetings, "proposals_from_meeting").map do |meeting|
    Decidim::ResourceLocatorPresenter.new(meeting).url
  end
end
original_proposal_url() click to toggle source
# File lib/decidim/proposals/proposal_serializer.rb, line 87
def original_proposal_url
  return unless proposal.emendation? && proposal.amendable.present?

  Decidim::ResourceLocatorPresenter.new(proposal.amendable).url
end
url() click to toggle source
# File lib/decidim/proposals/proposal_serializer.rb, line 79
def url
  Decidim::ResourceLocatorPresenter.new(proposal).url
end
user_endorsements() click to toggle source
# File lib/decidim/proposals/proposal_serializer.rb, line 83
def user_endorsements
  proposal.endorsements.for_listing.map { |identity| identity.normalized_author&.name }
end