diff --git a/app/admin/views.py b/app/admin/views.py index 465f8d64e14812c5671858a6ffa3bc31836f57a8..5f79881856098506625b71ca180959f7b3ac9d27 100644 --- a/app/admin/views.py +++ b/app/admin/views.py @@ -11,6 +11,8 @@ This module customizes the admin views. """ from flask_admin.contrib import sqla from flask_login import current_user +from ..models import Item +from .. import utils class AdminModelView(sqla.ModelView): @@ -19,9 +21,14 @@ class AdminModelView(sqla.ModelView): return current_user.is_authenticated and current_user.is_admin -# Here is an example to customize an admin view -# class ItemAdmin(AdminModelView): -# form_columns = ['serial_number', 'vendor', 'model'] -# -# def __init__(self, session): -# super().__init__(Item, session) +class ItemAdmin(AdminModelView): + + def __init__(self, session): + super().__init__(Item, session) + + def on_model_change(self, form, model, is_created): + """Update the hash""" + # The hash is supposed to be computed in the __init__ method + # of the Item class but flask-admin doesn't pass any parameter + # when creating a class - we do it here instead + model.hash = utils.compute_hash(model.serial_number) diff --git a/app/factory.py b/app/factory.py index b2218cd308bf4e8bce0412342483b424f10f71b3..c08ff352664834bfbdf73dce54c1324e4d3eddb8 100644 --- a/app/factory.py +++ b/app/factory.py @@ -13,8 +13,8 @@ import sqlalchemy as sa from flask import Flask from . import settings from .extensions import db, migrate, login_manager, ldap_manager, bootstrap, admin, mail, jwt -from .models import User, Role, Action, Vendor, Model, Location, Status, Item -from .admin.views import AdminModelView +from .models import User, Role, Action, Vendor, Model, Location, Status +from .admin.views import AdminModelView, ItemAdmin from .main.views import bp as main from .users.views import bp as users from .api.items import bp as api @@ -95,8 +95,7 @@ def create_app(): admin.add_view(AdminModelView(Model, db.session)) admin.add_view(AdminModelView(Location, db.session)) admin.add_view(AdminModelView(Status, db.session)) - admin.add_view(AdminModelView(Item, db.session)) - # admin.add_view(ItemAdmin(db.session)) + admin.add_view(ItemAdmin(db.session)) app.register_blueprint(main) app.register_blueprint(users) diff --git a/app/models.py b/app/models.py index ece41683caa94befa10b596b97e5c582802ace27..1ed29250fc0d864dde070d34959dafd820885d5b 100644 --- a/app/models.py +++ b/app/models.py @@ -179,7 +179,7 @@ class Item(db.Model): status = db.relationship('Status', back_populates='items') children = db.relationship('Item', backref=db.backref('parent', remote_side=[id])) - def __init__(self, serial_number='', name=None, vendor=None, model=None, location=None, status=None): + def __init__(self, serial_number=None, name=None, vendor=None, model=None, location=None, status=None): self.serial_number = serial_number self.name = name self.vendor = vendor diff --git a/app/utils.py b/app/utils.py index 779a6f5621409e6dd06b552d00176e40d8e59d3b..40d9f16cd527ce12114defc8d2df303f098ccf85 100644 --- a/app/utils.py +++ b/app/utils.py @@ -39,6 +39,8 @@ class InventoryError(Exception): def compute_hash(string): + if string is None: + return None md5 = hashlib.md5(string.encode()).hexdigest() return uuid.UUID(md5)