Class: PostSerializer

Inherits:
BasicPostSerializer show all
Defined in:
app/serializers/post_serializer.rb

Direct Known Subclasses

WebHookPostSerializer

Instance Attribute Summary

Attributes inherited from BasicPostSerializer

#topic_view

Instance Method Summary collapse

Methods inherited from BasicPostSerializer

#avatar_template, #cooked, #cooked_hidden, #include_cooked_hidden?, #include_name?, #name, #post_custom_fields, #username

Methods inherited from ApplicationSerializer

expire_cache_fragment!, fragment_cache

Methods inherited from ActiveModel::Serializer

#include!

Constructor Details

#initialize(object, opts) ⇒ PostSerializer

Returns a new instance of PostSerializer.



93
94
95
96
97
98
99
# File 'app/serializers/post_serializer.rb', line 93

def initialize(object, opts)
  super(object, opts)

  PostSerializer::INSTANCE_VARS.each do |name|
    self.public_send("#{name}=", opts[name]) if opts.include? name
  end
end

Instance Method Details

#action_codeObject



456
457
458
459
# File 'app/serializers/post_serializer.rb', line 456

def action_code
  return "open_topic" if object.action_code == "public_topic" && SiteSetting.
  object.action_code
end

#action_code_pathObject



473
474
475
# File 'app/serializers/post_serializer.rb', line 473

def action_code_path
  post_custom_fields["action_code_path"]
end

#action_code_whoObject



465
466
467
# File 'app/serializers/post_serializer.rb', line 465

def action_code_who
  post_custom_fields["action_code_who"]
end

#actionsObject

Helper function to decide between #post_actions and @all_post_actions



282
283
284
285
286
# File 'app/serializers/post_serializer.rb', line 282

def actions
  return post_actions if post_actions.present?
  return all_post_actions[object.id] if all_post_actions.present?
  nil
end

#actions_summaryObject

Summary of the actions taken on this post



289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
# File 'app/serializers/post_serializer.rb', line 289

def actions_summary
  result = []
  can_see_post = scope.can_see_post?(object)

  PostActionType.types.each do |sym, id|
    count_col = "#{sym}_count".to_sym

    count = object.public_send(count_col) if object.respond_to?(count_col)
    summary = { id: id, count: count }

    if scope.post_can_act?(
         object,
         sym,
         opts: {
           taken_actions: actions,
         },
         can_see_post: can_see_post,
       )
      summary[:can_act] = true
    end

    if sym == :notify_user &&
         (
           (scope.current_user.present? && scope.current_user == object.user) ||
             (object.user && object.user.bot?)
         )
      summary.delete(:can_act)
    end

    if actions.present? && SiteSetting.allow_anonymous_likes && sym == :like &&
         !scope.can_delete_post_action?(actions[id])
      summary.delete(:can_act)
    end

    if actions.present? && actions.has_key?(id)
      summary[:acted] = true

      summary[:can_undo] = true if scope.can_delete?(actions[id])
    end

    # only show public data
    unless scope.is_staff? || PostActionType.public_types.values.include?(id)
      summary[:count] = summary[:acted] ? 1 : 0
    end

    summary.delete(:count) if summary[:count] == 0

    # Only include it if the user can do it or it has a count
    result << summary if summary[:can_act] || summary[:count]
  end

  result
end

#admin?Boolean

Returns:

  • (Boolean)


137
138
139
# File 'app/serializers/post_serializer.rb', line 137

def admin?
  !!(object&.user&.admin?)
end

#bookmark_auto_delete_preferenceObject



406
407
408
# File 'app/serializers/post_serializer.rb', line 406

def bookmark_auto_delete_preference
  post_bookmark&.auto_delete_preference
end

#bookmark_idObject



410
411
412
# File 'app/serializers/post_serializer.rb', line 410

def bookmark_id
  post_bookmark&.id
end

#bookmark_nameObject



402
403
404
# File 'app/serializers/post_serializer.rb', line 402

def bookmark_name
  post_bookmark&.name
end

#bookmark_reminder_atObject



398
399
400
# File 'app/serializers/post_serializer.rb', line 398

def bookmark_reminder_at
  post_bookmark&.reminder_at
end

#bookmarkedObject



370
371
372
# File 'app/serializers/post_serializer.rb', line 370

def bookmarked
  @bookmarked ||= post_bookmark.present?
