Class: Discussion

Inherits:
ApplicationRecord show all
Includes:
Contextualization, ParentNavigation, WithDiscussionStatus, WithScopedQueries
Defined in:
app/models/discussion.rb

Constant Summary

Constants included from WithScopedQueries

WithScopedQueries::SCOPING_METHODS

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ParentNavigation

#leave, #navigable_name, #navigable_parent, #navigation_end?

Methods included from Contextualization

#expectation_results_visible?, #failed_expectation_results, #feedback_html, #humanized_expectation_results, #queries_with_results, #result_html, #result_preview, #results_visible?, #single_visual_result?, #single_visual_result_html, #visible_expectation_results

Methods inherited from ApplicationRecord

aggregate_of, all_except, defaults, #delete, #destroy!, numbered, organic_on, resource_fields, #save, #save_and_notify!, #save_and_notify_changes!, serialize_symbolized_hash_array, #update_and_notify!, update_or_create!, whitelist_attributes

Class Method Details

.debatable_for(klazz, params) ⇒ Object



134
135
136
137
# File 'app/models/discussion.rb', line 134

def self.debatable_for(klazz, params)
  debatable_id = params[:"#{klazz.underscore}_id"]
  klazz.constantize.find(debatable_id)
end

Instance Method Details

#allowed_statuses_for(user) ⇒ Object



108
109
110
# File 'app/models/discussion.rb', line 108

def allowed_statuses_for(user)
  status.allowed_statuses_for(user, self)
end

#authorized?(user) ⇒ Boolean

Returns:

  • (Boolean)


91
92
93
# File 'app/models/discussion.rb', line 91

def authorized?(user)
  initiator?(user) || user.try(:moderator_here?)
end

#capitalize_titleObject



40
41
42
# File 'app/models/discussion.rb', line 40

def capitalize_title
  title.capitalize!
end

#commentable_by?(user) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
# File 'app/models/discussion.rb', line 48

def commentable_by?(user)
  user&.moderator_here? || (opened? && user.present?)
end

#extra_preview_htmlObject



128
129
130
131
132
# File 'app/models/discussion.rb', line 128

def extra_preview_html
  # FIXME this is buggy, because the extra
  # may have changed since the submission of this discussion
  exercise.assignment_for(initiator).extra_preview_html
end

#friendlyObject



68
69
70
# File 'app/models/discussion.rb', line 68

def friendly
  title
end

#has_messages?Boolean

Returns:

  • (Boolean)


116
117
118
# File 'app/models/discussion.rb', line 116

def has_messages?
  messages.exists? || description.present?
end

#has_responses?Boolean

Returns:

  • (Boolean)


124
125
126
# File 'app/models/discussion.rb', line 124

def has_responses?
  responses_count > 0
end

#has_submission?Boolean

Returns:

  • (Boolean)


56
57
58
# File 'app/models/discussion.rb', line 56

def has_submission?
  submission.solution.present?
end

#initiator?(user) ⇒ Boolean

Returns:

  • (Boolean)


95
96
97
# File 'app/models/discussion.rb', line 95

def initiator?(user)
  user.try(:uid) == initiator.uid
end

#last_message_dateObject



64
65
66
# File 'app/models/discussion.rb', line 64

def last_message_date
  messages.last&.created_at || created_at
end

#reachable_status_for?(user, status) ⇒ Boolean

Returns:

  • (Boolean)


104
105
106
# File 'app/models/discussion.rb', line 104

def reachable_status_for?(user, status)
  reachable_statuses_for(user).include? status
end

#reachable_statuses_for(user) ⇒ Object



99
100
101
102
# File 'app/models/discussion.rb', line 99

def reachable_statuses_for(user)
  return [] unless authorized?(user)
  status.reachable_statuses_for(user, self)
end

#read_by?(user) ⇒ Boolean

Returns:

  • (Boolean)


60
61
62
# File 'app/models/discussion.rb', line 60

def read_by?(user)
  subscription_for(user).read
end

#responses_countObject



120
121
122
# File 'app/models/discussion.rb', line 120

def responses_count
  messages.where.not(sender: initiator.uid).count
end

#submit_message!(message, user) ⇒ Object



84
85
86
87
88
89
# File 'app/models/discussion.rb', line 84

def submit_message!(message, user)
  message.merge!(sender: user.uid)
  messages.create(message)
  user.subscribe_to! self
  unread_subscriptions(user)
end

#subscribable?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'app/models/discussion.rb', line 52

def subscribable?
  opened? || solved?
end

#subscription_for(user) ⇒ Object



72
73
74
# File 'app/models/discussion.rb', line 72

def subscription_for(user)
  subscriptions.find_by(user: user)
end

#try_solve!Object



34
35
36
37
38
# File 'app/models/discussion.rb', line 34

def try_solve!
  if opened?
    update! status: reachable_statuses_for(initiator).first
  end
end

#unread_subscriptions(user) ⇒ Object



80
81
82
# File 'app/models/discussion.rb', line 80

def unread_subscriptions(user)
  subscriptions.where.not(user: user).map(&:unread!)
end

#update_status!(status, user) ⇒ Object



112
113
114
# File 'app/models/discussion.rb', line 112

def update_status!(status, user)
  update!(status: status) if reachable_status_for?(user, status)
end

#upvote_for(user) ⇒ Object



76
77
78
# File 'app/models/discussion.rb', line 76

def upvote_for(user)
  upvotes.find_by(user: user)
end

#used_in?(organization) ⇒ Boolean

Returns:

  • (Boolean)


44
45
46
# File 'app/models/discussion.rb', line 44

def used_in?(organization)
  organization == self.organization
end