diff --git a/app/inventory/views.py b/app/inventory/views.py index 20a9a36d17064722be9d7ff04b1236778fd722da..70746c3ef29f95b4a2791bb14c269b74e046b7cb 100644 --- a/app/inventory/views.py +++ b/app/inventory/views.py @@ -146,7 +146,7 @@ def qrcodes(kind='Action'): raise utils.CSEntryError(f"Unknown model '{kind}'", status_code=422) items = db.session.query(model).order_by(model.name) images = [{'name': item.name, - 'data': utils.image_to_base64(item.image())} + 'data': item.base64_image()} for item in items] return render_template('inventory/qrcodes.html', kind=kind, images=images) diff --git a/app/models.py b/app/models.py index 2d0d7b9e1939269f3de150f725c99b168b11db0f..47888491664e9e4f33e1fecda86113a8be8987ce 100644 --- a/app/models.py +++ b/app/models.py @@ -22,7 +22,7 @@ from citext import CIText from flask import current_app from flask_login import UserMixin from wtforms import ValidationError -from .extensions import db, login_manager, ldap_manager +from .extensions import db, login_manager, ldap_manager, cache from .plugins import FlaskUserPlugin from .validators import ICS_ID_RE, HOST_NAME_RE, VLAN_NAME_RE from . import utils @@ -209,14 +209,25 @@ class QRCodeMixin: data = ':'.join(['CSE', self.__tablename__, self.name]) return qrcode.make(data, version=1, box_size=5) + @cache.memoize(timeout=0) + def base64_image(self): + """Return the QRCode image as base64 string""" + return utils.image_to_base64(self.image()) + def __str__(self): return self.name + def __repr__(self): + # The cache.memoize decorator performs a repr() on the passed in arguments + # __repr__ is used as part of the cache key and shall be a uniquely identifying string + # See https://flask-caching.readthedocs.io/en/latest/#memoization + return f'{self.__class__.__name__}(id={self.id}, name={self.name})' + def to_dict(self): return { 'id': self.id, 'name': self.name, - 'qrcode': utils.image_to_base64(self.image()), + 'qrcode': self.base64_image(), }