end

#can_deleteObject



168
169
170
# File 'app/serializers/post_serializer.rb', line 168

def can_delete
  scope.can_delete?(object)
end

#can_editObject



164
165
166
# File 'app/serializers/post_serializer.rb', line 164

def can_edit
  scope.can_edit?(object)
end

#can_permanently_deleteObject



172
173
174
# File 'app/serializers/post_serializer.rb', line 172

def can_permanently_delete
  true
end

#can_recoverObject



180
181
182
# File 'app/serializers/post_serializer.rb', line 180

def can_recover
  scope.can_recover_post?(object)
end

#can_see_hidden_postObject



184
185
186
# File 'app/serializers/post_serializer.rb', line 184

def can_see_hidden_post
  scope.can_see_hidden_post?(object)
end

#can_view_edit_historyObject



418
419
420
# File 'app/serializers/post_serializer.rb', line 418

def can_view_edit_history
  scope.can_view_edit_history?(object)
end

#can_wikiObject



188
189
190
# File 'app/serializers/post_serializer.rb', line 188

def can_wiki
  scope.can_wiki?(object)
end

#category_idObject



129
130
131
# File 'app/serializers/post_serializer.rb', line 129

def category_id
  topic&.category_id
end

#deleted_byObject



273
274
275
# File 'app/serializers/post_serializer.rb', line 273

def deleted_by
  BasicUserSerializer.new(object.deleted_by, root: false).as_json
end

#display_usernameObject



192
193
194
# File 'app/serializers/post_serializer.rb', line 192

def display_username
  object.user&.name
end

#flair_bg_colorObject



214
215
216
# File 'app/serializers/post_serializer.rb', line 214

def flair_bg_color
  object.user&.flair_group&.flair_bg_color
end

#flair_colorObject



218
219
220
# File 'app/serializers/post_serializer.rb', line 218

def flair_color
  object.user&.flair_group&.flair_color
end

#flair_group_idObject



222
223
224
# File 'app/serializers/post_serializer.rb', line 222

def flair_group_id
  object.user&.flair_group_id
end

#flair_nameObject



206
207
208
# File 'app/serializers/post_serializer.rb', line 206

def flair_name
  object.user&.flair_group&.name
end

#flair_urlObject



210
211
212
# File 'app/serializers/post_serializer.rb', line 210

def flair_url
  object.user&.flair_group&.flair_url
end

#group_moderatorObject



145
146
147
# File 'app/serializers/post_serializer.rb', line 145

def group_moderator
  !!@group_moderator
end

#include_action_code?Boolean

Returns:

  • (Boolean)


461
462
463
# File 'app/serializers/post_serializer.rb', line 461

def include_action_code?
  object.action_code.present?
end

#include_action_code_path?Boolean

Returns:

  • (Boolean)


477
478
479
# File 'app/serializers/post_serializer.rb', line 477

def include_action_code_path?
  include_action_code? && action_code_path.present?
end

#include_action_code_who?Boolean

Returns:

  • (Boolean)


469
470
471
# File 'app/serializers/post_serializer.rb', line 469

def include_action_code_who?
  include_action_code? && action_code_who.present?
end

#include_bookmark_auto_delete_preference?Boolean

Returns:

  • (Boolean)


382
383
384
# File 'app/serializers/post_serializer.rb', line 382

def include_bookmark_auto_delete_preference?
  bookmarked
end

#include_bookmark_id?Boolean

Returns:

  • (Boolean)


386
387
388
# File 'app/serializers/post_serializer.rb', line 386

def include_bookmark_id?
  bookmarked
end

#include_bookmark_name?Boolean

Returns:

  • (Boolean)


378
379
380
# File 'app/serializers/post_serializer.rb', line 378

def include_bookmark_name?
  bookmarked
end

#include_bookmark_reminder_at?Boolean

Returns:

  • (Boolean)


374
375
376
# File 'app/serializers/post_serializer.rb', line 374

def include_bookmark_reminder_at?
  bookmarked
end

#include_can_permanently_delete?Boolean

Returns:

  • (Boolean)


176
177
178
# File 'app/serializers/post_serializer.rb', line 176

def include_can_permanently_delete?
  SiteSetting.can_permanently_delete && scope.is_admin? && object.deleted_at
end

#include_category_id?Boolean

Returns:

  • (Boolean)


