holderdeord/hdo-site

View on GitHub
app/models/proposition_connection.rb

Summary

Maintainability
A
0 mins
Test Coverage
# encoding: UTF-8

class PropositionConnection < ActiveRecord::Base
  belongs_to :issue
  belongs_to :proposition
  belongs_to :vote # optional

  attr_accessible :issue, :comment, :title, :proposition, :proposition_id, :vote_id

  validates_presence_of :issue, :proposition
  validates_uniqueness_of :proposition_id, scope: [:issue_id, :vote_id]

  validate :overrides_vote_if_proposition_has_several_votes

  def title_with_fallback
    title || proposition.simple_description || proposition.description
  end

  def html_comment
    if comment || proposition.simple_body
      Hdo::Utils::Markdown.render(comment || proposition.simple_body)
    else
      proposition.plain_body.truncate(200)
    end
  end

  def vote
    super || proposition.votes.first
  end

  def multiple_votes?
    proposition && proposition.votes.size > 1
  end

  def as_edit_view_json
    {
      vote_time: I18n.l(vote.time.localtime, format: :text_time_precise),
      vote_id: vote_id,
      multiple_votes: multiple_votes?,
      votes: proposition.votes.sort_by(&:time).map { |v| v.as_json(only: [:id, :subject]).merge(selected: v.id == vote_id) },
      hdo_title: title.present? || proposition.simple_description.present?,
      title: title_with_fallback,
      proposition_id: proposition.id,
      id: id,
      connected: true,
      comment: comment,
      connection_title: title
    }
  end

  private

  def overrides_vote_if_proposition_has_several_votes
    if vote_id.nil? && multiple_votes?
      errors.add :proposition, I18n.t('app.errors.proposition_connections.must_override_vote')
    end
  end

end