assettrack/definitions/models.py
candifloss 3acbb85b08 refactor: Modularize attribute class definitions
- Split `definitions/attribute.py` into separate files under `definitions/attributes/`.
- Added `__init__.py` for simplified imports.
- Improved code organization and maintainability.
2025-03-14 11:32:03 +05:30

58 lines
2.4 KiB
Python

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Enum, Integer, Float, String, Date, Column, Boolean
from config import item_attributes, sql_conf
from definitions.attributes import *
# Initialize SQLAlchemy
db = SQLAlchemy()
# Mapping of attribute types to SQLAlchemy column types
COLUMN_TYPE_MAPPING = {
textAttribute: lambda attrib: String(attrib.max_length), # Map text attributes to String columns
dateAttribute: lambda attrib: Date, # Map date attributes to Date columns
selectAttribute: lambda attrib: Enum(*attrib.options), # Map select attributes to Enum columns
intAttribute: lambda attrib: Integer, # Map integer attributes to Integer columns
floatAttribute: lambda attrib: Float, # Map float attributes to Float columns
}
def _get_column_type(attrib):
"""Helper function to get the SQLAlchemy column type for an attribute."""
if type(attrib) not in COLUMN_TYPE_MAPPING:
raise ValueError(
f"Unsupported attribute type: {type(attrib)} for attribute '{attrib.attrib_name}'. "
f"Supported types are: {list(COLUMN_TYPE_MAPPING.keys())}"
)
return COLUMN_TYPE_MAPPING[type(attrib)](attrib)
def _get_column_properties(attrib):
"""Helper function to get the properties for a column."""
return {
'primary_key': attrib.primary,
'unique': attrib.unique,
'nullable': not attrib.required,
'default': attrib.default_val
}
def create_asset_model():
"""
Dynamically creates the Asset model based on the configuration in item_attributes.
"""
# Define the table name and basic methods
attrs = {
'__tablename__': sql_conf.SQL_TABLE,
'__init__': lambda self, **kwargs: self.__dict__.update(kwargs), # Allow dynamic assignment of attributes
'__repr__': lambda self: f"<Asset {getattr(self, next(attrib.attrib_name for attrib in item_attributes if attrib.primary))}>" # Provide a readable representation of the object
}
# Define columns based on item_attributes
for attrib in item_attributes:
column_type = _get_column_type(attrib)
column_properties = _get_column_properties(attrib)
attrs[attrib.attrib_name] = Column(column_type, **column_properties)
# Create the Item class dynamically
Item = type('Item', (db.Model,), attrs)
return Item
# Create the Item model
Asset = create_asset_model()