113
114
115
# File 'app/serializers/post_serializer.rb', line 113

def include_category_id?
  @add_title
end

#include_deleted_by?Boolean

Returns:

  • (Boolean)


277
278
279
# File 'app/serializers/post_serializer.rb', line 277

def include_deleted_by?
  scope.is_staff? && object.deleted_by.present?
end

#include_display_username?Boolean

Returns:

  • (Boolean)


414
415
416
# File 'app/serializers/post_serializer.rb', line 414

def include_display_username?
  SiteSetting.enable_names?
end

#include_draft_sequence?Boolean

Returns:

  • (Boolean)


343
344
345
# File 'app/serializers/post_serializer.rb', line 343

def include_draft_sequence?
  @draft_sequence.present?
end

#include_excerpt?Boolean

Returns:

  • (Boolean)


117
118
119
# File 'app/serializers/post_serializer.rb', line 117

def include_excerpt?
  @add_excerpt
end

#include_group_moderator?Boolean

Returns:

  • (Boolean)


149
150
151
152
153
154
155
156
157
158
# File 'app/serializers/post_serializer.rb', line 149

def include_group_moderator?
  @group_moderator ||=
    begin
      if @topic_view
        @topic_view.category_group_moderator_user_ids.include?(object.user_id)
      else
        object&.user&.guardian&.is_category_group_moderator?(object&.topic&.category)
      end
    end
end

#include_hidden_reason_id?Boolean

Returns:

  • (Boolean)


519
520
521
# File 'app/serializers/post_serializer.rb', line 519

def include_hidden_reason_id?
  object.hidden
end

#include_is_auto_generated?Boolean

Returns:

  • (Boolean)


446
447
448
# File 'app/serializers/post_serializer.rb', line 446

def include_is_auto_generated?
  object.via_email? && is_auto_generated
end

#include_last_wiki_edit?Boolean

Returns:

  • (Boolean)


515
516
517
# File 'app/serializers/post_serializer.rb', line 515

def include_last_wiki_edit?
  object.wiki && object.post_number == 1 && object.revisions.size > 0
end

Returns:

  • (Boolean)


355
356
357
358
359
360
# File 'app/serializers/post_serializer.rb', line 355

def include_link_counts?
  return true if @single_post_link_counts.present?

  @topic_view.present? && @topic_view.link_counts.present? &&
    @topic_view.link_counts[object.id].present?
end

#include_locked?Boolean

Only show locked posts to the users who made the post and staff

Returns:

  • (Boolean)


507
508
509
# File 'app/serializers/post_serializer.rb', line 507

def include_locked?
  object.locked? && (yours || scope.is_staff?)
end

#include_mentioned_users?Boolean

Returns:

  • (Boolean)


592
593
594
# File 'app/serializers/post_serializer.rb', line 592

def include_mentioned_users?
  SiteSetting.enable_user_status
end

#include_notice?Boolean

Returns:

  • (Boolean)


485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
# File 'app/serializers/post_serializer.rb', line 485

def include_notice?
  return false if notice.blank?

  case notice["type"]
  when Post.notices[:custom]
    return true
  when Post.notices[:new_user]
    min_trust_level = SiteSetting.new_user_notice_tl
  when Post.notices[:returning_user]
    min_trust_level = SiteSetting.returning_user_notice_tl
  else
    return false
  end

  scope.user && scope.user.id != object.user_id && scope.user.has_trust_level?(min_trust_level)
end

#include_raw?Boolean

Returns:

  • (Boolean)


351
352
353
# File 'app/serializers/post_serializer.rb', line 351

def include_raw?
  @add_raw.present? && (!object.hidden || scope.user&.staff? || yours)
end

#include_read?Boolean

Returns:

  • (Boolean)


362
363
364
# File 'app/serializers/post_serializer.rb', line 362

def include_read?
  @topic_view.present?
end

#include_reply_to_user?Boolean

Returns:

  • (Boolean)


366
367
368
# File 'app/serializers/post_serializer.rb', line 366

def include_reply_to_user?
  !(SiteSetting.suppress_reply_when_quoting && object.reply_quoted?) && object.reply_to_user
end

#include_reviewable_id?Boolean

Returns:

  • (Boolean)


533
534
535
# File 'app/serializers/post_serializer.rb', line 533

def include_reviewable_id?
  can_review_topic?
