diff --git a/oh_queue/static/js/components/admin_appointments_manager.js b/oh_queue/static/js/components/admin_appointments_manager.js index cd3001f..382cc3b 100644 --- a/oh_queue/static/js/components/admin_appointments_manager.js +++ b/oh_queue/static/js/components/admin_appointments_manager.js @@ -61,8 +61,11 @@ function AdminAppointmentsManager({ state }) {

- How many appointments should a student have be pending simultaneously? + How many appointments should a student have be pending simultaneously?

+ (by + + ) { $('[data-toggle="tooltip"]').tooltip() historyRef.current.scrollTop = historyRef.current.scrollHeight; @@ -43,30 +45,64 @@ function ChatBox({ currentUser, socket, id, mode }) { if (message.mode !== mode || message.id !== id) { return; } - setMessages(messages.concat([[message.sender, message.content]])); + setMessages(messages.concat([[ + message.sender, + message.content, + message.time + ]])); }); return () => socket.removeAllListeners("chat_message"); }, [messages]); - const body = messages.map(([sender, message], i) => { + const body = messages.map(([sender, message, time], i) => { + function formatTitle(name, time) { + if (name === undefined) { + return time + } else if (time === undefined) { + return name + } + return name + ' | ' + time; + } + if (sender.id === currentUser.id) { return (
-
{message}
+
+ {message} +
) } else if (messages[i + 1] && sender.id === messages[i + 1][0].id) { return (
{sender.shortName[0]}
-
{message}
+
+ {message} +
) } else { return (
{sender.shortName[0]}
-
{message}
+
+ {message} +
) } diff --git a/oh_queue/views.py b/oh_queue/views.py index 4dc92e7..4fa577c 100644 --- a/oh_queue/views.py +++ b/oh_queue/views.py @@ -319,6 +319,12 @@ def init_config(): public=True, course=get_course(), )) + db.session.add(ConfigEntry( + key='appointment_or_minutes', + value='false', + public=True, + course=get_course(), + )) db.session.add(ConfigEntry( key='show_okpy_backups', value='false', @@ -922,6 +928,7 @@ def assign_appointment(data): daily_threshold = int(ConfigEntry.query.filter_by(key="daily_appointment_limit", course=get_course()).one().value) weekly_threshold = int(ConfigEntry.query.filter_by(key="weekly_appointment_limit", course=get_course()).one().value) pending_threshold = int(ConfigEntry.query.filter_by(key="simul_appointment_limit", course=get_course()).one().value) + pending_metric= ConfigEntry.query.filter_by(key="appointment_or_minutes", course=get_course()).one().value start = appointment.start_time.replace(hour=0, minute=0, second=0, microsecond=0) week_start = start - datetime.timedelta(days=appointment.start_time.weekday()) @@ -940,13 +947,21 @@ def assign_appointment(data): ).count() if num_today >= daily_threshold: return socket_error("You have already signed up for {} OH slots for the same day".format(daily_threshold)) - num_pending = AppointmentSignup.query.join(AppointmentSignup.appointment).filter( Appointment.status == AppointmentStatus.pending, AppointmentSignup.user_id == current_user.id, - ).count() - if num_pending >= pending_threshold: - return socket_error("You have already signed up for {} OH slots that have not yet occurred.".format(pending_threshold)) + ) + if pending_metric != 'false': + start = appointment.duration + num_pend = [appt.appointment.duration for appt in list(num_pending)] + threshold = datetime.timedelta(minutes=pending_threshold) + for item in num_pend: + start += item + if start > threshold: + return socket_error("You cannot sign up for more than {} minutes of OH that have not yet occurred.".format(pending_threshold)) + else: + if num_pending.count() >= pending_threshold: + return socket_error("You have already signed up for {} OH slots that have not yet occurred.".format(pending_threshold)) old_signup = AppointmentSignup.query.filter_by( appointment_id=data["appointment_id"], @@ -1140,6 +1155,8 @@ def send_chat_message(data): event_id = data["id"] data["sender"] = user_json(current_user) + message_time = get_current_time().strftime("%a %-I:%M%p") + data["time"] = message_time if mode == "appointment": appointment = Appointment.query.filter_by(course=get_course(), id=event_id).one()