From c7d9ab58984262de682d9e35674651f4be0d1e1c Mon Sep 17 00:00:00 2001 From: Nathan Smith Date: Tue, 21 Feb 2023 19:43:34 -0800 Subject: [PATCH 1/5] Add section info --- app/controllers/admin/reviews_controller.rb | 2 ++ app/views/admin/reviews/show.html.erb | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/app/controllers/admin/reviews_controller.rb b/app/controllers/admin/reviews_controller.rb index 5fe1f68f..df54021f 100644 --- a/app/controllers/admin/reviews_controller.rb +++ b/app/controllers/admin/reviews_controller.rb @@ -8,6 +8,7 @@ def initialize @reviews = T.let(nil, T.nilable(Review::RelationType)) @review = T.let(nil, T.nilable(Review)) @author = T.let(nil, T.nilable(User)) + @section = T.let(nil, T.nilable(Section)) end class IndexParams < T::Struct @@ -33,6 +34,7 @@ def show typed_params = TypedParams[ShowParams].new.extract!(params) @review = Review.find(typed_params.id) @author = @review.user + @section = T.must(@review.section) end class UpdateParams < T::Struct diff --git a/app/views/admin/reviews/show.html.erb b/app/views/admin/reviews/show.html.erb index 3946f9c0..4ebcf677 100644 --- a/app/views/admin/reviews/show.html.erb +++ b/app/views/admin/reviews/show.html.erb @@ -29,6 +29,19 @@ <% end %> +<%= render "shared/card", id: "section", title: "Section" do %> +
+
+
+
+

<%= @section.course_title %>

+

Instructor: <%= @section.instructor.full_label %>