end

#include_reviewable_score_count?Boolean

Returns:

  • (Boolean)


546
547
548
# File 'app/serializers/post_serializer.rb', line 546

def include_reviewable_score_count?
  can_review_topic?
end

#include_reviewable_score_pending_count?Boolean

Returns:

  • (Boolean)


559
560
561
# File 'app/serializers/post_serializer.rb', line 559

def include_reviewable_score_pending_count?
  can_review_topic?
end

#include_slug_title?Boolean

Returns:

  • (Boolean)


347
348
349
# File 'app/serializers/post_serializer.rb', line 347

def include_slug_title?
  @topic_slug.present?
end

#include_static_doc?Boolean

Returns:

  • (Boolean)


434
435
436
# File 'app/serializers/post_serializer.rb', line 434

def include_static_doc?
  object.is_first_post? && Discourse.static_doc_topic_ids.include?(object.topic_id)
end

#include_title_is_group?Boolean

Returns:

  • (Boolean)


257
258
259
# File 'app/serializers/post_serializer.rb', line 257

def include_title_is_group?
  object&.user&.title.present?
end

#include_topic_html_title?Boolean

Returns:

  • (Boolean)


109
110
111
# File 'app/serializers/post_serializer.rb', line 109

def include_topic_html_title?
  @add_title
end

#include_topic_title?Boolean

Returns:

  • (Boolean)


105
106
107
# File 'app/serializers/post_serializer.rb', line 105

def include_topic_title?
  @add_title
end

#include_user_custom_fields?Boolean

Returns:

  • (Boolean)


426
427
428
# File 'app/serializers/post_serializer.rb', line 426

def include_user_custom_fields?
  user_custom_fields_object[object.user_id]
end

#include_user_status?Boolean

Returns:

  • (Boolean)


571
572
573
# File 'app/serializers/post_serializer.rb', line 571

def include_user_status?
  SiteSetting.enable_user_status && object.user&.has_status?
end

#include_user_suspended?Boolean

Returns:

  • (Boolean)


567
568
569
# File 'app/serializers/post_serializer.rb', line 567

def include_user_suspended?
  object.user&.suspended?
end

#include_via_email?Boolean

Returns:

  • (Boolean)


438
439
440
# File 'app/serializers/post_serializer.rb', line 438

def include_via_email?
  object.via_email?
end

#is_auto_generatedObject



442
443
444
# File 'app/serializers/post_serializer.rb', line 442

def is_auto_generated
  object.incoming_email&.is_auto_generated
end

#last_wiki_editObject



511
512
513
# File 'app/serializers/post_serializer.rb', line 511

def last_wiki_edit
  object.revisions.last.updated_at
end


226
227
228
229
230
231
232
233
234
235
236
237
238
239
# File 'app/serializers/post_serializer.rb', line 226

def link_counts
  return @single_post_link_counts if @single_post_link_counts.present?

  # TODO: This could be better, just porting the old one over
  @topic_view.link_counts[object.id].map do |link|
    result = {}
    result[:url] = link[:url]
    result[:internal] = link[:internal]
    result[:reflection] = link[:reflection]
    result[:title] = link[:title] if link[:title].present?
    result[:clicks] = link[:clicks] || 0
    result
  end
end

#lockedObject



502
503
504
# File 'app/serializers/post_serializer.rb', line 502

def locked
  true
end

#mentioned_usersObject



579
580
581
582
583
584
585
586
587
588
589
590
# File 'app/serializers/post_serializer.rb', line 579

def mentioned_users
  users =
    if @topic_view && (mentioned_users = @topic_view.mentioned_users[object.id])
      mentioned_users
    else
      query = User
      query = query.includes(:user_status) if SiteSetting.enable_user_status
      query = query.where(username: object.mentions)
    end

  users.map { |user| BasicUserWithStatusSerializer.new(user, root: false) }
end

#moderator?Boolean

Returns:

  • (Boolean)


133
134
135
# File 'app/serializers/post_serializer.rb', line 133

def moderator?
  !!(object&.user&.moderator?)
end

#noticeObject



481
482
483
# File 'app/serializers/post_serializer.rb', line 481

def notice
  post_custom_fields[Post::NOTICE]
end

#post_bookmarkObject



390
391
392
393
394
395
396
# File 'app/serializers/post_serializer.rb', line 390

