diff --git a/api/anubis/models/__init__.py b/api/anubis/models/__init__.py index a2856c44..2e16f171 100644 --- a/api/anubis/models/__init__.py +++ b/api/anubis/models/__init__.py @@ -2,20 +2,18 @@ import copy import gzip import os -import enum from datetime import datetime, timedelta from flask_sqlalchemy import SQLAlchemy from sqlalchemy.ext.hybrid import hybrid_property -from sqlalchemy.orm import scoped_session, deferred, undefer, relationship, InstrumentedAttribute +from sqlalchemy.orm import scoped_session, deferred, relationship, InstrumentedAttribute from sqlalchemy.sql.schema import Column, ForeignKey from anubis.constants import THEIA_DEFAULT_OPTIONS, DB_COLLATION, DB_CHARSET +from anubis.models.enum import UserSource from anubis.models.id import default_id_length, default_id from anubis.models.sqltypes import String, Text, DateTime, Boolean, JSON, Integer, Enum from anubis.utils.data import human_readable_timedelta -from anubis.models.enum import UserSource - db = SQLAlchemy(session_options={"autoflush": False}) db.session: scoped_session @@ -91,6 +89,7 @@ def data(self): "release_email_enabled": self.release_email_enabled, "created": str(self.created), "source": self.source.name, + "disabled": self.disabled, **get_user_permissions(self), } diff --git a/api/anubis/views/super/students.py b/api/anubis/views/super/students.py index beaff631..44869113 100644 --- a/api/anubis/views/super/students.py +++ b/api/anubis/views/super/students.py @@ -61,6 +61,41 @@ def super_students_toggle_superuser(id: str): return success_response({"status": f"{other.name} is no longer a superuser", "variant": "success"}) +@students_.route("/toggle-disabled/") +@require_superuser() +@json_response +def super_students_toggle_disabled(id: str): + """ + Toggle disable a user. + + :param id: + :return: + """ + + # Get the other user + other: User = User.query.filter(User.id == id).first() + + # If the other user was not found, then stop + req_assert(other is not None, message="user does not exist") + + # Assert that user being disabled is not a superuser + req_assert(not other.is_superuser, message="Cannot disable super user") + + # Toggle the superuser field + other.disabled = not other.disabled + + # Commit the change + db.session.commit() + + # Pass back the status based on if the other is now disabled + if other.disabled: + return success_response({"status": f"{other.name} is now disabled", "variant": "warning"}) + + # Pass back the status based on if the other user is now no disabled + else: + return success_response({"status": f"{other.name} is now enabled", "variant": "success"}) + + @students_.route("/toggle-anubis_developer/") @require_superuser() @json_response diff --git a/web/src/pages/core/super/Users.jsx b/web/src/pages/core/super/Users.jsx index ef529000..ab988a79 100644 --- a/web/src/pages/core/super/Users.jsx +++ b/web/src/pages/core/super/Users.jsx @@ -55,7 +55,11 @@ const toggleField = (field) => (id, {setStudents, setEdits}, enqueueSnackbar) => setStudents((students) => { for (const student of students) { if (student.id === id) { - student['is_' + field] = !student['is_' + field]; + let field_label = field; + if (!(field_label in student)) { + field_label = 'is_' + field; + } + student[field_label] = !student[field_label]; } } return students; @@ -67,6 +71,7 @@ const toggleField = (field) => (id, {setStudents, setEdits}, enqueueSnackbar) => const toggleSuperuser = toggleField('superuser'); const toggleDeveloper = toggleField('anubis_developer'); +const toggleDisabled = toggleField('disabled'); const useColumns = (pageState, enqueueSnackbar) => () => ([ { @@ -112,6 +117,20 @@ const useColumns = (pageState, enqueueSnackbar) => () => ([ ), }, + { + field: 'disabled', + headerName: 'Disabled', + renderCell: (params) => ( + + + + ), + width: 150, + }, { field: 'is_anubis_developer', headerName: 'Developer',