diff --git a/packages/labextension/grader_labextension/handlers/grading.py b/packages/labextension/grader_labextension/handlers/grading.py index 9a3660b0..0b8a30e4 100644 --- a/packages/labextension/grader_labextension/handlers/grading.py +++ b/packages/labextension/grader_labextension/handlers/grading.py @@ -92,7 +92,7 @@ async def put(self, lecture_id: int, assignment_id: int): class GradingAutoHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to - /lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/auto. + /lectures/{lecture_id}/assignments/{assignment_id}/grading/{submission_id}/auto. """ @authenticated @@ -124,7 +124,7 @@ async def get(self, lecture_id: int, assignment_id: int, sub_id: int): class GradingManualHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to - /lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/manual. + /lectures/{lecture_id}/assignments/{assignment_id}/grading/{submission_id}/manual. """ @authenticated @@ -215,7 +215,7 @@ async def get(self, lecture_id: int, assignment_id: int, sub_id: int): class GenerateFeedbackHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to - /lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/feedback. + /lectures/{lecture_id}/assignments/{assignment_id}/grading/{submission_id}/feedback. """ @authenticated @@ -248,7 +248,7 @@ async def get(self, lecture_id: int, assignment_id: int, sub_id: int): class PullFeedbackHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to - /lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/pull/feedback. + /lectures/{lecture_id}/assignments/{assignment_id}/grading/{submission_id}/pull/feedback. """ @authenticated diff --git a/packages/labextension/grader_labextension/handlers/submissions.py b/packages/labextension/grader_labextension/handlers/submissions.py index 30885330..ed5ef197 100644 --- a/packages/labextension/grader_labextension/handlers/submissions.py +++ b/packages/labextension/grader_labextension/handlers/submissions.py @@ -324,3 +324,31 @@ async def get(self, lecture_id: int, assignment_id: int): self.log.error(e) raise HTTPError(e.code, reason=e.message) self.write(json.dumps(response)) + + +@register_handler(path=r"api\/users\/(?P[^/]+)\/submissions\/?") +class SubmissionUserHandler(ExtensionBaseHandler): + """ + Tornado Handler class for http requests to /users/{username}/submissions. + """ + + @authenticated + async def get(self, username: str): + """Return the submissions of a specific user. + + :param username: username of the user + :type username: str + """ + + try: + response = await self.request_service.request( + method="GET", + endpoint=f"{self.service_base_url}api/users/{username}/submissions", + header=self.grader_authentication_header, + response_callback=self.set_service_headers, + ) + self.log.info(f"{response}") + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) + self.write(json.dumps(response)) diff --git a/packages/labextension/src/app/components/grader-service/assignments/assignment-card.tsx b/packages/labextension/src/app/components/grader-service/assignments/assignment-card.tsx index daa0e8fe..877129b9 100644 --- a/packages/labextension/src/app/components/grader-service/assignments/assignment-card.tsx +++ b/packages/labextension/src/app/components/grader-service/assignments/assignment-card.tsx @@ -167,7 +167,7 @@ export const AssignmentCard = (props: IAssignment) => { - { - if (!open) handleClose(); - }} - > + setDialogOpen(!dialogOpen)}> Validation Report -
+
{results.length === 0 && (

No errors found

)} - {results.map((e: ReportItem, i: number) => ( + {results.map((e: IReportItem, i: number) => (

{e.id}

{e.msg}

@@ -213,7 +204,7 @@ export const Validator = (props: ValidatorProps) => { ))}
- +
diff --git a/packages/labextension/src/app/components/notebook/manual-grading/data-widget/data-component.tsx b/packages/labextension/src/app/components/notebook/manual-grading/data-widget/data-component.tsx new file mode 100644 index 00000000..6b897a2a --- /dev/null +++ b/packages/labextension/src/app/components/notebook/manual-grading/data-widget/data-component.tsx @@ -0,0 +1,45 @@ +// Copyright (c) 2022, TU Wien +// All rights reserved. +// +// This source code is licensed under the BSD-style license found in the +// LICENSE file in the root directory of this source tree. + +import * as React from 'react'; +import { Cell } from '@jupyterlab/cells'; +import { CellModel } from '../../model'; +import { GradeBook } from '../../../../../services/gradebook.service'; + +export interface IDataComponentProps { + cell: Cell; + gradebook: GradeBook; + nbname: string; +} + +export const DataComponent = (props: IDataComponentProps) => { + const nbgraderData = CellModel.getNbgraderData(props.cell.model.metadata); + const toolData = CellModel.newToolData(nbgraderData, props.cell.model.type); + + const gradableCell = + toolData.type !== 'readonly' && + toolData.type !== 'solution' && + toolData.type !== ''; + + return ( +
+ Type: {toolData.type} + + ID: {toolData.id} + + {toolData.type === 'tests' && ( + + Autograded Points:{' '} + {props.gradebook.getAutoGradeScore(props.nbname, toolData.id)} + + )} + + {gradableCell && ( + Max Points: {toolData.points} + )} +
+ ); +}; diff --git a/packages/labextension/src/app/components/notebook/manual-grading/data-widget/data-widget.tsx b/packages/labextension/src/app/components/notebook/manual-grading/data-widget/data-widget.tsx new file mode 100644 index 00000000..0e5022ea --- /dev/null +++ b/packages/labextension/src/app/components/notebook/manual-grading/data-widget/data-widget.tsx @@ -0,0 +1,38 @@ +// Copyright (c) 2022, TU Wien +// All rights reserved. +// +// This source code is licensed under the BSD-style license found in the +// LICENSE file in the root directory of this source tree. + +import { ReactWidget } from '@jupyterlab/apputils'; +import * as React from 'react'; +import { Cell } from '@jupyterlab/cells'; + +import { ReactElement, JSXElementConstructor } from 'react'; +import { GradeBook } from '../../../../../services/gradebook.service'; +import { DataComponent } from './data-component'; + +export class DataWidget extends ReactWidget { + public cell: Cell; + public gradebook: GradeBook; + public nbname: string; + + constructor(cell: Cell, gradebook: GradeBook, nbname: string) { + super(); + this.cell = cell; + this.gradebook = gradebook; + this.nbname = nbname; + } + + protected render(): + | ReactElement>[] + | ReactElement> { + return ( + + ); + } +} diff --git a/packages/labextension/src/app/components/notebook/manual-grading/grade-widget/comment-component.tsx b/packages/labextension/src/app/components/notebook/manual-grading/grade-widget/comment-component.tsx new file mode 100644 index 00000000..bae14167 --- /dev/null +++ b/packages/labextension/src/app/components/notebook/manual-grading/grade-widget/comment-component.tsx @@ -0,0 +1,44 @@ +// Copyright (c) 2022, TU Wien +// All rights reserved. +// +// This source code is licensed under the BSD-style license found in the +// LICENSE file in the root directory of this source tree. + +import * as React from 'react'; +import { NbgraderData, ToolData } from '../../model'; +import { GradeBook } from '../../../../../services/gradebook.service'; +import { INotebookModel } from '@jupyterlab/notebook'; + +export interface ICommentComponentProps { + model: INotebookModel; + gradebook: GradeBook; + nbname: string; + nbgraderData: NbgraderData; + toolData: ToolData; +} + +export const CommentComponent = (props: ICommentComponentProps) => { + const [comment, setComment] = React.useState( + props.gradebook.getComment(props.nbname, props.toolData.id) + ); + + return ( + +