def post_bookmark
  if @topic_view.present?
    @post_bookmark ||= @topic_view.bookmarks.find { |bookmark| bookmark.bookmarkable == object }
  else
    @post_bookmark ||= Bookmark.find_by(user: scope.user, bookmarkable: object)
  end
end

#primary_group_nameObject



196
197
198
199
200
201
202
203
204
# File 'app/serializers/post_serializer.rb', line 196

def primary_group_name
  return nil unless object.user && object.user.primary_group_id

  if @topic_view
    @topic_view.primary_group_names[object.user.primary_group_id]
  else
    object.user.primary_group.name if object.user.primary_group
  end
end

#readObject



241
242
243
# File 'app/serializers/post_serializer.rb', line 241

def read
  @topic_view.read?(object.post_number)
end

#reply_to_userObject



265
266
267
268
269
270
271
# File 'app/serializers/post_serializer.rb', line 265

def reply_to_user
  {
    username: object.reply_to_user.username,
    name: object.reply_to_user.name,
    avatar_template: object.reply_to_user.avatar_template,
  }
end

#reviewable_idObject

If we have a topic view, it has bulk values for the reviewable content we can use



524
525
526
527
528
529
530
531
# File 'app/serializers/post_serializer.rb', line 524

def reviewable_id
  if @topic_view.present?
    for_post = @topic_view.reviewable_counts[object.id]
    return for_post ? for_post[:reviewable_id] : 0
  end

  reviewable&.id
end

#reviewable_score_countObject



537
538
539
540
541
542
543
544
# File 'app/serializers/post_serializer.rb', line 537

def reviewable_score_count
  if @topic_view.present?
    for_post = @topic_view.reviewable_counts[object.id]
    return for_post ? for_post[:total] : 0
  end

  reviewable_scores.size
end

#reviewable_score_pending_countObject



550
551
552
553
554
555
556
557
# File 'app/serializers/post_serializer.rb', line 550

def reviewable_score_pending_count
  if @topic_view.present?
    for_post = @topic_view.reviewable_counts[object.id]
    return for_post ? for_post[:pending] : 0
  end

  reviewable_scores.count { |rs| rs.pending? }
end

#scoreObject



245
246
247
# File 'app/serializers/post_serializer.rb', line 245

def score
  object.score || 0
end

#staff?Boolean

Returns:

  • (Boolean)


141
142
143
# File 'app/serializers/post_serializer.rb', line 141

def staff?
  !!(object&.user&.staff?)
end

#static_docObject



430
431
432
# File 'app/serializers/post_serializer.rb', line 430

def static_doc
  true
end

#title_is_groupObject



253
254
255
# File 'app/serializers/post_serializer.rb', line 253

def title_is_group
  object&.user&.title == object.user&.primary_group&.title
end

#topic_html_titleObject



125
126
127
# File 'app/serializers/post_serializer.rb', line 125

def topic_html_title
  topic&.fancy_title
end

#topic_slugObject



101
102
103
# File 'app/serializers/post_serializer.rb', line 101

def topic_slug
  topic&.slug
end

#topic_titleObject



121
122
123
# File 'app/serializers/post_serializer.rb', line 121

def topic_title
  topic&.title
end

#trust_levelObject



261
262
263
# File 'app/serializers/post_serializer.rb', line 261

def trust_level
  object&.user&.trust_level
end

#user_custom_fieldsObject



422
423
424
# File 'app/serializers/post_serializer.rb', line 422

def user_custom_fields
  user_custom_fields_object[object.user_id]
end

#user_statusObject



575
576
577
# File 'app/serializers/post_serializer.rb', line 575

def user_status
  UserStatusSerializer.new(object.user&.user_status, root: false)
end

#user_suspendedObject



563
564
565
# File 'app/serializers/post_serializer.rb', line 563

def user_suspended
  true
end

#user_titleObject



249
250
251
# File 'app/serializers/post_serializer.rb', line 249

def user_title
  object&.user&.title
end

#versionObject



450
451
452
453
454
# File 'app/serializers/post_serializer.rb', line 450

def version
  return 1 if object.hidden && !scope.can_view_hidden_post_revisions?

  scope.is_staff? ? object.version : object.public_version
end

#yoursObject



160
161
162
# File 'app/serializers/post_serializer.rb', line 160

def yours
  scope.user == object.user
end