+
+
+
+
+<% end %> + <%= render "shared/card", id: "grading-info", title: "Grading Information" do %> <%= render "shared/list", collection: @review.course_details, paginate: false do |course_detail| %>
  • From 21c2b490754003b2e33f48d8e6cb61a448d16f79 Mon Sep 17 00:00:00 2001 From: Nathan Smith Date: Tue, 21 Feb 2023 20:19:48 -0800 Subject: [PATCH 2/5] Add approve all functionality --- app/controllers/admin/reviews_controller.rb | 40 +++++++++++++++++++++ app/views/admin/reviews/index.html.erb | 4 +++ config/routes.rb | 2 ++ 3 files changed, 46 insertions(+) diff --git a/app/controllers/admin/reviews_controller.rb b/app/controllers/admin/reviews_controller.rb index df54021f..ad0c8f12 100644 --- a/app/controllers/admin/reviews_controller.rb +++ b/app/controllers/admin/reviews_controller.rb @@ -62,4 +62,44 @@ def update redirect_to(admin_review_path(@review)) end + + class UpdateAllParams < T::Struct + const :status, Review::Status + end + + # PATCH/PUT /admin/reviews/all + sig { void } + def update_all_pending + Rails.logger.debug("NATHAN HELLO") + typed_params = TypedParams[UpdateAllParams].new.extract!(params) + + pending_reviews = T.let(T.unsafe(Review.all.where(status: :pending)).to_a, T::Array[Review]) + pending_reviews.map do |review| + update_review(review, typed_params.status) + end + + redirect_to(admin_reviews_path) + end + + private + + sig { params(review: Review, status: Review::Status).returns(Review) } + def update_review(review, status) + user = T.must(review.user) + is_first_review = user.reviews.size == 1 + + if (status == Review::Status::Approved) && !review.approved? + user.add_notification_token + user.complete_referral! if is_first_review && user.referred_by + + NotifyUserAboutApprovedReviewJob.perform_later(review) + elsif status == Review::Status::Rejected + NotifyUserAboutRejectedReviewJob.perform_later(review) + end + + review.typed_status = status + review.save! + + review + end end diff --git a/app/views/admin/reviews/index.html.erb b/app/views/admin/reviews/index.html.erb index bef6e915..75060d52 100644 --- a/app/views/admin/reviews/index.html.erb +++ b/app/views/admin/reviews/index.html.erb @@ -2,6 +2,10 @@ <%= render "shared/page_header", title: "Admin: Reviews", breadcrumbs: [{ name: "Home", link: "/" }, { name: "Admin: Reviews", link: admin_reviews_path }] %> +
    + <%= button_to "Approve all", [:admin, :reviews, :all], method: :patch, params: { status: "approved" }, class: "inline-flex items-center rounded-md border border-transparent bg-red-600 px-6 py-3 text-base font-medium text-white shadow-sm hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2" %> +
    +
    <%= render "shared/list", collection: @reviews do |review| %> <%= render "shared/list_item", diff --git a/config/routes.rb b/config/routes.rb index 8f033d46..8413c053 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -28,6 +28,8 @@ end namespace :admin do + put "/reviews/all", to: "reviews#update_all_pending" + patch "/reviews/all", to: "reviews#update_all_pending" resources :reviews end From 5b64a650c74e453d09c7cc188eb0c36e7bb55537 Mon Sep 17 00:00:00 2001 From: Nathan Smith Date: Mon, 27 Feb 2023 17:37:33 -0800 Subject: [PATCH 3/5] wip --- .../admin/reviews_controller_test.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/integration/admin/reviews_controller_test.rb b/test/integration/admin/reviews_controller_test.rb index c50943fc..dacc2f13 100644 --- a/test/integration/admin/reviews_controller_test.rb +++ b/test/integration/admin/reviews_controller_test.rb @@ -112,4 +112,23 @@ class Admin::ReviewsControllerTest < ActionDispatch::IntegrationTest assert_equal 0, reviewer.notification_token_count end end + + describe "PATCH/PUT /admin/review/all" do + it "approves all pending reviews" do + create_current_term + reviewer = create(:user, notification_token_count: 0) + reviews = create_list(:review, 10, user: reviewer) + T.unsafe(NotifyUserAboutApprovedReviewJob).expects(:perform_later).once + T.unsafe(NotifyUserAboutRejectedReviewJob).expects(:perform_later).never + + sign_in create(:user, admin: true) + patch "/admin/reviews/all", params: { status: "approved" } + + reviewer.reload + + assert_response :found + assert_redirected_to(admin_reviews_path) + assert_equal 10, reviewer.notification_token_count + end + end end From 61669b9cc441ab9e3c8d873fea42cf6b369b7920 Mon Sep 17 00:00:00 2001 From: Nathan Smith Date: Mon, 13 Mar 2023 21:59:28 -0700 Subject: [PATCH 4/5] Restore show --- app/views/admin/reviews/show.html.erb | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/app/views/admin/reviews/show.html.erb b/app/views/admin/reviews/show.html.erb index 4ebcf677..3946f9c0 100644 --- a/app/views/admin/reviews/show.html.erb +++ b/app/views/admin/reviews/show.html.erb @@ -29,19 +29,6 @@ <% end %> -<%= render "shared/card", id: "section", title: "Section" do %> -
    -
    -
    -
    -

    <%= @section.course_title %>

    -

    Instructor: <%= @section.instructor.full_label %>

    -
    -
    -
    -
    -<% end %> - <%= render "shared/card", id: "grading-info", title: "Grading Information" do %> <%= render "shared/list", collection: @review.course_details, paginate: false do |course_detail| %>
  • From 03126e0b64ec1759c01e4180bd6919f3bd327ef4 Mon Sep 17 00:00:00 2001 From: Nathan Smith Date: Mon, 13 Mar 2023 22:16:33 -0700 Subject: [PATCH 5/5] Clean up code --- app/controllers/admin/reviews_controller.rb | 35 +++++++-------------- 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/app/controllers/admin/reviews_controller.rb b/app/controllers/admin/reviews_controller.rb index ad0c8f12..7cc7955f 100644 --- a/app/controllers/admin/reviews_controller.rb +++ b/app/controllers/admin/reviews_controller.rb @@ -70,36 +70,23 @@ class UpdateAllParams < T::Struct # PATCH/PUT /admin/reviews/all sig { void } def update_all_pending - Rails.logger.debug("NATHAN HELLO") typed_params = TypedParams[UpdateAllParams].new.extract!(params) + status = typed_params.status pending_reviews = T.let(T.unsafe(Review.all.where(status: :pending)).to_a, T::Array[Review]) pending_reviews.map do |review| - update_review(review, typed_params.status) + case status + when Review::Status::Approved + review.approve! + when Review::Status::Rejected + review.reject! + when Review::Status::Pending + review.set_pending! + else + T.absurd(status) + end end redirect_to(admin_reviews_path) end - - private - - sig { params(review: Review, status: Review::Status).returns(Review) } - def update_review(review, status) - user = T.must(review.user) - is_first_review = user.reviews.size == 1 - - if (status == Review::Status::Approved) && !review.approved? - user.add_notification_token - user.complete_referral! if is_first_review && user.referred_by - - NotifyUserAboutApprovedReviewJob.perform_later(review) - elsif status == Review::Status::Rejected - NotifyUserAboutRejectedReviewJob.perform_later(review) - end - - review.typed_status = status - review.save! - - review - end end