Skip to content

Commit b9125ae

Browse files
committed
Add cancel button to visits
Keep students in the queue but hidden until their visit has actually concluded. Cancelling destroys the in-progress visit and unhides them from the queue.
1 parent c40802a commit b9125ae

7 files changed

Lines changed: 84 additions & 9 deletions

File tree

api/database/idb_visits.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,18 @@ def end_visit(self, visit_id, reason):
3232
"""
3333
raise NotImplementedError()
3434

35+
@abstractmethod
36+
def cancel_visit(self, visit_id):
37+
""" Destroy this visit from the database if it's still in progress.
38+
Un-dequeue this student from the queue if they have been dequeued.
39+
40+
:param visit_id:
41+
:return:
42+
"""
43+
44+
45+
raise NotImplementedError()
46+
3547
@abstractmethod
3648
def get_in_progress_visits(self):
3749
""" Return all database entries for visits that have

api/database/relational_db/relational_db.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ def initialize(self):
3939
user_id INTEGER UNIQUE,
4040
joined TEXT DEFAULT (datetime('now', 'localtime')),
4141
priority INTEGER,
42-
enqueue_reason TEXT
42+
enqueue_reason TEXT,
43+
dequeued BOOLEAN DEFAULT false
4344
);
4445
"""
4546
)

api/database/relational_db/relational_db_queue.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def dequeue_student(self):
4444
ORDER BY priority DESC, joined
4545
"""
4646
).fetchone()
47-
cursor.execute("DELETE FROM queue WHERE user_id = ?", (user[0],))
47+
cursor.execute("UPDATE queue SET dequeued = true WHERE user_id = ?", (user[0],))
4848

