Class: PostSerializer
Constant Summary
collapse
- INSTANCE_VARS =
To pass in additional information we might need
%i[
parent_post
add_raw
add_title
single_post_link_counts
draft_sequence
post_actions
all_post_actions
add_excerpt
]
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.
94
95
96
97
98
99
100
|
# File 'app/serializers/post_serializer.rb', line 94
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
477
478
479
480
|
# File 'app/serializers/post_serializer.rb', line 477
def action_code
return "open_topic" if object.action_code == "public_topic" && SiteSetting.login_required?
object.action_code
end
|
#action_code_path ⇒ Object
494
495
496
|
# File 'app/serializers/post_serializer.rb', line 494
def action_code_path
post_custom_fields["action_code_path"]
end
|
#action_code_who ⇒ Object
486
487
488
|
# File 'app/serializers/post_serializer.rb', line 486
def action_code_who
post_custom_fields["action_code_who"]
end
|
#actions ⇒ Object
Helper function to decide between #post_actions and @all_post_actions
295
296
297
298
299
|
# File 'app/serializers/post_serializer.rb', line 295
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
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
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
|
# File 'app/serializers/post_serializer.rb', line 302
def actions_summary
result = []
can_see_post = scope.can_see_post?(object)
@post_action_type_view =
@topic_view ? @topic_view.post_action_type_view : PostActionTypeView.new
public_flag_types = @post_action_type_view.public_types
@post_action_type_view.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,
notify_flag_types: @post_action_type_view.notify_flag_types,
additional_message_types: @post_action_type_view.additional_message_types,
post_action_type_view: @post_action_type_view,
},
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? || public_flag_types.values.include?(id)
summary[:count] = summary[:acted] ? 1 : 0
end
summary.delete(:count) if summary[:count].to_i.zero?
result << summary if summary[:can_act] || summary[:count]
end
result
end
|
#admin? ⇒ Boolean
138
139
140
|
# File 'app/serializers/post_serializer.rb', line 138
def admin?
!!(object&.user&.admin?)
end
|
#badges_granted ⇒ Object
227
228
229
230
231
232
233
234
235
236
237
|
# File 'app/serializers/post_serializer.rb', line 227
def badges_granted
return [] unless SiteSetting.enable_badges && SiteSetting.
if @topic_view
user_badges = @topic_view.post_user_badges[object.id] || []
else
user_badges = UserBadge.([object])
end
user_badges.map { |user_badge| BasicUserBadgeSerializer.new(user_badge, scope: scope).as_json }
end
|
#bookmark_auto_delete_preference ⇒ Object
427
428
429
|
# File 'app/serializers/post_serializer.rb', line 427
def bookmark_auto_delete_preference
post_bookmark&.auto_delete_preference
end
|
#bookmark_id ⇒ Object
431
432
433
|
# File 'app/serializers/post_serializer.rb', line 431
def bookmark_id
post_bookmark&.id
end
|
#bookmark_name ⇒ Object
423
424
425
|
# File 'app/serializers/post_serializer.rb', line 423
def bookmark_name
post_bookmark&.name
end
|
#bookmark_reminder_at ⇒ Object
419
420
421
|
# File 'app/serializers/post_serializer.rb', line 419
def bookmark_reminder_at
post_bookmark&.reminder_at
end
|
#bookmarked ⇒ Object
391
392
393
|
# File 'app/serializers/post_serializer.rb', line 391
def bookmarked
@bookmarked ||= post_bookmark.present?
end
|
#can_delete ⇒ Object
169
170
171
|
# File 'app/serializers/post_serializer.rb', line 169
def can_delete
scope.can_delete?(object)
end
|
#can_edit ⇒ Object
165
166
167
|
# File 'app/serializers/post_serializer.rb', line 165
def can_edit
scope.can_edit?(object)
end
|
#can_permanently_delete ⇒ Object
173
174
175
|
# File 'app/serializers/post_serializer.rb', line 173
def can_permanently_delete
true
end
|
#can_recover ⇒ Object
181
182
183
|
# File 'app/serializers/post_serializer.rb', line 181
def can_recover
scope.can_recover_post?(object)
end
|
#can_see_hidden_post ⇒ Object
185
186
187
|
# File 'app/serializers/post_serializer.rb', line 185
def can_see_hidden_post
scope.can_see_hidden_post?(object)
end
|
#can_view_edit_history ⇒ Object
439
440
441
|
# File 'app/serializers/post_serializer.rb', line 439
def can_view_edit_history
scope.can_view_edit_history?(object)
end
|
#can_wiki ⇒ Object
189
190
191
|
# File 'app/serializers/post_serializer.rb', line 189
def can_wiki
scope.can_wiki?(object)
end
|
#category_id ⇒ Object
130
131
132
|
# File 'app/serializers/post_serializer.rb', line 130
def category_id
topic&.category_id
end
|
#deleted_by ⇒ Object
286
287
288
|
# File 'app/serializers/post_serializer.rb', line 286
def deleted_by
BasicUserSerializer.new(object.deleted_by, root: false).as_json
end
|
#display_username ⇒ Object
193
194
195
|
# File 'app/serializers/post_serializer.rb', line 193
def display_username
object.user&.name
end
|
#flair_bg_color ⇒ Object
215
216
217
|
# File 'app/serializers/post_serializer.rb', line 215
def flair_bg_color
object.user&.flair_group&.flair_bg_color
end
|
#flair_color ⇒ Object
219
220
221
|
# File 'app/serializers/post_serializer.rb', line 219
def flair_color
object.user&.flair_group&.flair_color
end
|
#flair_group_id ⇒ Object
223
224
225
|
# File 'app/serializers/post_serializer.rb', line 223
def flair_group_id
object.user&.flair_group_id
end
|
#flair_name ⇒ Object
207
208
209
|
# File 'app/serializers/post_serializer.rb', line 207
def flair_name
object.user&.flair_group&.name
end
|
#flair_url ⇒ Object
211
212
213
|
# File 'app/serializers/post_serializer.rb', line 211
def flair_url
object.user&.flair_group&.flair_url
end
|
#group_moderator ⇒ Object
146
147
148
|
# File 'app/serializers/post_serializer.rb', line 146
def group_moderator
!!@group_moderator
end
|
#include_action_code? ⇒ Boolean
482
483
484
|
# File 'app/serializers/post_serializer.rb', line 482
def include_action_code?
object.action_code.present?
end
|
#include_action_code_path? ⇒ Boolean
498
499
500
|
# File 'app/serializers/post_serializer.rb', line 498
def include_action_code_path?
include_action_code? && action_code_path.present?
end
|
#include_action_code_who? ⇒ Boolean
490
491
492
|
# File 'app/serializers/post_serializer.rb', line 490
def include_action_code_who?
include_action_code? && action_code_who.present?
end
|
#include_bookmark_auto_delete_preference? ⇒ Boolean
403
404
405
|
# File 'app/serializers/post_serializer.rb', line 403
def include_bookmark_auto_delete_preference?
bookmarked
end
|
#include_bookmark_id? ⇒ Boolean
407
408
409
|
# File 'app/serializers/post_serializer.rb', line 407
def include_bookmark_id?
bookmarked
end
|
#include_bookmark_name? ⇒ Boolean
399
400
401
|
# File 'app/serializers/post_serializer.rb', line 399
def include_bookmark_name?
bookmarked
end
|
#include_bookmark_reminder_at? ⇒ Boolean
395
396
397
|
# File 'app/serializers/post_serializer.rb', line 395
def include_bookmark_reminder_at?
bookmarked
end
|
#include_can_permanently_delete? ⇒ Boolean
177
178
179
|
# File 'app/serializers/post_serializer.rb', line 177
def include_can_permanently_delete?
SiteSetting.can_permanently_delete && scope.is_admin? && object.deleted_at
end
|
#include_category_id? ⇒ Boolean
114
115
116
|
# File 'app/serializers/post_serializer.rb', line 114
def include_category_id?
@add_title
end
|
#include_deleted_by? ⇒ Boolean
290
291
292
|
# File 'app/serializers/post_serializer.rb', line 290
def include_deleted_by?
scope.is_staff? && object.deleted_by.present?
end
|
#include_display_username? ⇒ Boolean
435
436
437
|
# File 'app/serializers/post_serializer.rb', line 435
def include_display_username?
SiteSetting.enable_names?
end
|
#include_draft_sequence? ⇒ Boolean
364
365
366
|
# File 'app/serializers/post_serializer.rb', line 364
def include_draft_sequence?
@draft_sequence.present?
end
|
#include_excerpt? ⇒ Boolean
118
119
120
|
# File 'app/serializers/post_serializer.rb', line 118
def include_excerpt?
@add_excerpt
end
|
#include_group_moderator? ⇒ Boolean
150
151
152
153
154
155
156
157
158
159
|
# File 'app/serializers/post_serializer.rb', line 150
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
540
541
542
|
# File 'app/serializers/post_serializer.rb', line 540
def include_hidden_reason_id?
object.hidden
end
|
#include_is_auto_generated? ⇒ Boolean
467
468
469
|
# File 'app/serializers/post_serializer.rb', line 467
def include_is_auto_generated?
object.via_email? && is_auto_generated
end
|
#include_last_wiki_edit? ⇒ Boolean
536
537
538
|
# File 'app/serializers/post_serializer.rb', line 536
def include_last_wiki_edit?
object.wiki && object.post_number == 1 && object.revisions.size > 0
end
|
#include_link_counts? ⇒ Boolean
376
377
378
379
380
381
|
# File 'app/serializers/post_serializer.rb', line 376
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
528
529
530
|
# File 'app/serializers/post_serializer.rb', line 528
def include_locked?
object.locked? && (yours || scope.is_staff?)
end
|
#include_mentioned_users? ⇒ Boolean
613
614
615
|
# File 'app/serializers/post_serializer.rb', line 613
def include_mentioned_users?
SiteSetting.enable_user_status
end
|
#include_notice? ⇒ Boolean
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
|
# File 'app/serializers/post_serializer.rb', line 506
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
372
373
374
|
# File 'app/serializers/post_serializer.rb', line 372
def include_raw?
@add_raw.present? && (!object.hidden || scope.user&.staff? || yours)
end
|
#include_read? ⇒ Boolean
383
384
385
|
# File 'app/serializers/post_serializer.rb', line 383
def include_read?
@topic_view.present?
end
|
#include_reply_to_user? ⇒ Boolean
387
388
389
|
# File 'app/serializers/post_serializer.rb', line 387
def include_reply_to_user?
!(SiteSetting.suppress_reply_when_quoting && object.reply_quoted?) && object.reply_to_user
end
|
#include_reviewable_id? ⇒ Boolean
554
555
556
|
# File 'app/serializers/post_serializer.rb', line 554
def include_reviewable_id?
can_review_topic?
end
|
#include_reviewable_score_count? ⇒ Boolean
567
568
569
|
# File 'app/serializers/post_serializer.rb', line 567
def include_reviewable_score_count?
can_review_topic?
end
|
#include_reviewable_score_pending_count? ⇒ Boolean
580
581
582
|
# File 'app/serializers/post_serializer.rb', line 580
def include_reviewable_score_pending_count?
can_review_topic?
end
|
#include_slug_title? ⇒ Boolean
368
369
370
|
# File 'app/serializers/post_serializer.rb', line 368
def include_slug_title?
@topic_slug.present?
end
|
#include_static_doc? ⇒ Boolean
455
456
457
|
# File 'app/serializers/post_serializer.rb', line 455
def include_static_doc?
object.is_first_post? && Discourse.static_doc_topic_ids.include?(object.topic_id)
end
|
#include_title_is_group? ⇒ Boolean
270
271
272
|
# File 'app/serializers/post_serializer.rb', line 270
def include_title_is_group?
object&.user&.title.present?
end
|
#include_topic_html_title? ⇒ Boolean
110
111
112
|
# File 'app/serializers/post_serializer.rb', line 110
def include_topic_html_title?
@add_title
end
|
#include_topic_title? ⇒ Boolean
106
107
108
|
# File 'app/serializers/post_serializer.rb', line 106
def include_topic_title?
@add_title
end
|
#include_user_custom_fields? ⇒ Boolean
447
448
449
|
# File 'app/serializers/post_serializer.rb', line 447
def include_user_custom_fields?
user_custom_fields_object[object.user_id]
end
|
#include_user_status? ⇒ Boolean
592
593
594
|
# File 'app/serializers/post_serializer.rb', line 592
def include_user_status?
SiteSetting.enable_user_status && object.user&.has_status?
end
|
#include_user_suspended? ⇒ Boolean
588
589
590
|
# File 'app/serializers/post_serializer.rb', line 588
def include_user_suspended?
object.user&.suspended?
end
|
#include_via_email? ⇒ Boolean
459
460
461
|
# File 'app/serializers/post_serializer.rb', line 459
def include_via_email?
object.via_email?
end
|
#is_auto_generated ⇒ Object
463
464
465
|
# File 'app/serializers/post_serializer.rb', line 463
def is_auto_generated
object.incoming_email&.is_auto_generated
end
|
#last_wiki_edit ⇒ Object
532
533
534
|
# File 'app/serializers/post_serializer.rb', line 532
def last_wiki_edit
object.revisions.last.updated_at
end
|
#link_counts ⇒ Object
239
240
241
242
243
244
245
246
247
248
249
250
251
252
|
# File 'app/serializers/post_serializer.rb', line 239
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
523
524
525
|
# File 'app/serializers/post_serializer.rb', line 523
def locked
true
end
|
#mentioned_users ⇒ Object
600
601
602
603
604
605
606
607
608
609
610
611
|
# File 'app/serializers/post_serializer.rb', line 600
def mentioned_users
users =
if @topic_view && (mentioned_users = @topic_view.mentioned_users[object.id])
mentioned_users
else
query = User.includes(:user_option)
query = query.includes(:user_status) if SiteSetting.enable_user_status
query = query.where(username_lower: object.mentions)
end
users.map { |user| BasicUserSerializer.new(user, root: false, include_status: true).as_json }
end
|
#moderator? ⇒ Boolean
134
135
136
|
# File 'app/serializers/post_serializer.rb', line 134
def moderator?
!!(object&.user&.moderator?)
end
|
#notice ⇒ Object
502
503
504
|
# File 'app/serializers/post_serializer.rb', line 502
def notice
post_custom_fields[Post::NOTICE]
end
|
#post_bookmark ⇒ Object
411
412
413
414
415
416
417
|
# File 'app/serializers/post_serializer.rb', line 411
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
197
198
199
200
201
202
203
204
205
|
# File 'app/serializers/post_serializer.rb', line 197
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
254
255
256
|
# File 'app/serializers/post_serializer.rb', line 254
def read
@topic_view.read?(object.post_number)
end
|
#reply_to_user ⇒ Object
278
279
280
281
282
283
284
|
# File 'app/serializers/post_serializer.rb', line 278
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
545
546
547
548
549
550
551
552
|
# File 'app/serializers/post_serializer.rb', line 545
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
558
559
560
561
562
563
564
565
|
# File 'app/serializers/post_serializer.rb', line 558
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
571
572
573
574
575
576
577
578
|
# File 'app/serializers/post_serializer.rb', line 571
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
258
259
260
|
# File 'app/serializers/post_serializer.rb', line 258
def score
object.score || 0
end
|
#staff? ⇒ Boolean
142
143
144
|
# File 'app/serializers/post_serializer.rb', line 142
def staff?
!!(object&.user&.staff?)
end
|
#static_doc ⇒ Object
451
452
453
|
# File 'app/serializers/post_serializer.rb', line 451
def static_doc
true
end
|
#title_is_group ⇒ Object
266
267
268
|
# File 'app/serializers/post_serializer.rb', line 266
def title_is_group
object&.user&.title == object.user&.primary_group&.title
end
|
#topic_html_title ⇒ Object
126
127
128
|
# File 'app/serializers/post_serializer.rb', line 126
def topic_html_title
topic&.fancy_title
end
|
#topic_slug ⇒ Object
102
103
104
|
# File 'app/serializers/post_serializer.rb', line 102
def topic_slug
topic&.slug
end
|
#topic_title ⇒ Object
122
123
124
|
# File 'app/serializers/post_serializer.rb', line 122
def topic_title
topic&.title
end
|
#trust_level ⇒ Object
274
275
276
|
# File 'app/serializers/post_serializer.rb', line 274
def trust_level
object&.user&.trust_level
end
|
#user_custom_fields ⇒ Object
443
444
445
|
# File 'app/serializers/post_serializer.rb', line 443
def user_custom_fields
user_custom_fields_object[object.user_id]
end
|
#user_status ⇒ Object
596
597
598
|
# File 'app/serializers/post_serializer.rb', line 596
def user_status
UserStatusSerializer.new(object.user&.user_status, root: false)
end
|
#user_suspended ⇒ Object
584
585
586
|
# File 'app/serializers/post_serializer.rb', line 584
def user_suspended
true
end
|
#user_title ⇒ Object
262
263
264
|
# File 'app/serializers/post_serializer.rb', line 262
def user_title
object&.user&.title
end
|
#version ⇒ Object
471
472
473
474
475
|
# File 'app/serializers/post_serializer.rb', line 471
def version
return 1 if object.hidden && !scope.can_view_hidden_post_revisions?
scope.is_staff? ? object.version : object.public_version
end
|
#yours ⇒ Object
161
162
163
|
# File 'app/serializers/post_serializer.rb', line 161
def yours
scope.user == object.user
end
|