1
0
Fork 0
mirror of https://codeberg.org/Mo8it/AdvLabDB.git synced 2024-09-19 18:31:16 +00:00

Add customUpdateModel

This commit is contained in:
Mo 2022-05-17 02:31:09 +02:00
parent 6c268c3bb5
commit a3c63e3c0f
3 changed files with 83 additions and 45 deletions

View file

@ -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):

View file

@ -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

View file

@ -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()}"