diff --git a/definitions/models.py b/definitions/models.py index 099522d..0272c88 100644 --- a/definitions/models.py +++ b/definitions/models.py @@ -1,24 +1,44 @@ from flask_sqlalchemy import SQLAlchemy +from config import item_attributes # Import the configuration +from sqlalchemy import Enum, Integer, String, Date, Column db = SQLAlchemy() -class Asset(db.Model): - __tablename__ = "asset_test" # Table in MySQL +# Dynamically create the Asset model +def create_asset_model(): + """ + Dynamically creates the Asset model based on the configuration in item_attributes. + """ + attrs = { + '__tablename__': 'asset_test', # Table name + '__init__': lambda self, **kwargs: self.__dict__.update(kwargs), # Constructor + '__repr__': lambda self: f"" # Representation + } - assettag = db.Column(db.String(50), primary_key=True) # Primary key - hostname = db.Column(db.String(50)) # VARCHAR(50) - warrantyfrom = db.Column(db.Date) # DATE - status = db.Column(db.Enum('Active', 'Inactive')) # ENUM('Active', 'Inactive') - #staffnum = db.Column(db.Integer, unsigned=True) # INT(8) UNSIGNED - staffnum = db.Column(db.Integer) # INT(8) UNSIGNED + for attrib, config in item_attributes.items(): + # Determine the column type based on the configuration + if config.html_input_type == "text": + column_type = String(50) + elif config.html_input_type == "date": + column_type = Date + elif config.html_input_type == "select": + column_type = Enum(*config.options) + elif config.html_input_type == "number": + column_type = Integer - def __init__(self, assettag, hostname=None, warrantyfrom=None, status=None, staffnum=None): - self.assettag = assettag - self.hostname = hostname - self.warrantyfrom = warrantyfrom - self.status = status - self.staffnum = staffnum + # Define the column with additional properties + attrs[attrib] = Column( + column_type, + primary_key=config.primary, + unique=config.unique, + nullable=not config.required, + default=config.default_val, + comment=config.comment + ) - def __repr__(self): - return f"" + # Create the Asset class dynamically + Asset = type('Asset', (db.Model,), attrs) + return Asset +# Create the Asset model +Asset = create_asset_model() \ No newline at end of file diff --git a/routes/create.py b/routes/create.py index 92408bc..dfeadff 100644 --- a/routes/create.py +++ b/routes/create.py @@ -1,6 +1,7 @@ from flask import Blueprint, request, render_template, redirect from definitions.models import Asset, db from config import item_attributes +from sqlalchemy import exc # Import exc for database exceptions addasset_bp = Blueprint('addasset', __name__)