From a3c63e3c0fc5b2b53848cb63c1a9f92629d632f3 Mon Sep 17 00:00:00 2001 From: Mo8it Date: Tue, 17 May 2022 02:31:09 +0200 Subject: [PATCH] Add customUpdateModel --- advlabdb/adminModelViews.py | 81 ++++++++++++++++++++----------------- advlabdb/customClasses.py | 36 ++++++++++++++--- advlabdb/models.py | 11 ++++- 3 files changed, 83 insertions(+), 45 deletions(-) diff --git a/advlabdb/adminModelViews.py b/advlabdb/adminModelViews.py index 3f3d11a..a8188bd 100644 --- a/advlabdb/adminModelViews.py +++ b/advlabdb/adminModelViews.py @@ -196,46 +196,33 @@ class UserView(SecureAdminModelView): "active", ] - def create_model(self, form): - try: - password = randomPassword() - hashedPassword = hash_password(password) + _skip_session_addition_on_model_creation = True - email = form.email.data.lower() + def customCreateModel(self, form): + password = randomPassword() + hashedPassword = hash_password(password) - roles = [role.name for role in form.roles.data] + email = form.email.data.lower() - model = user_datastore.create_user( - email=email, - password=hashedPassword, - roles=roles, - first_name=form.first_name.data, - last_name=form.last_name.data, - phone_number=form.phone_number.data, - mobile_phone_number=form.mobile_phone_number.data, - building=form.building.data, - room=form.room.data, - active=form.active.data, - active_semester=form.active_semester.data, - ) + roles = [role.name for role in form.roles.data] - self.on_model_change(form, model, True) - self.session.commit() - except Exception as ex: - if not self.handle_view_exception(ex): - flash(str(ex), "error") + model = user_datastore.create_user( + email=email, + password=hashedPassword, + roles=roles, + first_name=form.first_name.data, + last_name=form.last_name.data, + phone_number=form.phone_number.data, + mobile_phone_number=form.mobile_phone_number.data, + building=form.building.data, + room=form.room.data, + active=form.active.data, + active_semester=form.active_semester.data, + ) - self.session.rollback() - else: - flash( - f"{email} registered with roles: {', '.join([role.name for role in model.roles])}.", - category="success", - ) + flashRandomPassword(password) - flashRandomPassword(password) - - self.after_model_change(form, model, True) - return model + return model def on_model_delete(self, model): if model == current_user: @@ -268,6 +255,13 @@ class UserView(SecureAdminModelView): admin = Admin(user=model) self.session.add(admin) + def after_model_change(self, form, model, is_created): + if is_created: + flash( + f"{model.email} registered with roles: {', '.join([role.name for role in model.roles])}.", + category="success", + ) + class RoleView(SecureAdminModelView): can_export = False @@ -1183,10 +1177,21 @@ class AppointmentView(SecureAdminModelView): assistant=form.assistant.data, ) - def on_model_change(self, form, model, is_created): - if None not in (form.date, form.special): # No need to check or adjust assistant for editables - if not is_created: - model.assistant = Appointment.checkAndGetAssistant(model.group_experiment, model.assistant) + def customUpdateModel(self, form, model): + if form.date is None: + # For editable + model.special = form.special.data + elif form.special is None: + # For editable + model.date = form.date.data + else: + # Not editable, full form + model.custom_update( + date=form.date.data, + special=form.special.data, + group_experiment=form.group_experiment.data, + assistant=form.assistant.data, + ) class ExperimentMarkView(SecureAdminModelView): diff --git a/advlabdb/customClasses.py b/advlabdb/customClasses.py index b3a62fa..83b9610 100644 --- a/advlabdb/customClasses.py +++ b/advlabdb/customClasses.py @@ -96,6 +96,10 @@ class CustomModelView(ModelView): refreshFiltersCache = False + # Used in the UserView because of create_user + # Should not be touched in other views + _skip_session_addition_on_model_creation = False + @expose("/") def index_view(self): if self.refreshFiltersCache: @@ -124,14 +128,18 @@ class CustomModelView(ModelView): return super().handle_view_exception(exc) - def create_model(self, form): - if not hasattr(self, "customCreateModel"): - return super().create_model(form) + def customCreateModel(self, form): + model = self.build_new_instance() + form.populate_obj(model) + return model + def create_model(self, form): try: model = self.customCreateModel(form) - self.session.add(model) + if not self._skip_session_addition_on_model_creation: + self.session.add(model) + self.on_model_change(form, model, True) self.session.commit() except Exception as ex: @@ -141,9 +149,27 @@ class CustomModelView(ModelView): self.session.rollback() else: self.after_model_change(form, model, True) - return model + def customUpdateModel(self, form, model): + form.populate_obj(model) + + def update_model(self, form, model): + try: + self.customUpdateModel(form, model) + + self.on_model_change(form, model, False) + self.session.commit() + except Exception as ex: + if not self.handle_view_exception(ex): + flash(str(ex), "error") + + self.session.rollback() + return False + else: + self.after_model_change(form, model, False) + return True + def create_form(self, obj=None): if hasattr(self, "CreateForm"): formClass = self.CreateForm diff --git a/advlabdb/models.py b/advlabdb/models.py index 35eb747..5c32e92 100644 --- a/advlabdb/models.py +++ b/advlabdb/models.py @@ -384,12 +384,12 @@ class Appointment(db.Model): semesterExperiment = groupExperiment.semester_experiment semesterExperimentAssistants = semesterExperiment.assistants - if not semesterExperimentAssistants: + if semesterExperimentAssistants is None: raise DataBaseException(f"{semesterExperiment} does not have assistants yet!") if assistant is not None: if assistant not in semesterExperimentAssistants: - raise DataBaseException(f"{assistant} not responsible for {semesterExperiment}!") + raise DataBaseException(f"{assistant} is not responsible for {semesterExperiment}!") else: if len(semesterExperimentAssistants) == 1: assistant = semesterExperimentAssistants[0] @@ -410,6 +410,13 @@ class Appointment(db.Model): assistant=assistant, ) + def custom_update(self, date, special, group_experiment, assistant=None): + self.assistant = Appointment.checkAndGetAssistant(group_experiment, assistant) + + self.date = date + self.special = special + self.group_experiment = group_experiment + def repr(self): return f"{self.date} {self.group_experiment.repr()}"