44 lines
1.6 KiB
Python
44 lines
1.6 KiB
Python
from flask_sqlalchemy import SQLAlchemy
|
|
from config import item_attributes # Import the configuration
|
|
from sqlalchemy import Enum, Integer, String, Date, Column
|
|
|
|
db = SQLAlchemy()
|
|
|
|
# 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"<Asset {getattr(self, next(attrib for attrib, config in item_attributes.items() if config.primary))}>" # Representation
|
|
}
|
|
|
|
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
|
|
|
|
# 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
|
|
)
|
|
|
|
# Create the Asset class dynamically
|
|
Asset = type('Asset', (db.Model,), attrs)
|
|
return Asset
|
|
|
|
# Create the Asset model
|
|
Asset = create_asset_model() |