From b58867b6e936a5247304e9f06f827cf5012a92ed Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 3 Jan 2019 12:03:01 -0500 Subject: [PATCH] FEATURE: New 'Reviewable' model to make reviewable items generic Includes support for flags, reviewable users and queued posts, with REST API backwards compatibility. Co-Authored-By: romanrizzi Co-Authored-By: jjaffeux --- .../admin/adapters/flagged-post.js.es6 | 38 -- .../components/flagged-post-response.js.es6 | 3 - .../components/flagged-post-title.js.es6 | 3 - .../admin/components/flagged-post.js.es6 | 58 -- .../components/penalty-post-action.js.es6 | 1 + .../components/user-flag-percentage.js.es6 | 2 +- .../admin/controllers/admin-user-index.js.es6 | 4 - .../controllers/admin-users-list-show.js.es6 | 52 +- .../modals/admin-flags-received.js.es6 | 17 - .../modals/admin-moderation-history.js.es6 | 21 - .../modals/admin-silence-user.js.es6 | 2 +- .../modals/admin-suspend-user.js.es6 | 2 +- .../admin/mixins/penalty-controller.js.es6 | 4 +- .../admin/models/admin-user.js.es6 | 30 - .../admin/models/flagged-post.js.es6 | 166 ------ .../admin/routes/admin-flags-index.js.es6 | 8 - .../routes/admin-flags-topics-show.js.es6 | 20 - .../admin/routes/admin-route-map.js.es6 | 12 - .../admin/services/admin-tools.js.es6 | 16 +- .../javascripts/admin/templates/admin.hbs | 1 - .../templates/components/flag-user-lists.hbs | 5 +- .../components/flagged-post-response.hbs | 7 - .../components/flagged-post-title.hbs | 8 - .../templates/components/flagged-post.hbs | 116 ---- .../templates/components/flagged-posts.hbs | 17 - .../components/flagged-topic-users.hbs | 5 - .../components/moderation-history-item.hbs | 17 - .../admin/templates/flags-posts-active.hbs | 1 - .../admin/templates/flags-posts-old.hbs | 1 - .../admin/templates/flags-topics-index.hbs | 54 -- .../admin/templates/flags-topics-show.hbs | 19 - .../javascripts/admin/templates/flags.hbs | 15 - .../templates/modal/admin-flags-received.hbs | 14 - .../modal/admin-moderation-history.hbs | 23 - .../templates/modal/admin-silence-user.hbs | 4 +- .../templates/modal/admin-suspend-user.hbs | 4 +- .../admin/templates/user-index.hbs | 11 +- .../admin/templates/users-list-show.hbs | 30 +- .../admin/templates/users-list.hbs | 3 - .../discourse/adapters/rest.js.es6 | 3 +- .../adapters/reviewable-topic.js.es6 | 7 + .../discourse/adapters/reviewable.js.es6 | 9 + .../discourse/components/flagged-posts.js.es6 | 18 - .../discourse/components/queued-post.js.es6 | 114 ---- .../reviewable-bundled-action.js.es6 | 18 + .../components/reviewable-histories.js.es6 | 3 + .../components/reviewable-item.js.es6 | 153 +++++ .../components/scrolling-post-stream.js.es6 | 9 - .../discourse/components/site-header.js.es6 | 3 +- .../components/topic-admin-menu-button.js.es6 | 9 - .../components/topic-timeline.js.es6 | 7 - .../discourse/components/user-stream.js.es6 | 8 +- .../discourse/controllers/header.js.es6 | 9 - .../controllers/post-enqueued.js.es6 | 8 - .../discourse/controllers/review-index.js.es6 | 98 ++++ .../discourse/helpers/dasherize.js.es6 | 5 + .../discourse/helpers/editable-value.js.es6 | 17 + .../discourse/helpers/format-score.js.es6 | 5 + .../reviewable-history-description.js.es6 | 12 + .../helpers/reviewable-status.js.es6 | 31 + .../subscribe-user-notifications.js.es6 | 18 +- .../discourse/models/result-set.js.es6 | 1 + .../models/reviewable-history.js.es6 | 9 + .../discourse/models/reviewable.js.es6 | 50 ++ .../javascripts/discourse/models/store.js.es6 | 5 +- .../discourse/routes/app-route-map.js.es6 | 8 +- .../discourse/routes/application.js.es6 | 8 +- .../discourse/routes/queued-posts.js.es6 | 17 - .../discourse/routes/review-index.js.es6 | 31 + .../discourse/routes/review-show.js.es6 | 5 + .../discourse/routes/review-topics.js.es6 | 9 + .../discourse/routes/review.js.es6 | 5 + .../routes/user-flagged-posts.js.es6 | 3 - .../templates/components/d-editor.hbs | 9 +- .../templates/components/queued-post.hbs | 96 ---- .../components/reviewable-bundled-action.hbs | 17 + .../reviewable-conversation-post.hbs | 5 + .../components/reviewable-field-category.hbs | 1 + .../components/reviewable-field-editor.hbs | 1 + .../components/reviewable-field-tags.hbs | 1 + .../components/reviewable-field-text.hbs | 1 + .../components/reviewable-field-textarea.hbs | 1 + .../components/reviewable-flagged-post.hbs | 23 + .../components/reviewable-histories.hbs | 23 + .../templates/components/reviewable-item.hbs | 79 +++ .../components/reviewable-queued-post.hbs | 37 ++ .../components/reviewable-scores.hbs | 41 ++ .../components/reviewable-topic-link.hbs | 10 + .../templates/components/reviewable-user.hbs | 8 + .../templates/modal/post-enqueued.hbs | 6 +- .../discourse/templates/queued-posts.hbs | 11 - .../discourse/templates/review-index.hbs | 83 +++ .../discourse/templates/review-show.hbs | 1 + .../discourse/templates/review-topics.hbs | 45 ++ .../discourse/templates/review.hbs | 1 + .../javascripts/discourse/templates/topic.hbs | 13 +- .../javascripts/discourse/templates/user.hbs | 4 +- .../discourse/widgets/button.js.es6 | 5 + .../discourse/widgets/hamburger-menu.js.es6 | 28 +- .../discourse/widgets/post-admin-menu.js.es6 | 9 +- .../discourse/widgets/topic-admin-menu.js.es6 | 7 +- app/assets/javascripts/polyfills.js | 1 + .../admin-agree-flag-dropdown.js.es6 | 131 ----- .../admin-delete-flag-dropdown.js.es6 | 84 --- .../components/category-chooser.js.es6 | 6 + .../components/mini-tag-chooser.js.es6 | 9 + .../select-kit/components/select-kit.js.es6 | 3 + app/assets/stylesheets/common.scss | 2 - .../stylesheets/common/admin/admin_base.scss | 10 - .../stylesheets/common/admin/flagging.scss | 20 +- .../common/admin/moderation_history.scss | 30 - .../stylesheets/common/base/header.scss | 2 +- .../stylesheets/common/base/reviewables.scss | 266 +++++++++ app/assets/stylesheets/common/base/topic.scss | 6 +- .../stylesheets/common/printer-friendly.scss | 1 - .../select-kit/admin-agree-flag-dropdown.scss | 14 - .../admin-delete-flag-dropdown.scss | 16 - app/assets/stylesheets/desktop.scss | 1 - .../stylesheets/desktop/queued-posts.scss | 53 -- app/assets/stylesheets/mobile.scss | 1 + .../stylesheets/mobile/reviewables.scss | 76 +++ app/controllers/admin/flags_controller.rb | 127 ++--- .../admin/moderation_history_controller.rb | 41 -- app/controllers/admin/users_controller.rb | 12 +- app/controllers/application_controller.rb | 13 +- app/controllers/post_actions_controller.rb | 58 +- app/controllers/posts_controller.rb | 7 +- app/controllers/queued_posts_controller.rb | 41 +- app/controllers/reviewables_controller.rb | 168 ++++++ app/controllers/topics_controller.rb | 8 +- app/controllers/user_actions_controller.rb | 10 +- app/controllers/users_controller.rb | 5 +- app/jobs/base.rb | 1 - app/jobs/regular/notify_reviewable.rb | 52 ++ app/jobs/regular/process_post.rb | 2 +- app/jobs/regular/toggle_topic_closed.rb | 2 +- app/jobs/regular/topic_action_converter.rb | 18 + app/jobs/regular/truncate_user_flag_stats.rb | 48 ++ app/jobs/scheduled/auto_queue_handler.rb | 23 +- app/jobs/scheduled/clean_up_uploads.rb | 2 +- app/jobs/scheduled/pending_flags_reminder.rb | 55 +- .../pending_queued_posts_reminder.rb | 4 +- app/models/ignored_user.rb | 8 +- app/models/invite.rb | 4 +- app/models/invite_redeemer.rb | 13 +- app/models/post.rb | 55 +- app/models/post_action.rb | 498 +--------------- app/models/post_action_type.rb | 21 +- app/models/queued_post.rb | 158 ------ app/models/report.rb | 50 +- app/models/reviewable.rb | 471 ++++++++++++++++ app/models/reviewable_flagged_post.rb | 274 +++++++++ app/models/reviewable_history.rb | 32 ++ app/models/reviewable_queued_post.rb | 133 +++++ app/models/reviewable_score.rb | 94 +++ app/models/reviewable_user.rb | 84 +++ app/models/topic.rb | 40 +- app/models/topic_converter.rb | 16 +- app/models/user.rb | 65 ++- app/models/user_action.rb | 58 +- app/models/web_hook.rb | 4 + app/models/web_hook_event_type.rb | 1 + app/serializers/current_user_serializer.rb | 28 +- app/serializers/post_serializer.rb | 2 +- app/serializers/queued_post_serializer.rb | 74 ++- .../reviewable_action_serializer.rb | 28 + .../reviewable_bundled_action_serializer.rb | 8 + ...reviewable_conversation_post_serializer.rb | 4 + .../reviewable_conversation_serializer.rb | 4 + .../reviewable_editable_field_serializer.rb | 3 + .../reviewable_flagged_post_serializer.rb | 3 + .../reviewable_history_serializer.rb | 6 + .../reviewable_perform_result_serializer.rb | 40 ++ .../reviewable_queued_post_serializer.rb | 19 + .../reviewable_score_serializer.rb | 18 + .../reviewable_score_type_serializer.rb | 10 + app/serializers/reviewable_serializer.rb | 97 ++++ .../reviewable_topic_serializer.rb | 19 + app/serializers/reviewable_user_serializer.rb | 9 + app/serializers/topic_view_serializer.rb | 118 ++-- app/serializers/web_hook_flag_serializer.rb | 14 +- app/services/post_alerter.rb | 4 +- app/services/post_owner_changer.rb | 4 +- app/services/spam_rule/auto_silence.rb | 52 +- app/services/spam_rule/flag_sockpuppets.rb | 5 +- app/services/staff_action_logger.rb | 18 +- app/services/user_action_creator.rb | 153 ----- app/services/user_action_manager.rb | 130 +++++ app/services/user_destroyer.rb | 7 +- app/services/user_merger.rb | 5 +- config/initializers/012-web_hook_events.rb | 26 +- config/locales/client.bs_BA.yml | 1 - config/locales/client.en.yml | 188 +++--- config/locales/server.ar.yml | 1 - config/locales/server.ca.yml | 1 - config/locales/server.da.yml | 1 - config/locales/server.de.yml | 2 - config/locales/server.el.yml | 1 - config/locales/server.en.yml | 70 ++- config/locales/server.es.yml | 2 - config/locales/server.fa_IR.yml | 1 - config/locales/server.fi.yml | 2 - config/locales/server.fr.yml | 2 - config/locales/server.he.yml | 1 - config/locales/server.it.yml | 1 - config/locales/server.ko.yml | 1 - config/locales/server.nl.yml | 1 - config/locales/server.pl_PL.yml | 1 - config/locales/server.pt.yml | 1 - config/locales/server.pt_BR.yml | 2 - config/locales/server.ro.yml | 1 - config/locales/server.ru.yml | 3 +- config/locales/server.sv.yml | 1 - config/locales/server.tr_TR.yml | 1 - config/locales/server.ur.yml | 1 - config/locales/server.vi.yml | 1 - config/locales/server.zh_CN.yml | 2 - config/locales/server.zh_TW.yml | 1 - config/routes.rb | 12 +- config/site_settings.yml | 12 +- db/fixtures/007_web_hook_event_types.rb | 5 + .../20190103160533_create_reviewables.rb | 41 ++ .../20190103185626_create_reviewable_users.rb | 56 ++ ...90110212005_create_reviewable_histories.rb | 14 + ...1170824_migrate_reviewable_queued_posts.rb | 104 ++++ ...190121202656_remove_user_action_pending.rb | 8 + ...20190130163000_create_reviewable_scores.rb | 19 + ...163001_migrate_reviewable_flagged_posts.rb | 117 ++++ ...33_add_score_bonus_to_post_action_types.rb | 5 + ...06184409_add_reviewable_score_to_topics.rb | 22 + ...190313171338_add_indexes_to_reviewables.rb | 11 + ...70411_add_index_to_reviewable_histories.rb | 5 + .../20190315174428_migrate_flag_history.rb | 131 +++++ ...0190327205525_require_reviewable_scores.rb | 43 ++ ...3_drop_queued_post_id_from_user_actions.rb | 9 + .../20190123171817_drop_queued_posts.rb | 5 + lib/discourse.rb | 6 +- lib/email/receiver.rb | 8 +- lib/flag_query.rb | 218 +++---- lib/flag_settings.rb | 11 +- lib/guardian/post_guardian.rb | 7 +- lib/has_errors.rb | 13 +- lib/new_post_manager.rb | 46 +- lib/new_post_result.rb | 19 +- lib/plugin/instance.rb | 9 + lib/post_action_creator.rb | 295 +++++++++- lib/post_action_destroyer.rb | 63 +++ lib/post_action_result.rb | 19 + lib/post_creator.rb | 1 + lib/post_destroyer.rb | 42 +- lib/post_enqueuer.rb | 45 -- lib/post_revisor.rb | 8 +- lib/reviewable/actions.rb | 57 ++ lib/reviewable/collection.rb | 39 ++ lib/reviewable/conversation.rb | 30 + lib/reviewable/editable_fields.rb | 18 + lib/reviewable/perform_result.rb | 24 + lib/tasks/user_actions.rake | 39 +- lib/topic_creator.rb | 1 + lib/topic_view.rb | 10 +- .../advanced_user_narrative.rb | 8 +- .../new_user_narrative.rb | 2 +- .../discourse_narrative_bot/track_selector.rb | 2 +- .../new_user_narrative_spec.rb | 4 +- .../track_selector_spec.rb | 2 +- plugins/poll/plugin.rb | 2 +- .../poll/spec/lib/new_post_manager_spec.rb | 10 +- script/import_scripts/base.rb | 9 +- script/import_scripts/discuz_x.rb | 2 +- script/import_scripts/jive_api.rb | 6 +- script/import_scripts/nodebb/nodebb.rb | 6 +- script/import_scripts/question2answer.rb | 2 +- script/import_scripts/stack_overflow.rb | 6 +- spec/components/filter_best_posts_spec.rb | 4 +- spec/components/flag_query_spec.rb | 93 ++- spec/components/guardian_spec.rb | 21 +- spec/components/new_post_manager_spec.rb | 31 +- spec/components/plugin/instance_spec.rb | 10 + spec/components/post_action_creator_spec.rb | 98 +++- spec/components/post_creator_spec.rb | 4 +- spec/components/post_destroyer_spec.rb | 47 +- spec/components/post_enqueuer_spec.rb | 48 -- spec/components/topic_query_spec.rb | 4 +- spec/components/topic_view_spec.rb | 18 +- spec/fabricators/queued_post_fabricator.rb | 26 - spec/fabricators/reviewable_fabricator.rb | 58 ++ spec/fabricators/web_hook_fabricator.rb | 8 + spec/integration/flags_spec.rb | 2 +- spec/integration/spam_rules_spec.rb | 45 +- spec/integration/watched_words_spec.rb | 1 - spec/jobs/auto_queue_handler_spec.rb | 34 +- spec/jobs/clean_up_uploads_spec.rb | 9 +- ...grant_new_user_of_the_month_badges_spec.rb | 62 +- spec/jobs/notify_reviewable_spec.rb | 88 +++ spec/jobs/pending_flags_reminder_spec.rb | 78 +-- .../pending_queued_posts_reminder_spec.rb | 49 +- spec/jobs/truncate_user_flag_stats_spec.rb | 74 +++ spec/models/directory_item_spec.rb | 4 +- spec/models/notification_spec.rb | 2 +- spec/models/post_action_spec.rb | 533 ++++++------------ spec/models/post_mover_spec.rb | 10 +- spec/models/post_spec.rb | 48 +- spec/models/post_timing_spec.rb | 2 +- spec/models/queued_post_spec.rb | 205 ------- spec/models/report_spec.rb | 67 +-- spec/models/reviewable_flagged_post_spec.rb | 199 +++++++ spec/models/reviewable_history_spec.rb | 52 ++ spec/models/reviewable_queued_post_spec.rb | 170 ++++++ spec/models/reviewable_score_spec.rb | 143 +++++ spec/models/reviewable_spec.rb | 260 +++++++++ spec/models/reviewable_user_spec.rb | 123 ++++ spec/models/topic_converter_spec.rb | 22 +- spec/models/topic_spec.rb | 7 +- spec/models/trust_level3_requirements_spec.rb | 23 +- spec/models/user_action_spec.rb | 25 +- spec/models/user_spec.rb | 87 +-- spec/models/user_summary_spec.rb | 4 +- spec/models/web_hook_spec.rb | 55 +- spec/rails_helper.rb | 2 +- .../admin/flagged_topics_controller_spec.rb | 7 + spec/requests/admin/flags_controller_spec.rb | 30 +- .../moderation_history_controller_spec.rb | 66 --- spec/requests/admin/users_controller_spec.rb | 12 +- .../post_action_users_controller_spec.rb | 6 +- spec/requests/post_actions_controller_spec.rb | 45 +- spec/requests/posts_controller_spec.rb | 33 +- spec/requests/queued_posts_controller_spec.rb | 50 +- spec/requests/reviewables_controller_spec.rb | 419 ++++++++++++++ spec/requests/topics_controller_spec.rb | 2 +- spec/requests/user_actions_controller_spec.rb | 43 +- spec/serializers/post_serializer_spec.rb | 2 +- .../reviewable_queued_post_serializer_spec.rb | 65 +++ .../serializers/reviewable_serializer_spec.rb | 26 + .../reviewable_user_serializer_spec.rb | 16 + .../user_summary_serializer_spec.rb | 4 +- spec/services/auto_silence_spec.rb | 162 ++---- spec/services/badge_granter_spec.rb | 6 +- spec/services/post_action_notifier_spec.rb | 3 +- spec/services/post_alerter_spec.rb | 10 +- spec/services/post_owner_changer_spec.rb | 40 +- spec/services/staff_action_logger_spec.rb | 15 +- spec/services/user_destroyer_spec.rb | 18 +- spec/services/user_merger_spec.rb | 74 +-- spec/services/username_changer_spec.rb | 6 +- spec/support/diagnostics_helper.rb | 1 + spec/support/discourse_event_helper.rb | 6 + .../acceptance/admin-flags-test.js.es6 | 128 ----- .../acceptance/queued-posts-test.js.es6 | 183 ------ .../javascripts/acceptance/review-test.js.es6 | 137 +++++ test/javascripts/fixtures/topic.js.es6 | 4 - .../helpers/create-pretender.js.es6 | 24 +- .../javascripts/helpers/flag-pretender.js.es6 | 73 --- .../helpers/review-pretender.js.es6 | 114 ++++ .../widgets/hamburger-menu-test.js.es6 | 20 +- 354 files changed, 8090 insertions(+), 5225 deletions(-) delete mode 100644 app/assets/javascripts/admin/adapters/flagged-post.js.es6 delete mode 100644 app/assets/javascripts/admin/components/flagged-post-response.js.es6 delete mode 100644 app/assets/javascripts/admin/components/flagged-post-title.js.es6 delete mode 100644 app/assets/javascripts/admin/components/flagged-post.js.es6 delete mode 100644 app/assets/javascripts/admin/controllers/modals/admin-flags-received.js.es6 delete mode 100644 app/assets/javascripts/admin/controllers/modals/admin-moderation-history.js.es6 delete mode 100644 app/assets/javascripts/admin/models/flagged-post.js.es6 delete mode 100644 app/assets/javascripts/admin/routes/admin-flags-index.js.es6 delete mode 100644 app/assets/javascripts/admin/routes/admin-flags-topics-show.js.es6 delete mode 100644 app/assets/javascripts/admin/templates/components/flagged-post-response.hbs delete mode 100644 app/assets/javascripts/admin/templates/components/flagged-post-title.hbs delete mode 100644 app/assets/javascripts/admin/templates/components/flagged-post.hbs delete mode 100644 app/assets/javascripts/admin/templates/components/flagged-posts.hbs delete mode 100644 app/assets/javascripts/admin/templates/components/flagged-topic-users.hbs delete mode 100644 app/assets/javascripts/admin/templates/components/moderation-history-item.hbs delete mode 100644 app/assets/javascripts/admin/templates/flags-posts-active.hbs delete mode 100644 app/assets/javascripts/admin/templates/flags-posts-old.hbs delete mode 100644 app/assets/javascripts/admin/templates/flags-topics-index.hbs delete mode 100644 app/assets/javascripts/admin/templates/flags-topics-show.hbs delete mode 100644 app/assets/javascripts/admin/templates/flags.hbs delete mode 100644 app/assets/javascripts/admin/templates/modal/admin-flags-received.hbs delete mode 100644 app/assets/javascripts/admin/templates/modal/admin-moderation-history.hbs create mode 100644 app/assets/javascripts/discourse/adapters/reviewable-topic.js.es6 create mode 100644 app/assets/javascripts/discourse/adapters/reviewable.js.es6 delete mode 100644 app/assets/javascripts/discourse/components/flagged-posts.js.es6 delete mode 100644 app/assets/javascripts/discourse/components/queued-post.js.es6 create mode 100644 app/assets/javascripts/discourse/components/reviewable-bundled-action.js.es6 create mode 100644 app/assets/javascripts/discourse/components/reviewable-histories.js.es6 create mode 100644 app/assets/javascripts/discourse/components/reviewable-item.js.es6 delete mode 100644 app/assets/javascripts/discourse/controllers/header.js.es6 delete mode 100644 app/assets/javascripts/discourse/controllers/post-enqueued.js.es6 create mode 100644 app/assets/javascripts/discourse/controllers/review-index.js.es6 create mode 100644 app/assets/javascripts/discourse/helpers/dasherize.js.es6 create mode 100644 app/assets/javascripts/discourse/helpers/editable-value.js.es6 create mode 100644 app/assets/javascripts/discourse/helpers/format-score.js.es6 create mode 100644 app/assets/javascripts/discourse/helpers/reviewable-history-description.js.es6 create mode 100644 app/assets/javascripts/discourse/helpers/reviewable-status.js.es6 create mode 100644 app/assets/javascripts/discourse/models/reviewable-history.js.es6 create mode 100644 app/assets/javascripts/discourse/models/reviewable.js.es6 delete mode 100644 app/assets/javascripts/discourse/routes/queued-posts.js.es6 create mode 100644 app/assets/javascripts/discourse/routes/review-index.js.es6 create mode 100644 app/assets/javascripts/discourse/routes/review-show.js.es6 create mode 100644 app/assets/javascripts/discourse/routes/review-topics.js.es6 create mode 100644 app/assets/javascripts/discourse/routes/review.js.es6 delete mode 100644 app/assets/javascripts/discourse/routes/user-flagged-posts.js.es6 delete mode 100644 app/assets/javascripts/discourse/templates/components/queued-post.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-bundled-action.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-conversation-post.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-field-category.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-field-editor.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-field-tags.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-field-text.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-field-textarea.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-flagged-post.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-histories.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-item.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-queued-post.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-scores.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-topic-link.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/reviewable-user.hbs delete mode 100644 app/assets/javascripts/discourse/templates/queued-posts.hbs create mode 100644 app/assets/javascripts/discourse/templates/review-index.hbs create mode 100644 app/assets/javascripts/discourse/templates/review-show.hbs create mode 100644 app/assets/javascripts/discourse/templates/review-topics.hbs create mode 100644 app/assets/javascripts/discourse/templates/review.hbs delete mode 100644 app/assets/javascripts/select-kit/components/admin-agree-flag-dropdown.js.es6 delete mode 100644 app/assets/javascripts/select-kit/components/admin-delete-flag-dropdown.js.es6 delete mode 100644 app/assets/stylesheets/common/admin/moderation_history.scss create mode 100644 app/assets/stylesheets/common/base/reviewables.scss delete mode 100644 app/assets/stylesheets/common/select-kit/admin-agree-flag-dropdown.scss delete mode 100644 app/assets/stylesheets/common/select-kit/admin-delete-flag-dropdown.scss delete mode 100644 app/assets/stylesheets/desktop/queued-posts.scss create mode 100644 app/assets/stylesheets/mobile/reviewables.scss delete mode 100644 app/controllers/admin/moderation_history_controller.rb create mode 100644 app/controllers/reviewables_controller.rb create mode 100644 app/jobs/regular/notify_reviewable.rb create mode 100644 app/jobs/regular/topic_action_converter.rb create mode 100644 app/jobs/regular/truncate_user_flag_stats.rb delete mode 100644 app/models/queued_post.rb create mode 100644 app/models/reviewable.rb create mode 100644 app/models/reviewable_flagged_post.rb create mode 100644 app/models/reviewable_history.rb create mode 100644 app/models/reviewable_queued_post.rb create mode 100644 app/models/reviewable_score.rb create mode 100644 app/models/reviewable_user.rb create mode 100644 app/serializers/reviewable_action_serializer.rb create mode 100644 app/serializers/reviewable_bundled_action_serializer.rb create mode 100644 app/serializers/reviewable_conversation_post_serializer.rb create mode 100644 app/serializers/reviewable_conversation_serializer.rb create mode 100644 app/serializers/reviewable_editable_field_serializer.rb create mode 100644 app/serializers/reviewable_flagged_post_serializer.rb create mode 100644 app/serializers/reviewable_history_serializer.rb create mode 100644 app/serializers/reviewable_perform_result_serializer.rb create mode 100644 app/serializers/reviewable_queued_post_serializer.rb create mode 100644 app/serializers/reviewable_score_serializer.rb create mode 100644 app/serializers/reviewable_score_type_serializer.rb create mode 100644 app/serializers/reviewable_serializer.rb create mode 100644 app/serializers/reviewable_topic_serializer.rb create mode 100644 app/serializers/reviewable_user_serializer.rb delete mode 100644 app/services/user_action_creator.rb create mode 100644 app/services/user_action_manager.rb create mode 100644 db/migrate/20190103160533_create_reviewables.rb create mode 100644 db/migrate/20190103185626_create_reviewable_users.rb create mode 100644 db/migrate/20190110212005_create_reviewable_histories.rb create mode 100644 db/migrate/20190111170824_migrate_reviewable_queued_posts.rb create mode 100644 db/migrate/20190121202656_remove_user_action_pending.rb create mode 100644 db/migrate/20190130163000_create_reviewable_scores.rb create mode 100644 db/migrate/20190130163001_migrate_reviewable_flagged_posts.rb create mode 100644 db/migrate/20190215204033_add_score_bonus_to_post_action_types.rb create mode 100644 db/migrate/20190306184409_add_reviewable_score_to_topics.rb create mode 100644 db/migrate/20190313171338_add_indexes_to_reviewables.rb create mode 100644 db/migrate/20190315170411_add_index_to_reviewable_histories.rb create mode 100644 db/migrate/20190315174428_migrate_flag_history.rb create mode 100644 db/migrate/20190327205525_require_reviewable_scores.rb create mode 100644 db/post_migrate/20190121203023_drop_queued_post_id_from_user_actions.rb create mode 100644 db/post_migrate/20190123171817_drop_queued_posts.rb create mode 100644 lib/post_action_destroyer.rb create mode 100644 lib/post_action_result.rb delete mode 100644 lib/post_enqueuer.rb create mode 100644 lib/reviewable/actions.rb create mode 100644 lib/reviewable/collection.rb create mode 100644 lib/reviewable/conversation.rb create mode 100644 lib/reviewable/editable_fields.rb create mode 100644 lib/reviewable/perform_result.rb delete mode 100644 spec/components/post_enqueuer_spec.rb delete mode 100644 spec/fabricators/queued_post_fabricator.rb create mode 100644 spec/fabricators/reviewable_fabricator.rb create mode 100644 spec/jobs/notify_reviewable_spec.rb create mode 100644 spec/jobs/truncate_user_flag_stats_spec.rb delete mode 100644 spec/models/queued_post_spec.rb create mode 100644 spec/models/reviewable_flagged_post_spec.rb create mode 100644 spec/models/reviewable_history_spec.rb create mode 100644 spec/models/reviewable_queued_post_spec.rb create mode 100644 spec/models/reviewable_score_spec.rb create mode 100644 spec/models/reviewable_spec.rb create mode 100644 spec/models/reviewable_user_spec.rb delete mode 100644 spec/requests/admin/moderation_history_controller_spec.rb create mode 100644 spec/requests/reviewables_controller_spec.rb create mode 100644 spec/serializers/reviewable_queued_post_serializer_spec.rb create mode 100644 spec/serializers/reviewable_serializer_spec.rb create mode 100644 spec/serializers/reviewable_user_serializer_spec.rb delete mode 100644 test/javascripts/acceptance/admin-flags-test.js.es6 delete mode 100644 test/javascripts/acceptance/queued-posts-test.js.es6 create mode 100644 test/javascripts/acceptance/review-test.js.es6 delete mode 100644 test/javascripts/helpers/flag-pretender.js.es6 create mode 100644 test/javascripts/helpers/review-pretender.js.es6 diff --git a/app/assets/javascripts/admin/adapters/flagged-post.js.es6 b/app/assets/javascripts/admin/adapters/flagged-post.js.es6 deleted file mode 100644 index dc44315170f..00000000000 --- a/app/assets/javascripts/admin/adapters/flagged-post.js.es6 +++ /dev/null @@ -1,38 +0,0 @@ -import RestAdapter from "discourse/adapters/rest"; - -export default RestAdapter.extend({ - pathFor(store, type, findArgs) { - let args = _.merge({ rest_api: true }, findArgs); - delete args.filter; - return `/admin/flags/${findArgs.filter}.json?${$.param(args)}`; - }, - - afterFindAll(results, helper) { - results.forEach(flag => { - let conversations = []; - flag.post_actions.forEach(pa => { - if (pa.conversation) { - let conversation = { - permalink: pa.permalink, - hasMore: pa.conversation.has_more, - response: { - excerpt: pa.conversation.response.excerpt, - user: helper.lookup("user", pa.conversation.response.user_id) - } - }; - - if (pa.conversation.reply) { - conversation.reply = { - excerpt: pa.conversation.reply.excerpt, - user: helper.lookup("user", pa.conversation.reply.user_id) - }; - } - conversations.push(conversation); - } - }); - flag.set("conversations", conversations); - }); - - return results; - } -}); diff --git a/app/assets/javascripts/admin/components/flagged-post-response.js.es6 b/app/assets/javascripts/admin/components/flagged-post-response.js.es6 deleted file mode 100644 index e8dc2a230cd..00000000000 --- a/app/assets/javascripts/admin/components/flagged-post-response.js.es6 +++ /dev/null @@ -1,3 +0,0 @@ -export default Ember.Component.extend({ - classNames: ["flagged-post-response"] -}); diff --git a/app/assets/javascripts/admin/components/flagged-post-title.js.es6 b/app/assets/javascripts/admin/components/flagged-post-title.js.es6 deleted file mode 100644 index 4a6fa5d604f..00000000000 --- a/app/assets/javascripts/admin/components/flagged-post-title.js.es6 +++ /dev/null @@ -1,3 +0,0 @@ -export default Ember.Component.extend({ - tagName: "h3" -}); diff --git a/app/assets/javascripts/admin/components/flagged-post.js.es6 b/app/assets/javascripts/admin/components/flagged-post.js.es6 deleted file mode 100644 index 03edebab6cb..00000000000 --- a/app/assets/javascripts/admin/components/flagged-post.js.es6 +++ /dev/null @@ -1,58 +0,0 @@ -import showModal from "discourse/lib/show-modal"; -import computed from "ember-addons/ember-computed-decorators"; - -export default Ember.Component.extend({ - adminTools: Ember.inject.service(), - expanded: false, - tagName: "div", - classNameBindings: [ - ":flagged-post", - "flaggedPost.hidden:hidden-post", - "flaggedPost.deleted" - ], - - canAct: Ember.computed.alias("actableFilter"), - - @computed("filter") - actableFilter(filter) { - return filter === "active"; - }, - - removeAfter(promise) { - return promise.then(() => this.attrs.removePost()); - }, - - _spawnModal(name, model, modalClass) { - let controller = showModal(name, { model, admin: true, modalClass }); - controller.removeAfter = p => this.removeAfter(p); - }, - - actions: { - removeAfter(promise) { - return this.removeAfter(promise); - }, - - disagree() { - this.removeAfter(this.get("flaggedPost").disagreeFlags()); - }, - - defer() { - this.removeAfter(this.get("flaggedPost").deferFlags()); - }, - - expand() { - this.get("flaggedPost") - .expandHidden() - .then(() => { - this.set("expanded", true); - }); - }, - - showModerationHistory() { - this.get("adminTools").showModerationHistory({ - filter: "post", - post_id: this.get("flaggedPost.id") - }); - } - } -}); diff --git a/app/assets/javascripts/admin/components/penalty-post-action.js.es6 b/app/assets/javascripts/admin/components/penalty-post-action.js.es6 index b4d82aba8b3..d042e99a742 100644 --- a/app/assets/javascripts/admin/components/penalty-post-action.js.es6 +++ b/app/assets/javascripts/admin/components/penalty-post-action.js.es6 @@ -2,6 +2,7 @@ import computed from "ember-addons/ember-computed-decorators"; const ACTIONS = ["delete", "edit", "none"]; export default Ember.Component.extend({ + postId: null, postAction: null, postEdit: null, diff --git a/app/assets/javascripts/admin/components/user-flag-percentage.js.es6 b/app/assets/javascripts/admin/components/user-flag-percentage.js.es6 index cd6814ce799..cad6cd84755 100644 --- a/app/assets/javascripts/admin/components/user-flag-percentage.js.es6 +++ b/app/assets/javascripts/admin/components/user-flag-percentage.js.es6 @@ -9,7 +9,7 @@ export default Ember.Component.extend({ }, // We do a little logic to choose which icon to display and which text - @computed("user.flags_agreed", "user.flags_disagreed", "user.flags_ignored") + @computed("agreed", "disagreed", "ignored") percentage(agreed, disagreed, ignored) { let total = agreed + disagreed + ignored; let result = { total }; diff --git a/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 index 8c3b95bd13b..3d5c25279ca 100644 --- a/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 @@ -13,7 +13,6 @@ export default Ember.Controller.extend(CanCheckEmails, { availableGroups: null, userTitleValue: null, - showApproval: setting("must_approve_users"), showBadges: setting("enable_badges"), hasLockedTrustLevel: Ember.computed.notEmpty( "model.manual_locked_trust_level" @@ -215,9 +214,6 @@ export default Ember.Controller.extend(CanCheckEmails, { target_user: this.get("model.username") }); }, - showFlagsReceived() { - this.get("adminTools").showFlagsReceived(this.get("model")); - }, showSuspendModal() { this.get("adminTools").showSuspendModal(this.get("model")); }, diff --git a/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 index 630c1c113e7..ed6f4d4ca6d 100644 --- a/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 @@ -12,31 +12,7 @@ export default Ember.Controller.extend(CanCheckEmails, { refreshing: false, listFilter: null, selectAll: false, - - queryNew: Ember.computed.equal("query", "new"), - queryPending: Ember.computed.equal("query", "pending"), - queryHasApproval: Ember.computed.or("queryNew", "queryPending"), - showApproval: Ember.computed.and( - "siteSettings.must_approve_users", - "queryHasApproval" - ), searchHint: i18n("search_hint"), - hasSelection: Ember.computed.gt("selectedCount", 0), - - selectedCount: function() { - var model = this.get("model"); - if (!model || !model.length) return 0; - return model.filterBy("selected").length; - }.property("model.@each.selected"), - - selectAllChanged: function() { - var val = this.get("selectAll"); - this.get("model").forEach(function(user) { - if (user.get("can_approve")) { - user.set("selected", val); - } - }); - }.observes("selectAll"), title: function() { return I18n.t("admin.users.titles." + this.get("query")); @@ -60,34 +36,8 @@ export default Ember.Controller.extend(CanCheckEmails, { }, actions: { - approveUsers: function() { - AdminUser.bulkApprove(this.get("model").filterBy("selected")); - this._refreshUsers(); - }, - rejectUsers: function() { - var maxPostAge = this.siteSettings.delete_user_max_post_age; - var controller = this; - AdminUser.bulkReject(this.get("model").filterBy("selected")).then( - function(result) { - var message = I18n.t("admin.users.reject_successful", { - count: result.success - }); - if (result.failed > 0) { - message += - " " + - I18n.t("admin.users.reject_failures", { count: result.failed }); - message += - " " + - I18n.t("admin.user.delete_forbidden", { count: maxPostAge }); - } - bootbox.alert(message); - controller._refreshUsers(); - } - ); - }, - - toggleEmailVisibility: function() { + toggleEmailVisibility() { this.toggleProperty("showEmails"); this._refreshUsers(); } diff --git a/app/assets/javascripts/admin/controllers/modals/admin-flags-received.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-flags-received.js.es6 deleted file mode 100644 index f4c8226733b..00000000000 --- a/app/assets/javascripts/admin/controllers/modals/admin-flags-received.js.es6 +++ /dev/null @@ -1,17 +0,0 @@ -export default Ember.Controller.extend({ - loadingFlags: null, - user: null, - - onShow() { - this.set("loadingFlags", true); - this.store - .findAll("flagged-post", { - filter: "without_custom", - user_id: this.get("model.id") - }) - .then(result => { - this.set("loadingFlags", false); - this.set("flaggedPosts", result); - }); - } -}); diff --git a/app/assets/javascripts/admin/controllers/modals/admin-moderation-history.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-moderation-history.js.es6 deleted file mode 100644 index bce965fc46d..00000000000 --- a/app/assets/javascripts/admin/controllers/modals/admin-moderation-history.js.es6 +++ /dev/null @@ -1,21 +0,0 @@ -import ModalFunctionality from "discourse/mixins/modal-functionality"; - -export default Ember.Controller.extend(ModalFunctionality, { - loading: null, - historyTarget: null, - history: null, - - onShow() { - this.set("loading", true); - this.set("history", null); - }, - - loadHistory(target) { - this.store - .findAll("moderation-history", target) - .then(result => { - this.set("history", result); - }) - .finally(() => this.set("loading", false)); - } -}); diff --git a/app/assets/javascripts/admin/controllers/modals/admin-silence-user.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-silence-user.js.es6 index c4ad822485b..40b3aa640ff 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-silence-user.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-silence-user.js.es6 @@ -29,7 +29,7 @@ export default Ember.Controller.extend(PenaltyController, { silenced_till: this.get("silenceUntil"), reason: this.get("reason"), message: this.get("message"), - post_id: this.get("post.id"), + post_id: this.get("postId"), post_action: this.get("postAction"), post_edit: this.get("postEdit") }); diff --git a/app/assets/javascripts/admin/controllers/modals/admin-suspend-user.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-suspend-user.js.es6 index d1d6de7f4b4..180b470d492 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-suspend-user.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-suspend-user.js.es6 @@ -30,7 +30,7 @@ export default Ember.Controller.extend(PenaltyController, { suspend_until: this.get("suspendUntil"), reason: this.get("reason"), message: this.get("message"), - post_id: this.get("post.id"), + post_id: this.get("postId"), post_action: this.get("postAction"), post_edit: this.get("postEdit") }); diff --git a/app/assets/javascripts/admin/mixins/penalty-controller.js.es6 b/app/assets/javascripts/admin/mixins/penalty-controller.js.es6 index a5b62a0143f..efa71a2bebd 100644 --- a/app/assets/javascripts/admin/mixins/penalty-controller.js.es6 +++ b/app/assets/javascripts/admin/mixins/penalty-controller.js.es6 @@ -7,7 +7,7 @@ export default Ember.Mixin.create(ModalFunctionality, { postEdit: null, postAction: null, user: null, - post: null, + postId: null, successCallback: null, resetModal() { @@ -15,7 +15,7 @@ export default Ember.Mixin.create(ModalFunctionality, { reason: null, message: null, loadingUser: true, - post: null, + postId: null, postEdit: null, postAction: "delete", before: null, diff --git a/app/assets/javascripts/admin/models/admin-user.js.es6 b/app/assets/javascripts/admin/models/admin-user.js.es6 index 7e45667c25f..bc1cba2f411 100644 --- a/app/assets/javascripts/admin/models/admin-user.js.es6 +++ b/app/assets/javascripts/admin/models/admin-user.js.es6 @@ -573,36 +573,6 @@ const AdminUser = Discourse.User.extend({ }); AdminUser.reopenClass({ - bulkApprove(users) { - users.forEach(user => { - user.setProperties({ - approved: true, - can_approve: false, - selected: false - }); - }); - - return ajax("/admin/users/approve-bulk", { - type: "PUT", - data: { users: users.map(u => u.id) } - }).finally(() => bootbox.alert(I18n.t("admin.user.approve_bulk_success"))); - }, - - bulkReject(users) { - users.forEach(user => { - user.set("can_approve", false); - user.set("selected", false); - }); - - return ajax("/admin/users/reject-bulk", { - type: "DELETE", - data: { - users: users.map(u => u.id), - context: window.location.pathname - } - }); - }, - find(user_id) { return ajax("/admin/users/" + user_id + ".json").then(result => { result.loadedDetails = true; diff --git a/app/assets/javascripts/admin/models/flagged-post.js.es6 b/app/assets/javascripts/admin/models/flagged-post.js.es6 deleted file mode 100644 index 13d69bf6650..00000000000 --- a/app/assets/javascripts/admin/models/flagged-post.js.es6 +++ /dev/null @@ -1,166 +0,0 @@ -import { ajax } from "discourse/lib/ajax"; -import Post from "discourse/models/post"; -import computed from "ember-addons/ember-computed-decorators"; -import { popupAjaxError } from "discourse/lib/ajax-error"; - -export default Post.extend({ - @computed - summary() { - return _(this.post_actions) - .groupBy(function(a) { - return a.post_action_type_id; - }) - .map(function(v, k) { - return I18n.t("admin.flags.summary.action_type_" + k, { - count: v.length - }); - }) - .join(","); - }, - - @computed("last_revised_at", "post_actions.@each.created_at") - wasEdited(lastRevisedAt) { - if (Ember.isEmpty(this.get("last_revised_at"))) { - return false; - } - lastRevisedAt = Date.parse(lastRevisedAt); - const postActions = this.get("post_actions") || []; - return postActions.some(postAction => { - return Date.parse(postAction.created_at) < lastRevisedAt; - }); - }, - - @computed("post_actions") - hasDisposedBy() { - return this.get("post_actions").some(action => action.disposed_by); - }, - - @computed("post_actions.@each.name_key") - flaggedForSpam() { - return this.get("post_actions").every(action => action.name_key === "spam"); - }, - - @computed("post_actions.@each.targets_topic") - topicFlagged() { - return _.any(this.get("post_actions"), function(action) { - return action.targets_topic; - }); - }, - - @computed("post_actions.@each.targets_topic") - postAuthorFlagged() { - return _.any(this.get("post_actions"), function(action) { - return !action.targets_topic; - }); - }, - - @computed("flaggedForSpam") - canDeleteAsSpammer(flaggedForSpam) { - return ( - flaggedForSpam && - this.get("user.can_delete_all_posts") && - this.get("user.can_be_deleted") - ); - }, - - deletePost() { - if (this.get("post_number") === 1) { - return ajax("/t/" + this.topic_id, { type: "DELETE", cache: false }); - } else { - return ajax("/posts/" + this.id, { type: "DELETE", cache: false }); - } - }, - - disagreeFlags() { - return ajax("/admin/flags/disagree/" + this.id, { - type: "POST", - cache: false - }).catch(popupAjaxError); - }, - - deferFlags(deletePost) { - const action = () => { - return ajax("/admin/flags/defer/" + this.id, { - type: "POST", - cache: false, - data: { delete_post: deletePost } - }); - }; - - if (deletePost && this._hasDeletableReplies()) { - return this._actOnFlagAndDeleteReplies(action); - } else { - return action().catch(popupAjaxError); - } - }, - - agreeFlags(actionOnPost) { - const action = () => { - return ajax("/admin/flags/agree/" + this.id, { - type: "POST", - cache: false, - data: { action_on_post: actionOnPost } - }); - }; - - if (actionOnPost === "delete" && this._hasDeletableReplies()) { - return this._actOnFlagAndDeleteReplies(action); - } else { - return action().catch(popupAjaxError); - } - }, - - _hasDeletableReplies() { - return this.get("post_number") > 1 && this.get("reply_count") > 0; - }, - - _actOnFlagAndDeleteReplies(action) { - return new Ember.RSVP.Promise((resolve, reject) => { - return ajax(`/posts/${this.id}/reply-ids/all.json`) - .then(replies => { - const buttons = []; - - buttons.push({ - label: I18n.t("no_value"), - callback() { - action() - .then(resolve) - .catch(error => { - popupAjaxError(error); - reject(); - }); - } - }); - - buttons.push({ - label: I18n.t("yes_value"), - class: "btn-danger", - callback() { - Post.deleteMany(replies.map(r => r.id), { - agreeWithFirstReplyFlag: false - }) - .then(action) - .then(resolve) - .catch(error => { - popupAjaxError(error); - reject(); - }); - } - }); - - bootbox.dialog( - I18n.t("admin.flags.delete_replies", { count: replies.length }), - buttons - ); - }) - .catch(error => { - popupAjaxError(error); - reject(); - }); - }); - }, - - postHidden: Ember.computed.alias("hidden"), - - deleted: Ember.computed.or("deleted_at", "topic_deleted_at") -}); diff --git a/app/assets/javascripts/admin/routes/admin-flags-index.js.es6 b/app/assets/javascripts/admin/routes/admin-flags-index.js.es6 deleted file mode 100644 index 3f78906e3fe..00000000000 --- a/app/assets/javascripts/admin/routes/admin-flags-index.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -export default Discourse.Route.extend({ - redirect() { - let segment = this.siteSettings.flags_default_topics - ? "topics" - : "postsActive"; - this.replaceWith(`adminFlags.${segment}`); - } -}); diff --git a/app/assets/javascripts/admin/routes/admin-flags-topics-show.js.es6 b/app/assets/javascripts/admin/routes/admin-flags-topics-show.js.es6 deleted file mode 100644 index 879222c4958..00000000000 --- a/app/assets/javascripts/admin/routes/admin-flags-topics-show.js.es6 +++ /dev/null @@ -1,20 +0,0 @@ -import { loadTopicView } from "discourse/models/topic"; - -export default Ember.Route.extend({ - model(params) { - let topicRecord = this.store.createRecord("topic", { id: params.id }); - let topic = loadTopicView(topicRecord).then(() => topicRecord); - - return Ember.RSVP.hash({ - topic, - flaggedPosts: this.store.findAll("flagged-post", { - filter: "active", - topic_id: params.id - }) - }); - }, - - setupController(controller, hash) { - controller.setProperties(hash); - } -}); diff --git a/app/assets/javascripts/admin/routes/admin-route-map.js.es6 b/app/assets/javascripts/admin/routes/admin-route-map.js.es6 index 3ec2cc9c8cc..b302b1b9c9b 100644 --- a/app/assets/javascripts/admin/routes/admin-route-map.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-route-map.js.es6 @@ -120,18 +120,6 @@ export default function() { } ); - this.route( - "adminFlags", - { path: "/flags", resetNamespace: true }, - function() { - this.route("postsActive", { path: "active" }); - this.route("postsOld", { path: "old" }); - this.route("topics", { path: "topics" }, function() { - this.route("show", { path: ":id" }); - }); - } - ); - this.route( "adminLogs", { path: "/logs", resetNamespace: true }, diff --git a/app/assets/javascripts/admin/services/admin-tools.js.es6 b/app/assets/javascripts/admin/services/admin-tools.js.es6 index 4a055b0daf0..7f3b4d88a81 100644 --- a/app/assets/javascripts/admin/services/admin-tools.js.es6 +++ b/app/assets/javascripts/admin/services/admin-tools.js.es6 @@ -26,10 +26,6 @@ export default Ember.Service.extend({ }); }, - showFlagsReceived(user) { - showModal(`admin-flags-received`, { admin: true, model: user }); - }, - checkSpammer(userId) { return AdminUser.find(userId).then(au => this.spammerDetails(au)); }, @@ -53,12 +49,7 @@ export default Ember.Service.extend({ admin: true, modalClass: `${type}-user-modal` }); - if (opts.post) { - controller.setProperties({ - post: opts.post, - postEdit: opts.post.get("raw") - }); - } + controller.setProperties({ postId: opts.postId, postEdit: opts.postEdit }); return (user.adminUserView ? Ember.RSVP.resolve(user) @@ -81,11 +72,6 @@ export default Ember.Service.extend({ this._showControlModal("suspend", user, opts); }, - showModerationHistory(target) { - let controller = showModal("admin-moderation-history", { admin: true }); - controller.loadHistory(target); - }, - _deleteSpammer(adminUser) { // Try loading the email if the site supports it let tryEmail = this.siteSettings.moderators_view_emails diff --git a/app/assets/javascripts/admin/templates/admin.hbs b/app/assets/javascripts/admin/templates/admin.hbs index 415239a6565..4dc2dc3061a 100644 --- a/app/assets/javascripts/admin/templates/admin.hbs +++ b/app/assets/javascripts/admin/templates/admin.hbs @@ -19,7 +19,6 @@ {{#if currentUser.admin}} {{nav-item route='adminEmail' label='admin.email.title'}} {{/if}} - {{nav-item route='adminFlags' label='admin.flags.title'}} {{nav-item route='adminLogs' label='admin.logs.title'}} {{#if currentUser.admin}} {{nav-item route='adminCustomize' label='admin.customize.title'}} diff --git a/app/assets/javascripts/admin/templates/components/flag-user-lists.hbs b/app/assets/javascripts/admin/templates/components/flag-user-lists.hbs index 2bf86a7bf68..62224b13c14 100644 --- a/app/assets/javascripts/admin/templates/components/flag-user-lists.hbs +++ b/app/assets/javascripts/admin/templates/components/flag-user-lists.hbs @@ -8,7 +8,10 @@
{{post-action-title postAction.post_action_type_id postAction.name_key}}
- {{user-flag-percentage user=postAction.user}} + {{user-flag-percentage + agreed=postAction.user.flags_agreed + disagreed=postAction.user.flags_disagreed + ignored=postAction.user.flags_ignored}} {{/flag-user}} {{/each}} diff --git a/app/assets/javascripts/admin/templates/components/flagged-post-response.hbs b/app/assets/javascripts/admin/templates/components/flagged-post-response.hbs deleted file mode 100644 index 133c72b036e..00000000000 --- a/app/assets/javascripts/admin/templates/components/flagged-post-response.hbs +++ /dev/null @@ -1,7 +0,0 @@ -{{#link-to 'adminUser' response.user.id response.user.username class="response-avatar"}} - {{avatar response.user imageSize="small"}} -{{/link-to}} -
{{{response.excerpt}}}
-{{#if hasMore}} - {{i18n 'admin.flags.more'}} -{{/if}} diff --git a/app/assets/javascripts/admin/templates/components/flagged-post-title.hbs b/app/assets/javascripts/admin/templates/components/flagged-post-title.hbs deleted file mode 100644 index 0871c5c6f1d..00000000000 --- a/app/assets/javascripts/admin/templates/components/flagged-post-title.hbs +++ /dev/null @@ -1,8 +0,0 @@ -{{#if flaggedPost.topic.isPrivateMessage}} - {{d-icon "envelope"}} -{{/if}} -{{topic-status topic=flaggedPost.topic}} -{{{unbound flaggedPost.topic.fancyTitle}}} -{{#if flaggedPost.reply_count}} - {{i18n 'admin.flags.replies' count=flaggedPost.reply_count}} -{{/if}} diff --git a/app/assets/javascripts/admin/templates/components/flagged-post.hbs b/app/assets/javascripts/admin/templates/components/flagged-post.hbs deleted file mode 100644 index b9cab70960f..00000000000 --- a/app/assets/javascripts/admin/templates/components/flagged-post.hbs +++ /dev/null @@ -1,116 +0,0 @@ -
-
- {{#if flaggedPost.postAuthorFlagged}} - {{#if flaggedPost.user}} - {{#link-to 'adminUser' flaggedPost.user.id flaggedPost.user.username}} - {{avatar flaggedPost.user imageSize="large"}} - {{/link-to}} - {{#if flaggedPost.wasEdited}} -
- {{d-icon "pencil-alt" title="admin.flags.was_edited"}} -
- {{/if}} - {{/if}} - {{/if}} - {{#if canAct}} - {{#if flaggedPost.previous_flags_count}} - {{flaggedPost.previous_flags_count}} - {{/if}} - {{/if}} -
- -
-
- {{format-username flaggedPost.user.username}} - {{plugin-outlet - name="flagged-post-controls" - tagName="" - args=(hash flaggedPost=flaggedPost actableFilter=actableFilter topic=topic)}} -
- -
- {{#unless hideTitle}} - {{flagged-post-title flaggedPost=flaggedPost}} - {{/unless}} - {{#if flaggedPost.postAuthorFlagged}} - {{#if expanded}} - {{{flaggedPost.cooked}}} - {{else}} -

- {{{flaggedPost.excerpt}}} - {{i18n "admin.flags.show_full"}} -

- {{/if}} - {{/if}} -
- - {{#if flaggedPost.topicFlagged}} -
- {{{i18n 'admin.flags.topic_flagged'}}} - {{i18n 'admin.flags.visit_topic'}} -
- {{/if}} - - {{#each flaggedPost.conversations as |c|}} -
- {{#if c.response}} - {{flagged-post-response response=c.response}} - {{#if c.reply}} - {{flagged-post-response response=c.reply hasMore=c.hasMore permalink=c.permalink}} - {{/if}} - - {{d-icon "reply"}} - {{i18n "admin.flags.reply_message"}} - - {{/if}} -
- {{/each}} - - {{flag-user-lists flaggedPost=flaggedPost showResolvedBy=showResolvedBy}} - -
- {{#if canAct}} - {{admin-agree-flag-dropdown - post=flaggedPost - removeAfter=(action "removeAfter") }} - - {{#if flaggedPost.postHidden}} - {{d-button - title="admin.flags.disagree_flag_unhide_post_title" - class="btn-default disagree-flag" - action=(action "disagree") - icon="thumbs-o-down" - label="admin.flags.disagree_flag_unhide_post"}} - {{else}} - {{d-button - title="admin.flags.disagree_flag_title" - class="btn-default disagree-flag" - action=(action "disagree") - icon="thumbs-o-down" - label="admin.flags.disagree_flag"}} - {{/if}} - - {{d-button - class="btn-default defer-flag" - title="admin.flags.ignore_flag_title" - action=(action "defer") - icon="external-link-alt" - label="admin.flags.ignore_flag"}} - - {{admin-delete-flag-dropdown - post=flaggedPost - removeAfter=(action "removeAfter")}} - {{/if}} - - {{d-button - class="btn-default" - icon="list" - label="admin.flags.moderation_history" - action=(action "showModerationHistory")}} -
- {{plugin-outlet - name="flagged-post-below-controls" - tagName="" - args=(hash flaggedPost=flaggedPost canAct=canAct actableFilter=actableFilter)}} -
-
diff --git a/app/assets/javascripts/admin/templates/components/flagged-posts.hbs b/app/assets/javascripts/admin/templates/components/flagged-posts.hbs deleted file mode 100644 index 5f1aab3a86e..00000000000 --- a/app/assets/javascripts/admin/templates/components/flagged-posts.hbs +++ /dev/null @@ -1,17 +0,0 @@ -{{#if flaggedPosts}} - {{#load-more selector=".flagged-post" action=(action "loadMore")}} -
- {{#each flaggedPosts as |flaggedPost|}} - {{flagged-post - flaggedPost=flaggedPost - filter=filter - topic=topic - showResolvedBy=showResolvedBy - removePost=(action "removePost" flaggedPost) - hideTitle=topic}} - {{/each}} -
- {{/load-more}} -{{else}} -

{{i18n 'admin.flags.no_results'}}

-{{/if}} diff --git a/app/assets/javascripts/admin/templates/components/flagged-topic-users.hbs b/app/assets/javascripts/admin/templates/components/flagged-topic-users.hbs deleted file mode 100644 index ad9f40585a0..00000000000 --- a/app/assets/javascripts/admin/templates/components/flagged-topic-users.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{{#each users as |u|}} - {{#link-to 'adminUser' u.id u.username class="flagged-topic-user"}} - {{avatar u imageSize="small"}} - {{/link-to}} -{{/each}} diff --git a/app/assets/javascripts/admin/templates/components/moderation-history-item.hbs b/app/assets/javascripts/admin/templates/components/moderation-history-item.hbs deleted file mode 100644 index bf2ddc0f4cf..00000000000 --- a/app/assets/javascripts/admin/templates/components/moderation-history-item.hbs +++ /dev/null @@ -1,17 +0,0 @@ - - {{format-date item.created_at}} - - -
- {{i18n (concat "admin.moderation_history.actions." item.action_name)}} -
-
{{item.details}}
- - - {{#if item.acting_user}} - {{#user-link user=item.acting_user}} - {{avatar item.acting_user imageSize="small"}} - {{format-username item.acting_user.username}} - {{/user-link}} - {{/if}} - diff --git a/app/assets/javascripts/admin/templates/flags-posts-active.hbs b/app/assets/javascripts/admin/templates/flags-posts-active.hbs deleted file mode 100644 index 9f1c21e463c..00000000000 --- a/app/assets/javascripts/admin/templates/flags-posts-active.hbs +++ /dev/null @@ -1 +0,0 @@ -{{flagged-posts flaggedPosts=model filter="active"}} diff --git a/app/assets/javascripts/admin/templates/flags-posts-old.hbs b/app/assets/javascripts/admin/templates/flags-posts-old.hbs deleted file mode 100644 index b4f52846124..00000000000 --- a/app/assets/javascripts/admin/templates/flags-posts-old.hbs +++ /dev/null @@ -1 +0,0 @@ -{{flagged-posts flaggedPosts=model filter="old"}} diff --git a/app/assets/javascripts/admin/templates/flags-topics-index.hbs b/app/assets/javascripts/admin/templates/flags-topics-index.hbs deleted file mode 100644 index 73cd022fc14..00000000000 --- a/app/assets/javascripts/admin/templates/flags-topics-index.hbs +++ /dev/null @@ -1,54 +0,0 @@ -{{plugin-outlet name="flagged-topics-before" noTags=true args=(hash flaggedTopics=flaggedTopics)}} - -{{#if flaggedTopics}} - - - {{plugin-outlet name="flagged-topic-header-row" noTags=true}} - - - - - - - - {{#each flaggedTopics as |ft|}} - - {{plugin-outlet name="flagged-topic-row" noTags=true args=(hash topic=ft.topic)}} - - - - - - - - {{/each}} - -
{{i18n "admin.flags.flagged_topics.topic"}} {{i18n "admin.flags.flagged_topics.type"}}{{I18n "admin.flags.flagged_topics.users"}}{{i18n "admin.flags.flagged_topics.last_flagged"}}
-
- {{topic-status topic=ft.topic}} - {{replace-emoji ft.topic.fancy_title}} -
-
- {{#each ft.flag_counts as |fc|}} -
- {{post-action-title fc.post_action_type_id fc.name_key}} - x{{fc.count}} -
- {{/each}} -
- {{flagged-topic-users users=ft.users tagName=""}} - - {{format-age ft.last_flag_at}} - - {{#link-to - "adminFlags.topics.show" - ft.id - class="btn d-button no-text btn-small btn-primary show-details" - title=(i18n "admin.flags.show_details")}} - {{d-icon "list"}} - {{i18n "admin.flags.details"}} - {{/link-to}} -
-{{else}} - {{i18n "admin.flags.flagged_topics.no_results"}} -{{/if}} diff --git a/app/assets/javascripts/admin/templates/flags-topics-show.hbs b/app/assets/javascripts/admin/templates/flags-topics-show.hbs deleted file mode 100644 index 04947802203..00000000000 --- a/app/assets/javascripts/admin/templates/flags-topics-show.hbs +++ /dev/null @@ -1,19 +0,0 @@ -
-
-

- {{topic-status topic=topic}} - {{#link-to 'topic' topic target="_blank"}} - {{{topic.fancyTitle}}} - {{/link-to}} -

-
- - {{plugin-outlet name="flagged-topic-details-header" args=(hash topic=topic)}} -
- -
- {{flagged-posts - flaggedPosts=flaggedPosts - filter="active" - topic=topic}} -
diff --git a/app/assets/javascripts/admin/templates/flags.hbs b/app/assets/javascripts/admin/templates/flags.hbs deleted file mode 100644 index d13ad994bca..00000000000 --- a/app/assets/javascripts/admin/templates/flags.hbs +++ /dev/null @@ -1,15 +0,0 @@ -{{#admin-nav}} - {{#if siteSettings.flags_default_topics}} - {{nav-item route='adminFlags.topics' label='admin.flags.topics'}} - {{nav-item route='adminFlags.postsActive' label='admin.flags.active_posts'}} - {{else}} - {{nav-item route='adminFlags.postsActive' label='admin.flags.active_posts'}} - {{nav-item route='adminFlags.topics' label='admin.flags.topics'}} - {{/if}} - - {{nav-item route='adminFlags.postsOld' label='admin.flags.old_posts' class='right'}} -{{/admin-nav}} - -
- {{outlet}} -
diff --git a/app/assets/javascripts/admin/templates/modal/admin-flags-received.hbs b/app/assets/javascripts/admin/templates/modal/admin-flags-received.hbs deleted file mode 100644 index 9f05993cf90..00000000000 --- a/app/assets/javascripts/admin/templates/modal/admin-flags-received.hbs +++ /dev/null @@ -1,14 +0,0 @@ -{{#d-modal-body rawTitle=(i18n "admin.user.flags_received_by" username=model.username)}} - {{#conditional-loading-spinner condition=loadingFlags}} - {{#each flaggedPosts as |flaggedPost|}} -
-
- {{flagged-post-title flaggedPost=flaggedPost}} -
- {{flag-user-lists flaggedPost=flaggedPost showResolvedBy=flaggedPost.hasDisposedBy}} -
- {{else}} - {{i18n "admin.user.flags_received_none"}} - {{/each}} - {{/conditional-loading-spinner}} -{{/d-modal-body}} diff --git a/app/assets/javascripts/admin/templates/modal/admin-moderation-history.hbs b/app/assets/javascripts/admin/templates/modal/admin-moderation-history.hbs deleted file mode 100644 index b79f4bdf304..00000000000 --- a/app/assets/javascripts/admin/templates/modal/admin-moderation-history.hbs +++ /dev/null @@ -1,23 +0,0 @@ -{{#d-modal-body title="admin.flags.moderation_history"}} - {{#conditional-loading-spinner condition=loading}} - {{#if history}} - - - - - - - {{#each history as |item|}} - {{moderation-history-item item=item}} - {{/each}} -
{{i18n "admin.logs.created_at"}}{{i18n "admin.logs.action"}}{{i18n "admin.moderation_history.performed_by"}}
- {{else}} -
- {{i18n "admin.moderation_history.no_results"}} -
- {{/if}} - {{/conditional-loading-spinner}} -{{/d-modal-body}} - diff --git a/app/assets/javascripts/admin/templates/modal/admin-silence-user.hbs b/app/assets/javascripts/admin/templates/modal/admin-silence-user.hbs index fc4d223ac75..7f830916cd4 100644 --- a/app/assets/javascripts/admin/templates/modal/admin-silence-user.hbs +++ b/app/assets/javascripts/admin/templates/modal/admin-silence-user.hbs @@ -13,9 +13,9 @@ {{silence-details reason=reason message=message}} - {{#if post}} + {{#if postId}} {{penalty-post-action - post=post + postId=postId postAction=postAction postEdit=postEdit}} {{/if}} diff --git a/app/assets/javascripts/admin/templates/modal/admin-suspend-user.hbs b/app/assets/javascripts/admin/templates/modal/admin-suspend-user.hbs index 6a1c9c28f46..cc4a075fe8f 100644 --- a/app/assets/javascripts/admin/templates/modal/admin-suspend-user.hbs +++ b/app/assets/javascripts/admin/templates/modal/admin-suspend-user.hbs @@ -14,9 +14,9 @@ {{suspension-details reason=reason message=message}} - {{#if post}} + {{#if postId}} {{penalty-post-action - post=post + postId=postId postAction=postAction postEdit=postEdit}} {{/if}} diff --git a/app/assets/javascripts/admin/templates/user-index.hbs b/app/assets/javascripts/admin/templates/user-index.hbs index dc69ee5a7ab..be8b29f29cb 100644 --- a/app/assets/javascripts/admin/templates/user-index.hbs +++ b/app/assets/javascripts/admin/templates/user-index.hbs @@ -221,7 +221,7 @@

{{i18n "admin.user.permissions"}}

- {{#if showApproval}} + {{#if siteSettings.must_approve_users}}
{{i18n "admin.users.approved"}}
@@ -614,12 +614,9 @@
{{#if model.flags_received_count}} - {{d-button - class="btn-default" - action=(action "showFlagsReceived") - label="admin.user.show_flags_received" - icon="flag" - }} + {{#link-to 'review' (query-params username=model.username type="ReviewableFlaggedPost" status="all") class="btn"}} + {{i18n "admin.user.show_flags_received"}} + {{/link-to}} {{/if}}
diff --git a/app/assets/javascripts/admin/templates/users-list-show.hbs b/app/assets/javascripts/admin/templates/users-list-show.hbs index 708f1ef6761..af4ebc33183 100644 --- a/app/assets/javascripts/admin/templates/users-list-show.hbs +++ b/app/assets/javascripts/admin/templates/users-list-show.hbs @@ -1,10 +1,3 @@ -{{#if hasSelection}} -
- - -
-{{/if}} -

{{title}}

{{#if canCheckEmails}} @@ -24,9 +17,6 @@ {{#if model}} - {{#if showApproval}} - - {{/if}} {{admin-directory-toggle field="username" i18nKey='username' order=order ascending=ascending}} {{admin-directory-toggle field="email" i18nKey='email' order=order ascending=ascending}} {{admin-directory-toggle field="last_emailed" i18nKey='admin.users.last_emailed' order=order ascending=ascending}} @@ -35,7 +25,7 @@ {{admin-directory-toggle field="posts_read" i18nKey="admin.user.posts_read_count" order=order ascending=ascending}} {{admin-directory-toggle field="read_time" i18nKey="admin.user.time_read" order=order ascending=ascending}} {{admin-directory-toggle field="created" i18nKey="created" order=order ascending=ascending}} - {{#if showApproval}} + {{#if siteSettings.must_approve_users}} {{/if}} @@ -43,13 +33,6 @@ {{#each model as |user|}} - {{#if showApproval}} - - {{/if}} - {{#if showApproval}} - + {{#if siteSettings.must_approve_users}} + {{/if}} +
{{input type="checkbox" checked=selectAll}}{{i18n 'admin.users.approved'}} 
- {{#if user.can_approve}} - {{input type="checkbox" checked=user.selected}} - {{/if}} - {{avatar user imageSize="small"}} @@ -88,15 +71,10 @@
{{{format-duration user.created_at_age}}}
- {{#if user.approved}} - {{i18n 'yes_value'}} - {{else}} - {{i18n 'no_value'}} - {{/if}} - {{i18n-yes-no user.approved}} {{#if user.admin}} {{d-icon "shield-alt" title="admin.title" }} diff --git a/app/assets/javascripts/admin/templates/users-list.hbs b/app/assets/javascripts/admin/templates/users-list.hbs index d4d5be049f8..681eb945a52 100644 --- a/app/assets/javascripts/admin/templates/users-list.hbs +++ b/app/assets/javascripts/admin/templates/users-list.hbs @@ -3,9 +3,6 @@