Skip to content

Move abort results to ticket #12162

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions app/controllers/admin_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,16 @@ def clear_results_submission
@competition = competition_from_params

if @competition.results_submitted? && [email protected]_posted?
@competition.update(results_submitted_at: nil)
flash[:success] = "Results submission cleared."
ActiveRecord::Base.transaction do
@competition.update!(results_submitted_at: nil)
@competition.tickets_competition_result.update!(status: TicketsCompetitionResult.statuses[:aborted])
end
render status: :ok, json: { success: true }
else
flash[:danger] = "Could not clear the results submission. Maybe results are already posted, or there is no submission."
render status: :unprocessable_entity, json: {
error: "Could not clear the results submission. Maybe results are already posted, or there is no submission.",
}
end
redirect_to competition_admin_upload_results_edit_path
end

# The order of this array has to follow the steps in which results have to be imported.
Expand Down
15 changes: 13 additions & 2 deletions app/controllers/results_submission_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -172,13 +172,24 @@ def create

return render status: :unprocessable_entity, json: { error: "Submitted results contain errors." } if results_validator.any_errors?

return render status: :unprocessable_entity, json: { error: "There is already a ticket associated, please contact WRT to update this." } if competition.result_ticket.present?
if competition.tickets_competition_result.present? && !competition.tickets_competition_result.aborted?
return render status: :unprocessable_entity, json: {
error: "There is already a ticket associated with this, hence the results can be resubmitted only if the previous posting has been cancelled by WRT.",
}
end

CompetitionsMailer.results_submitted(competition, results_validator, message, current_user).deliver_now

ActiveRecord::Base.transaction do
competition.touch(:results_submitted_at)
TicketsCompetitionResult.create_ticket!(competition, message, current_user)
if competition.tickets_competition_result.present?
competition.tickets_competition_result.update!(
status: TicketsCompetitionResult.statuses[:submitted],
delegate_message: message,
)
else
TicketsCompetitionResult.create_ticket!(competition, message, current_user)
end
end

render status: :ok, json: { success: true }
Expand Down
1 change: 1 addition & 0 deletions app/models/tickets_competition_result.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ class TicketsCompetitionResult < ApplicationRecord

enum :status, {
submitted: "submitted",
aborted: "aborted",
locked_for_posting: "locked_for_posting",
warnings_verified: "warnings_verified",
merged_inbox_results: "merged_inbox_results",
Expand Down
9 changes: 0 additions & 9 deletions app/views/admin/new_results.html.erb
Original file line number Diff line number Diff line change
@@ -1,15 +1,6 @@
<% provide(:title, "Upload results") %>
<%= render layout: 'competitions/nav' do %>
<h1><%= yield(:title) %></h1>
<% if @competition.results_submitted? && [email protected]_posted? %>
<%= alert :info, note: true do %>
It looks like the results have been submitted by the Delegate but not posted yet.
If you want to let the Delegate submit the results again you can
<%= link_to("clear the results submission",
competition_clear_results_submission_path(@competition),
method: :post, class: "btn btn-primary") %>
<% end %>
<% end %>
<p>
Import the results JSON for this competition.
The server will check for any error compared to the declared rounds, cutoffs, and time limits.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import React from 'react';
import { Header, List, Segment } from 'semantic-ui-react';
import AbortProcess from './MiscActions/AbortProcess';

export default function MiscActions({ ticketDetails, updateStatus }) {
return (
<Segment>
<Header>Misc Actions</Header>
<List>
<List.Item>
<AbortProcess
ticketDetails={ticketDetails}
updateStatus={updateStatus}
/>
</List.Item>
</List>
</Segment>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import React, { useState } from 'react';
import { Button, Confirm, Popup } from 'semantic-ui-react';
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { ticketsCompetitionResultStatuses } from '../../../../../lib/wca-data.js.erb';
import clearResultsSubmission from '../../../api/competitionResult/clearResultsSubmission';
import Loading from '../../../../Requests/Loading';
import Errored from '../../../../Requests/Errored';

export default function AbortProcess({ ticketDetails }) {
const { ticket: { id, metadata: { status, competition_id: competitionId } } } = ticketDetails;
const [confirmAbort, setConfirmAbort] = useState();

const queryClient = useQueryClient();
const {
mutate: clearResultsSubmissionMutate,
isPending,
isError,
error,
} = useMutation({
mutationFn: clearResultsSubmission,
onSuccess: () => queryClient.setQueryData(
['ticket-details', id],
(oldTicketDetails) => ({
...oldTicketDetails,
ticket: {
...oldTicketDetails.ticket,
metadata: {
...oldTicketDetails.ticket.metadata,
status: ticketsCompetitionResultStatuses.aborted,
},
},
}),
),
});

// Result Process can be aborted before the inbox results are merged.
const canAbort = [
ticketsCompetitionResultStatuses.submitted,
ticketsCompetitionResultStatuses.locked_for_posting,
ticketsCompetitionResultStatuses.warnings_verified,
].includes(status);

if (isPending) return <Loading />;
if (isError) return <Errored error={error} />;

return (
<>
<Popup
trigger={(
<div>
{/* Button wrapped in a div because disabled button does not fire mouse events */}
<Button
disabled={!canAbort}
onClick={() => setConfirmAbort(true)}
>
Abort Process
</Button>
</div>
)}
content={canAbort ? 'Allow Delegate to resubmit results.' : 'Cannot abort at this stage.'}
/>
<Confirm
open={confirmAbort}
onCancel={() => setConfirmAbort(false)}
onConfirm={() => {
setConfirmAbort(false);
clearResultsSubmissionMutate({ competitionId });
}}
content="Are you sure you want to abort the process and allow Delegates to resubmit results?"
/>
</>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import TimelineView from './TimelineView';
import MergeInboxResults from './MergeInboxResults';
import CreateWcaIds from './CreateWcaIds';
import FinalSteps from './FinalSteps';
import MiscActions from './MiscActions';

export default function CompetitionResultActionerView({ ticketDetails, updateStatus }) {
const { ticket: { metadata: { status } } } = ticketDetails;
Expand All @@ -17,6 +18,10 @@ export default function CompetitionResultActionerView({ ticketDetails, updateSta
ticketDetails={ticketDetails}
updateStatus={updateStatus}
/>
<MiscActions
ticketDetails={ticketDetails}
updateStatus={updateStatus}
/>
</>
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { fetchJsonOrError } from '../../../../lib/requests/fetchWithAuthenticityToken';
import { clearResultsSubmissionUrl } from '../../../../lib/requests/routes.js.erb';

export default async function clearResultsSubmission({ competitionId }) {
const { data } = await fetchJsonOrError(
clearResultsSubmissionUrl(competitionId),
{ method: 'POST' },
);
return data;
}
2 changes: 2 additions & 0 deletions app/webpacker/lib/requests/routes.js.erb
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ export const adminPostingCompetitionsUrl = `<%= CGI.unescape(Rails.application.r

export const adminStartPostingUrl = `<%= CGI.unescape(Rails.application.routes.url_helpers.start_posting_path) %>`;

export const clearResultsSubmissionUrl = (competitionId) => `<%= CGI.unescape(Rails.application.routes.url_helpers.competition_clear_results_submission_path("${competitionId}")) %>`;

export const adminImportResultsUrl = (competitionId) => `<%= CGI.unescape(Rails.application.routes.url_helpers.competition_admin_import_results_path("${competitionId}")) %>`;

export const adminCheckUploadedResults = (competitionId) => `<%= CGI.unescape(Rails.application.routes.url_helpers.competition_admin_upload_results_edit_path("${competitionId}"))%>`;
Expand Down