Class: PostSerializer
Instance Attribute Summary
#topic_view
Instance Method Summary
collapse
#avatar_template, #cooked, #cooked_hidden, #include_cooked_hidden?, #include_name?, #name, #post_custom_fields, #username
expire_cache_fragment!, fragment_cache
#include!
Constructor Details
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_code ⇒ Object
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.login_required?
object.action_code
end
|
#action_code_path ⇒ Object
473
474
475
|
# File 'app/serializers/post_serializer.rb', line 473
def action_code_path
post_custom_fields["action_code_path"]
end
|
#action_code_who ⇒ Object
465
466
467
|
# File 'app/serializers/post_serializer.rb', line 465
def action_code_who
post_custom_fields["action_code_who"]
end
|
#actions ⇒ Object
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_summary ⇒ Object
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
unless scope.is_staff? || PostActionType.public_types.values.include?(id)
summary[:count] = summary[:acted] ? 1 : 0
end
summary.delete(:count) if summary[:count] == 0
result << summary if summary[:can_act] || summary[:count]
end
result
end
|
#admin? ⇒ Boolean
137
138
139
|
# File 'app/serializers/post_serializer.rb', line 137
def admin?
!!(object&.user&.admin?)
end
|
#bookmark_auto_delete_preference ⇒ Object
406
407
408
|
# File 'app/serializers/post_serializer.rb', line 406
def bookmark_auto_delete_preference
post_bookmark&.auto_delete_preference
end
|
#bookmark_id ⇒ Object
410
411
412
|
# File 'app/serializers/post_serializer.rb', line 410
def bookmark_id
post_bookmark&.id
end
|
#bookmark_name ⇒ Object
402
403
404
|
# File 'app/serializers/post_serializer.rb', line 402
def bookmark_name
post_bookmark&.name
end
|
#bookmark_reminder_at ⇒ Object
398
399
400
|
# File 'app/serializers/post_serializer.rb', line 398
def bookmark_reminder_at
post_bookmark&.reminder_at
end
|
#bookmarked ⇒ Object
370
371
372
|
# File 'app/serializers/post_serializer.rb', line 370
def bookmarked
@bookmarked ||= post_bookmark.present?
end
|
#can_delete ⇒ Object
168
169
170
|
# File 'app/serializers/post_serializer.rb', line 168
def can_delete
scope.can_delete?(object)
end
|
#can_edit ⇒ Object
164
165
166
|
# File 'app/serializers/post_serializer.rb', line 164
def can_edit
scope.can_edit?(object)
end
|
#can_permanently_delete ⇒ Object
172
173
174
|
# File 'app/serializers/post_serializer.rb', line 172
def can_permanently_delete
true
end
|
#can_recover ⇒ Object
180
181
182
|
# File 'app/serializers/post_serializer.rb', line 180
def can_recover
scope.can_recover_post?(object)
end
|
#can_see_hidden_post ⇒ Object
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_history ⇒ Object
418
419
420
|
# File 'app/serializers/post_serializer.rb', line 418
def can_view_edit_history
scope.can_view_edit_history?(object)
end
|
#can_wiki ⇒ Object
188
189
190
|
# File 'app/serializers/post_serializer.rb', line 188
def can_wiki
scope.can_wiki?(object)
end
|
#category_id ⇒ Object
129
130
131
|
# File 'app/serializers/post_serializer.rb', line 129
def category_id
topic&.category_id
end
|
#deleted_by ⇒ Object
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_username ⇒ Object
192
193
194
|
# File 'app/serializers/post_serializer.rb', line 192
def display_username
object.user&.name
end
|
#flair_bg_color ⇒ Object
214
215
216
|
# File 'app/serializers/post_serializer.rb', line 214
def flair_bg_color
object.user&.flair_group&.flair_bg_color
end
|
#flair_color ⇒ Object
218
219
220
|
# File 'app/serializers/post_serializer.rb', line 218
def flair_color
object.user&.flair_group&.flair_color
end
|
#flair_group_id ⇒ Object
222
223
224
|
# File 'app/serializers/post_serializer.rb', line 222
def flair_group_id
object.user&.flair_group_id
end
|
#flair_name ⇒ Object
206
207
208
|
# File 'app/serializers/post_serializer.rb', line 206
def flair_name
object.user&.flair_group&.name
end
|
#flair_url ⇒ Object
210
211
212
|
# File 'app/serializers/post_serializer.rb', line 210
def flair_url
object.user&.flair_group&.flair_url
end
|
#group_moderator ⇒ Object
145
146
147
|
# File 'app/serializers/post_serializer.rb', line 145
def group_moderator
!!@group_moderator
end
|
#include_action_code? ⇒ 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
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
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
382
383
384
|
# File 'app/serializers/post_serializer.rb', line 382
def include_bookmark_auto_delete_preference?
bookmarked
end
|
#include_bookmark_id? ⇒ Boolean
386
387
388
|
# File 'app/serializers/post_serializer.rb', line 386
def include_bookmark_id?
bookmarked
end
|
#include_bookmark_name? ⇒ Boolean
378
379
380
|
# File 'app/serializers/post_serializer.rb', line 378
def include_bookmark_name?
bookmarked
end
|
#include_bookmark_reminder_at? ⇒ Boolean
374
375
376
|
# File 'app/serializers/post_serializer.rb', line 374
def include_bookmark_reminder_at?
bookmarked
end
|
#include_can_permanently_delete? ⇒ 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
113
114
115
|
# File 'app/serializers/post_serializer.rb', line 113
def include_category_id?
@add_title
end
|
#include_deleted_by? ⇒ 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
414
415
416
|
# File 'app/serializers/post_serializer.rb', line 414
def include_display_username?
SiteSetting.enable_names?
end
|
#include_draft_sequence? ⇒ Boolean
343
344
345
|
# File 'app/serializers/post_serializer.rb', line 343
def include_draft_sequence?
@draft_sequence.present?
end
|
#include_excerpt? ⇒ Boolean
117
118
119
|
# File 'app/serializers/post_serializer.rb', line 117
def include_excerpt?
@add_excerpt
end
|
#include_group_moderator? ⇒ 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
519
520
521
|
# File 'app/serializers/post_serializer.rb', line 519
def include_hidden_reason_id?
object.hidden
end
|
#include_is_auto_generated? ⇒ 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
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
|
#include_link_counts? ⇒ 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
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
592
593
594
|
# File 'app/serializers/post_serializer.rb', line 592
def include_mentioned_users?
SiteSetting.enable_user_status
end
|
#include_notice? ⇒ 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
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
362
363
364
|
# File 'app/serializers/post_serializer.rb', line 362
def include_read?
@topic_view.present?
end
|
#include_reply_to_user? ⇒ 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
533
534
535
|
# File 'app/serializers/post_serializer.rb', line 533
def include_reviewable_id?
can_review_topic?
end
|
#include_reviewable_score_count? ⇒ 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
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
347
348
349
|
# File 'app/serializers/post_serializer.rb', line 347
def include_slug_title?
@topic_slug.present?
end
|
#include_static_doc? ⇒ 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
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
109
110
111
|
# File 'app/serializers/post_serializer.rb', line 109
def include_topic_html_title?
@add_title
end
|
#include_topic_title? ⇒ Boolean
105
106
107
|
# File 'app/serializers/post_serializer.rb', line 105
def include_topic_title?
@add_title
end
|
#include_user_custom_fields? ⇒ 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
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
567
568
569
|
# File 'app/serializers/post_serializer.rb', line 567
def include_user_suspended?
object.user&.suspended?
end
|
#include_via_email? ⇒ Boolean
438
439
440
|
# File 'app/serializers/post_serializer.rb', line 438
def include_via_email?
object.via_email?
end
|
#is_auto_generated ⇒ Object
442
443
444
|
# File 'app/serializers/post_serializer.rb', line 442
def is_auto_generated
object.incoming_email&.is_auto_generated
end
|
#last_wiki_edit ⇒ Object
511
512
513
|
# File 'app/serializers/post_serializer.rb', line 511
def last_wiki_edit
object.revisions.last.updated_at
end
|
#link_counts ⇒ Object
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?
@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
|
#locked ⇒ Object
502
503
504
|
# File 'app/serializers/post_serializer.rb', line 502
def locked
true
end
|
#mentioned_users ⇒ Object
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
133
134
135
|
# File 'app/serializers/post_serializer.rb', line 133
def moderator?
!!(object&.user&.moderator?)
end
|
#notice ⇒ Object
481
482
483
|
# File 'app/serializers/post_serializer.rb', line 481
def notice
post_custom_fields[Post::NOTICE]
end
|
#post_bookmark ⇒ Object
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_name ⇒ Object
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
|
#read ⇒ Object
241
242
243
|
# File 'app/serializers/post_serializer.rb', line 241
def read
@topic_view.read?(object.post_number)
end
|
#reply_to_user ⇒ Object
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_id ⇒ Object
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_count ⇒ Object
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_count ⇒ Object
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
|
#score ⇒ Object
245
246
247
|
# File 'app/serializers/post_serializer.rb', line 245
def score
object.score || 0
end
|
#staff? ⇒ Boolean
141
142
143
|
# File 'app/serializers/post_serializer.rb', line 141
def staff?
!!(object&.user&.staff?)
end
|
#static_doc ⇒ Object
430
431
432
|
# File 'app/serializers/post_serializer.rb', line 430
def static_doc
true
end
|
#title_is_group ⇒ Object
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_title ⇒ Object
125
126
127
|
# File 'app/serializers/post_serializer.rb', line 125
def topic_html_title
topic&.fancy_title
end
|
#topic_slug ⇒ Object
101
102
103
|
# File 'app/serializers/post_serializer.rb', line 101
def topic_slug
topic&.slug
end
|
#topic_title ⇒ Object
121
122
123
|
# File 'app/serializers/post_serializer.rb', line 121
def topic_title
topic&.title
end
|
#trust_level ⇒ Object
261
262
263
|
# File 'app/serializers/post_serializer.rb', line 261
def trust_level
object&.user&.trust_level
end
|
#user_custom_fields ⇒ Object
422
423
424
|
# File 'app/serializers/post_serializer.rb', line 422
def user_custom_fields
user_custom_fields_object[object.user_id]
end
|
#user_status ⇒ Object
575
576
577
|
# File 'app/serializers/post_serializer.rb', line 575
def user_status
UserStatusSerializer.new(object.user&.user_status, root: false)
end
|
#user_suspended ⇒ Object
563
564
565
|
# File 'app/serializers/post_serializer.rb', line 563
def user_suspended
true
end
|
#user_title ⇒ Object
249
250
251
|
# File 'app/serializers/post_serializer.rb', line 249
def user_title
object&.user&.title
end
|
#version ⇒ Object
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
|
#yours ⇒ Object
160
161
162
|
# File 'app/serializers/post_serializer.rb', line 160
def yours
scope.user == object.user
end
|