diff --git a/DB.drawio b/DB.drawio index 32bac07..4cdcf8c 100644 --- a/DB.drawio +++ b/DB.drawio @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/advlabdb/adminModelViews.py b/advlabdb/adminModelViews.py index c05578e..424e982 100644 --- a/advlabdb/adminModelViews.py +++ b/advlabdb/adminModelViews.py @@ -38,6 +38,7 @@ from advlabdb.models import ( User, ) from advlabdb.utils import ( + flashRandomPassword, initActiveSemesterMenuLinks, randomPassword, setUserActiveSemester, @@ -72,8 +73,8 @@ class UserView(SecureAdminModelView): last_name = StringField("Last Name", validators=[DataRequired()]) phone_number = StringField("Phone Number") mobile_phone_number = StringField("Mobile Phone Number") - room = StringField("Room") building = StringField("Building") + room = StringField("Room") semester_experiments = QuerySelectMultipleField( "Semester Experiments", @@ -114,8 +115,8 @@ class UserView(SecureAdminModelView): column_details_list = column_list + [ "phone_number", "mobile_phone_number", - "room", "building", + "room", "create_datetime", "update_datetime", ] @@ -136,9 +137,6 @@ class UserView(SecureAdminModelView): form = self.CreateForm return form(get_form_data(), obj=obj) - def flashPassword(password): - flash(f"Random password: {password}", category="warning") - def create_model(self, form): try: password = randomPassword() @@ -156,8 +154,8 @@ class UserView(SecureAdminModelView): last_name=form.last_name.data, phone_number=form.phone_number.data, mobile_phone_number=form.mobile_phone_number.data, - room=form.room.data, building=form.building.data, + room=form.room.data, active=form.active.data, active_semester=form.active_semester.data, ) @@ -174,7 +172,7 @@ class UserView(SecureAdminModelView): category="success", ) - UserView.flashPassword(password) + flashRandomPassword(password) self.after_model_change(form, model, True) return model @@ -193,12 +191,11 @@ class UserView(SecureAdminModelView): if hasattr(form, "generate_new_password") and form.generate_new_password.data: password = randomPassword() - UserView.flashPassword(password) admin_change_password( model, password, notify=False - ) # Password is automatically hashed with this method + ) # Password is automatically hashed with this function if model.has_role("assistant") and not model.assistant: semester_experiments = form.semester_experiments.data if form.semester_experiments else [] @@ -522,8 +519,8 @@ class ExperimentView(SecureAdminModelView): column_details_list = column_list + [ "description", "wiki_link", - "room", "building", + "room", "responsibility", "duration_in_days", "oral_weighting", @@ -614,8 +611,8 @@ class AssistantView(SecureAdminModelView): column_details_list = column_list + [ "user.phone_number", "user.mobile_phone_number", - "user.room", "user.building", + "user.room", "appointments", "experiment_marks", ] diff --git a/advlabdb/assistantModelViews.py b/advlabdb/assistantModelViews.py index e4fb142..52cca84 100644 --- a/advlabdb/assistantModelViews.py +++ b/advlabdb/assistantModelViews.py @@ -1,7 +1,7 @@ from flask import flash from flask_admin import expose from flask_admin.contrib.sqla.fields import QuerySelectField, QuerySelectMultipleField -from flask_security import current_user +from flask_security import admin_change_password, current_user from sqlalchemy import and_ from wtforms import BooleanField, Form, RadioField, SelectField, StringField from wtforms.fields import DateField @@ -26,7 +26,12 @@ from advlabdb.models import ( Student, User, ) -from advlabdb.utils import initActiveSemesterMenuLinks, userActiveSemester +from advlabdb.utils import ( + flashRandomPassword, + initActiveSemesterMenuLinks, + randomPassword, + userActiveSemester, +) class AssistantAppointmentView(SecureAssistantModelView): @@ -127,30 +132,44 @@ class AssistantExperimentMarkView(SecureAssistantModelView): class AssistantUserView(SecureAssistantModelView): + class EditForm(Form): + phone_number = StringField("Phone Number") + mobile_phone_number = StringField("Mobile Phone Number") + + building = StringField("Building") + room = StringField("Room") + + generate_new_password = BooleanField("Generate new random password", default=False) + + form = EditForm + + can_edit = True + column_display_actions = True + column_sortable_list = [] column_list = [ "email", "phone_number", "mobile_phone_number", - "room", "building", + "room", "assistant.semester_experiments", ] column_labels = { "assistant.semester_experiments": "Semester Experiments", } - column_editable_list = [ - "phone_number", - "mobile_phone_number", - "room", - "building", - ] - def queryFilter(self): return User.id == current_user.id + def on_model_change(self, form, model, is_created): + if form.generate_new_password.data: + password = randomPassword() + flashRandomPassword(password) + + admin_change_password(model, password, notify=False) # Password is automatically hashed with this function + class AssistantDocsView(SecureAssistantBaseView): @expose("/", methods=["GET"]) diff --git a/advlabdb/models.py b/advlabdb/models.py index 4a56f6f..2af0867 100644 --- a/advlabdb/models.py +++ b/advlabdb/models.py @@ -234,8 +234,8 @@ class Experiment(db.Model): title = db.Column(db.String(200), nullable=False) description = db.Column(db.Text, nullable=True) wiki_link = db.Column(db.String(300), nullable=True) - room = db.Column(db.String(100), nullable=False) building = db.Column(db.String(100), nullable=False) + room = db.Column(db.String(100), nullable=False) responsibility = db.Column(db.String(200), nullable=True) duration_in_days = db.Column(db.Integer, db.CheckConstraint("duration_in_days > -1"), nullable=False) active = db.Column(db.Boolean, default=True, nullable=False) @@ -522,8 +522,8 @@ class User(db.Model, FsUserMixin): last_name = db.Column(db.String(100), nullable=False) phone_number = db.Column(db.String(50), nullable=True) mobile_phone_number = db.Column(db.String(50), nullable=True) - room = db.Column(db.String(100), nullable=True) building = db.Column(db.String(100), nullable=True) + room = db.Column(db.String(100), nullable=True) active_semester_id = db.Column(db.Integer, db.ForeignKey("semester.id"), nullable=True) diff --git a/advlabdb/utils.py b/advlabdb/utils.py index 63c50d0..4918485 100644 --- a/advlabdb/utils.py +++ b/advlabdb/utils.py @@ -13,6 +13,10 @@ def randomPassword(): return "".join(choice(ascii_letters + digits) for i in range(12)) +def flashRandomPassword(password): + flash(f"Random password: {password}", category="warning") + + def userActiveSemester(flashWarning=False): lastSemesterId = ( Semester.query.order_by(Semester.year.desc()).order_by(Semester.label.desc()).first().id