4949
return {
5050
"user_id": user[0],
@@ -68,7 +68,7 @@ def dequeue_specified_student(self, student_id):
6868
if user is None:
6969
return None
7070

71-
cursor.execute("DELETE FROM queue WHERE user_id = ?", (user[0],))
71+
cursor.execute("UPDATE queue SET dequeued = true WHERE user_id = ?", (user[0],))
7272

7373
return {
7474
"user_id": user[0],
@@ -85,6 +85,7 @@ def get_queue(self):
8585
"""
8686
SELECT users.user_id, preferred_name, ubit, person_num
8787
FROM queue INNER JOIN users ON queue.user_id = users.user_id
88+
WHERE dequeued = false
8889
ORDER BY priority DESC, joined
8990
"""
9091
)
@@ -106,7 +107,7 @@ def get_queue(self):
106107
def clear_queue(self):
107108
with self.cursor() as cursor:
108109
cursor.execute(
109-
"DELETE FROM queue"
110+
"DELETE FROM queue WHERE dequeued = false"
110111
)
111112

112113
def remove_student(self, student):
@@ -116,6 +117,8 @@ def remove_student(self, student):
116117
if queue_info is None:
117118
return None
118119

120+
with self.cursor() as cursor:
121+
119122
cursor.execute("DELETE FROM queue WHERE user_id = ?", (student, ))
120123

121124
return {"user_id": queue_info[0], "joined": queue_info[1]}

api/database/relational_db/relational_db_visits.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,36 @@ def end_visit(self, visit_id, reason):
2525
now = str(datetime.datetime.now().isoformat(' ', timespec="seconds"))
2626

2727
with self.cursor() as cursor:
28+
29+
student = cursor.execute("SELECT (student_id) from visits WHERE visit_id = ?", (visit_id, )).fetchone()
30+
31+
if student is None:
32+
return
33+
34+
student = student[0]
35+
2836
cursor.execute("""
2937
UPDATE visits
3038
SET session_end = ?, session_end_reason = ?
3139
WHERE visit_id = ? AND session_end is null
3240
""", (now, reason, visit_id))
3341

42+
self.remove_student(student)
43+
44+
def cancel_visit(self, visit_id):
45+
with self.cursor() as cursor:
46+
47+
student = cursor.execute("SELECT (student_id) from visits WHERE visit_id = ?", (visit_id,)).fetchone()
48+
49+
if student is None:
50+
return
51+
52+
student = student[0]
53+
54+
cursor.execute("DELETE from visits WHERE visit_id = ?", (visit_id,))
55+
56+
cursor.execute("UPDATE queue SET dequeued = false WHERE user_id = ?", (student, ))
57+
3458

3559
def get_in_progress_visits(self):
3660
with self.cursor() as cursor:

api/queue/routes.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,27 @@ def restore_visit():
121121

122122
user_id = user["user_id"]
123123

124-
return get_tas_visit(user_id)
124+
visit = get_tas_visit(user_id)
125+
126+
if visit is None:
127+
return {"message": "You do not have an in-progress visit."}, 404
128+
129+
return visit
130+
131+
@blueprint.route("/cancel-visit", methods=["POST"])
132+
@min_level('ta')
133+
def cancel_visit():
134+
body = request.get_json()
135+
136+
visit_id = body.get("visit_id")
137+
138+
if visit_id is None:
139+
return {"message": "Malformed request"}, 400
140+
141+
db.cancel_visit(visit_id)
142+
143+
return {"message": "Canceled visit"}, 200
144+
125145

126146
@blueprint.route("/active-visits", methods=["GET"])
127147
@min_level('ta')

client/src/components/Visit.vue

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import {ref} from "vue";
44
55
const props = defineProps(["visit_info"])
6-
const emit = defineEmits(["close"])
6+
const emit = defineEmits(["open", "close"])
77
88
const dialogRef = ref<HTMLDialogElement>();
99
const showing = ref<boolean>(false);
@@ -14,6 +14,7 @@ const taNotesText = ref("");
1414
const show = () => {
1515
dialogRef.value?.showModal();
1616
showing.value = true;
17+
emit("open")
1718
}
1819
1920
const hide = () => {
@@ -68,6 +69,20 @@ const sendToBack = () => {
6869
})
6970
}
7071
72+
const cancelVisit = () => {
73+
fetch("/api/cancel-visit", {
74+
method: "POST",
75+
body: JSON.stringify({"visit_id": props.visit_info["visitID"]}),
76+
headers: {"Content-Type": "application/json"}
77+
}).then(res => {
78+
if (res.ok) {
79+
hide();
80+
}
81+
})
82+
83+
84+
}
85+
7186
7287
</script>
7388

@@ -88,8 +103,8 @@ const sendToBack = () => {
88103
<textarea ref="taNotesBox" v-model="taNotesText" id="ta-visit-notes" placeholder="How did the visit go?"
89104
required></textarea>
90105
<button @click="() => submitVisit()" id="end-visit" class="important">End Visit</button>
91-
<button @click="() => submitVisit(sendToFront)" id="end-visit-return-front">End and Return to Front</button>
92-
<button @click="() => submitVisit(sendToBack)" id="end-visit-return-back">End and Return to Back</button>
106+
<button @click="() => submitVisit(sendToBack)" id="end-visit-return-front">End and Return to Back</button>
107+
<button @click="cancelVisit" id="end-visit-cancel">Cancel Visit</button>
93108
</div>
94109

95110

client/src/pages/InstructorQueue.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ router.beforeEach((to, from, next) => {
199199

200200
<template>
201201

202-
<Visit ref="visitDialog" :visit_info="visitInfo" @close="() => { getQueue(); getInProgressVisit(); } "/>
202+
<Visit ref="visitDialog" :visit_info="visitInfo" @open="getQueue" @close="() => { getQueue(); getInProgressVisit(); } "/>
203203

204204
<ConfirmationDialog @open="resetForceEnqueueDialog" ref="forceEnqueueDialog">
205205
<label for="force-enqueue">Student Identifier (UBITName or Person Number)</label><br/>

0 commit comments

Comments
 (0)