Skip to content

Commit

Permalink
Merge pull request #29 from DakshChan/origin/feature/IBS-14&15
Browse files Browse the repository at this point in the history
Origin/feature/ibs 14&15
  • Loading branch information
DomiVesalius committed Jul 23, 2023
2 parents 2b13260 + 40a1c55 commit c57bc80
Show file tree
Hide file tree
Showing 17 changed files with 1,096 additions and 244 deletions.
2 changes: 1 addition & 1 deletion backend/module/task/staff/all.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const client = require("../../../setup/db");

router.get("/", (req, res) => {
let sql_task =
"SELECT task, to_char(due_date AT TIME ZONE 'America/Toronto', 'YYYY-MM-DD HH24:MI:SS') AS due_date, weight, hidden, min_member, max_member, max_token, change_group, hide_interview, interview_group, task_group_id, starter_code_url FROM course_" +
"SELECT task, long_name, to_char(due_date AT TIME ZONE 'America/Toronto', 'YYYY-MM-DD HH24:MI:SS') AS due_date, hidden, weight, min_member, max_member, max_token, change_group, hide_interview, hide_file, interview_group, task_group_id, starter_code_url FROM course_" +
res.locals["course_id"] +
".task ORDER BY due_date, task";
client.query(sql_task, [], (err, pg_res) => {
Expand Down
8 changes: 5 additions & 3 deletions backend/module/task/staff/change.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,12 @@ router.put("/", async (req, res) => {
.json({ message: "The weight property is missing or invalid." });
return;
}
let isWeightExceeded = await helpers.weight_validate(
let isWeightExceeded = await helpers.new_weight_validate(
typeof req.body["weight"] === "string"
? parseInt(req.body["weight"])
: req.body["weight"],
res.locals["course_id"]
res.locals["course_id"],
res.locals["task"]
);

if (isWeightExceeded) {
Expand Down Expand Up @@ -123,7 +124,7 @@ router.put("/", async (req, res) => {
let sql_update =
"UPDATE course_" +
res.locals["course_id"] +
".task SET due_date = ($1), hidden = ($2), min_member = ($3), max_member = ($4) , max_token = ($5), change_group = ($6), hide_interview = ($7), interview_group = ($8), task_group_id = ($9), starter_code_url = ($10), weight = ($11) WHERE task = ($12)";
".task SET due_date = ($1), hidden = ($2), min_member = ($3), max_member = ($4) , max_token = ($5), change_group = ($6), hide_interview = ($7), interview_group = ($8), task_group_id = ($9), starter_code_url = ($10), weight = ($11), long_name = ($12) WHERE task = ($13)";
let sql_update_data = [
due_date,
req.body["hidden"],
Expand All @@ -136,6 +137,7 @@ router.put("/", async (req, res) => {
task_group_id,
starter_code_url,
req.body["weight"],
req.body["long_name"],
res.locals["task"],
];

Expand Down
28 changes: 28 additions & 0 deletions backend/module/task/staff/delete.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
const express = require("express");
const router = express.Router();
const client = require("../../../setup/db");

router.delete("/", (req, res) => {

if (res.locals["task"] === "") {
res.status(400).json({ message: "The task is missing or invalid." });
return;
}

let sql_delete_task = "DELETE FROM course_" + res.locals["course_id"] + ".task WHERE task = ($1)";

client.query(sql_delete_task, [res.locals["task"]], (err, pg_res) => {
if (err) {
res.status(404).json({ message: "Unknown error." });
console.log(err);
} else {
if (pg_res.rowCount === 0) {
res.status(400).json({ message: "The task is invalid." });
} else {
res.status(200).json({ message: "The task is deleted." });
}
}
});
})

module.exports = router;
2 changes: 1 addition & 1 deletion backend/module/task/staff/get.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ router.get("/", (req, res) => {
}

let sql_task =
"SELECT task, to_char(due_date AT TIME ZONE 'America/Toronto', 'YYYY-MM-DD HH24:MI:SS') AS due_date, weight, min_member, max_member, max_token, change_group, hide_interview, interview_group, task_group_id, starter_code_url FROM course_" +
"SELECT task, long_name, to_char(due_date AT TIME ZONE 'America/Toronto', 'YYYY-MM-DD HH24:MI:SS') AS due_date, hidden, weight, min_member, max_member, max_token, change_group, hide_interview, hide_file, interview_group, task_group_id, starter_code_url FROM course_" +
res.locals["course_id"] +
".task WHERE task = ($1)";
client.query(sql_task, [res.locals["task"]], (err, pg_res) => {
Expand Down
2 changes: 1 addition & 1 deletion backend/module/task/student/all.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const client = require("../../../setup/db");

router.get("/", (req, res) => {
let sql_task =
"SELECT task, to_char(due_date AT TIME ZONE 'America/Toronto', 'YYYY-MM-DD HH24:MI:SS') AS due_date, weight, min_member, max_member, max_token, change_group, hide_interview, interview_group, starter_code_url FROM course_" +
"SELECT task, long_name, to_char(due_date AT TIME ZONE 'America/Toronto', 'YYYY-MM-DD HH24:MI:SS') AS due_date, hidden, weight, min_member, max_member, max_token, change_group, hide_interview, hide_file, interview_group, task_group_id, starter_code_url FROM course_" +
res.locals["course_id"] +
".task WHERE hidden = 'false' ORDER BY due_date, task";
client.query(sql_task, [], (err, pg_res) => {
Expand Down
2 changes: 1 addition & 1 deletion backend/module/task/student/get.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ router.get("/", (req, res) => {
}

let sql_task =
"SELECT task, to_char(due_date AT TIME ZONE 'America/Toronto', 'YYYY-MM-DD HH24:MI:SS') AS due_date, weight, min_member, max_member, max_token, change_group, hide_interview, interview_group, starter_code_url FROM course_" +
"SELECT task, long_name, to_char(due_date AT TIME ZONE 'America/Toronto', 'YYYY-MM-DD HH24:MI:SS') AS due_date, hidden, weight, min_member, max_member, max_token, change_group, hide_interview, hide_file, interview_group, task_group_id, starter_code_url FROM course_" +
res.locals["course_id"] +
".task WHERE task = ($1) AND hidden = 'false'";
client.query(sql_task, [res.locals["task"]], (err, pg_res) => {
Expand Down
2 changes: 2 additions & 0 deletions backend/route/instructor.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const all_tasks = require("../module/task/staff/all");
const get_task = require("../module/task/staff/get");
const add_task = require("../module/task/staff/add");
const change_task = require("../module/task/staff/change");
const delete_task = require("../module/task/staff/delete");
const all_task_group = require("../module/task_group/staff/all");
const add_task_group = require("../module/task_group/staff/add");
const change_task_group = require("../module/task_group/staff/change");
Expand Down Expand Up @@ -75,6 +76,7 @@ router.use("/course/:course_id/task/all", all_tasks);
router.use("/course/:course_id/task/get", get_task);
router.use("/course/:course_id/task/add", add_task);
router.use("/course/:course_id/task/change", change_task);
router.use("/course/:course_id/task/delete", delete_task);

// Criteria
router.use("/course/:course_id/criteria/all", all_criteria);
Expand Down
20 changes: 20 additions & 0 deletions backend/utilities/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,25 @@ async function weight_validate(new_task_weight, course_id) {
return total_weight + new_task_weight > 100 ? 1 : 0;
}

/**
* Return true if accumulated weight of all tasks minus the old weight of the task being changed in course with course_id exceeds 100.
* Otherwise, return false.
*/
async function new_weight_validate(new_weight, course_id, task_name) {
let pg_res_task = await db.query(
"SELECT sum(weight) AS total_weight FROM course_" + course_id + ".task"
);
let total_weight = pg_res_task.rows[0].total_weight || 0;
let curr_weight = await get_task_weight(course_id, task_name);
if (typeof total_weight === "string") {
total_weight = parseInt(total_weight);
}
if (typeof curr_weight === "string") {
curr_weight = parseInt(curr_weight);
}
return total_weight + new_weight - curr_weight > 100 ? 1 : 0;
}

function boolean_validate(string) {
if (
string !== true &&
Expand Down Expand Up @@ -1579,6 +1598,7 @@ module.exports = {
password_validate: password_validate,
task_validate: task_validate,
weight_validate: weight_validate,
new_weight_validate: new_weight_validate,

// Utility
interview_data_filter: interview_data_filter,
Expand Down
20 changes: 11 additions & 9 deletions frontend/src/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ import StudentListPage from './components/Page/Student/StudentListPage';
import TaskGroupListPage from './components/General/TaskGroupList/TaskGroupListPage';
import SubmitMarks from './components/Page/Instructor/SubmitMarks';
import TaskGroupPage from './components/Page/Instructor/TaskGroupPage';
import AddTask from './components/Page/Instructor/AddTask';
import ModifyTask from './components/Page/Instructor/ModifyTask';
import InstructorTaskMarksPage from './components/Page/Instructor/InstructorTaskMarksPage';

function App() {
Expand All @@ -44,7 +46,6 @@ function App() {
<Route path="/login" element={<LoginPage />}></Route>
<Route path="/reset" element={<ResetPasswordPage />}></Route>
<Route path="/home" element={<Home />}></Route>

<Route path="/course/:course_id/task" element={<StudentTaskPage />}></Route>
<Route
path="/course/:course_id/student-list"
Expand All @@ -66,23 +67,19 @@ function App() {
path="/course/:course_id/task/:task/file"
element={<StudentFilePage />}
></Route>

<Route path="/ta/course/:course_id/task" element={<TaTaskPage />}></Route>
<Route
path="/ta/course/:course_id/task/:task/interview"
element={<TaInterviewPage />}
></Route>

<Route
path="/instructor/course/:course_id/task"
element={<InstructorTaskPage />}
></Route>

<Route
path="/instructor/course/:courseId/task/:taskId/groups"
element={<TaskGroupListPage />}
/>

<Route
path="/instructor/course/:course_id/impersonate"
element={<InstructorImpersonate />}
Expand All @@ -92,8 +89,15 @@ function App() {
element={<AggregatedGrades role="instructor" />}
/>
<Route
path="/instructor/course/:course_id/task/:task_id/mark"
element={<InstructorTaskMarksPage />}
path="/instructor/course/:course_id/add-task"
element={<AddTask />}
/>
<Route
path="/instructor/course/:course_id/task/:task/modify"
element={<ModifyTask />}
/>
path="/instructor/course/:course_id/task/:task_id/mark" element=
{<InstructorTaskMarksPage />}
/>
<Route
path="/instructor/course/:course_id/impersonate"
Expand All @@ -107,7 +111,6 @@ function App() {
path="/instructor/course/:courseId/submit-marks"
element={<SubmitMarks />}
></Route>

<Route path="/admin" element={<AdminPage />}></Route>
<Route path="/admin/course/:course_id/task" element={<AdminCoursePage />} />
<Route path="/admin/impersonate" element={<AdminImpersonate />} />
Expand All @@ -119,7 +122,6 @@ function App() {
path="/admin/course/:courseId/task-group"
element={<TaskGroupPage role="admin" />}
/>

<Route path="*" element={<Error />} />
</Routes>
</BrowserRouter>
Expand Down
Loading

0 comments on commit c57bc80

Please sign in to comment.