kamau1's picture
Fix circular import by registering TicketStatusHistory before Ticket in models init to resolve SQLAlchemy mapper errors.
0f127a7
"""
Models Package - SQLAlchemy ORM Models
Import order is CRITICAL to avoid circular dependencies and mapper initialization errors.
Base models and independent models first, then dependent models.
IMPORTANT:
- CustomerCommunication MUST be imported BEFORE Customer to resolve the relationship
- Models must be imported in dependency order to avoid mapper initialization failures
"""
# Base and Enums (no dependencies)
from app.models.base import BaseModel
from app.models.enums import *
# Core independent models (minimal dependencies)
from app.models.user import User
from app.models.notification import Notification, NotificationChannel, NotificationStatus
from app.models.audit_log import AuditLog
from app.models.document import Document
# Organization models
from app.models.client import Client
from app.models.contractor import Contractor
# Project structure models (must come before projects)
from app.models.project import ProjectRegion, ProjectRole, ProjectSubcontractor, Project
from app.models.project_team import ProjectTeam
# Customer and related (CustomerCommunication MUST come before Customer!)
from app.models.customer_communication import CustomerCommunication
from app.models.customer import Customer
# Sales and subscriptions
from app.models.sales_order import SalesOrder
from app.models.subscription import Subscription
# Tasks
from app.models.task import Task
# Tickets and related (import in dependency order)
from app.models.ticket_comment import TicketComment
from app.models.ticket_expense import TicketExpense
from app.models.ticket_image import TicketImage
from app.models.ticket_progress_report import TicketProgressReport
from app.models.ticket_incident_report import TicketIncidentReport
from app.models.ticket_status_history import TicketStatusHistory
from app.models.ticket import Ticket
from app.models.ticket_assignment import TicketAssignment
# Incidents
from app.models.incident import Incident
# Finance models
from app.models.contractor_invoice import ContractorInvoice
from app.models.timesheet import Timesheet
from app.models.finance import ProjectFinance, PaymentLog
# User-related association tables
from app.models.user_payroll import UserPayroll
from app.models.user_financial_account import UserFinancialAccount
from app.models.user_document_link import UserDocumentLink
from app.models.user_asset_assignment import UserAssetAssignment
# Inventory models
from app.models.inventory import ProjectInventory, ProjectInventoryDistribution, InventoryAssignment
# Auth models
from app.models.invitation import UserInvitation
__all__ = [
# Base
"BaseModel",
# Users & Auth
"User",
"UserInvitation",
"UserPayroll",
"UserFinancialAccount",
"UserDocumentLink",
"UserAssetAssignment",
# Organizations
"Client",
"Contractor",
# Customers
"Customer",
"CustomerCommunication",
# Projects & Structure
"Project",
"ProjectRegion",
"ProjectRole",
"ProjectSubcontractor",
"ProjectTeam",
# Sales & Subscriptions
"SalesOrder",
"Subscription",
# Tasks
"Task",
# Tickets
"Ticket",
"TicketAssignment",
"TicketComment",
"TicketExpense",
"TicketImage",
"TicketProgressReport",
"TicketIncidentReport",
"TicketStatusHistory",
# Incidents
"Incident",
# Finance
"ContractorInvoice",
"Timesheet",
"ProjectFinance",
"PaymentLog",
# Inventory
"ProjectInventory",
"ProjectInventoryDistribution",
"InventoryAssignment",
# System
"Notification",
"NotificationChannel",
"NotificationStatus",
"AuditLog",
"Document",
]