feat: T03+T04 backend - FastAPI, DB models, Rentman integration, admin auth, APScheduler
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
"""Import all models for Alembic and Base metadata."""
|
||||
from app.models.equipment import EquipmentCache
|
||||
from app.models.rental_request import RentalRequest, RentalRequestItem
|
||||
from app.models.contact import Contact
|
||||
from app.models.admin_user import AdminUser
|
||||
from app.models.sync_log import SyncLog
|
||||
|
||||
__all__ = ["EquipmentCache", "RentalRequest", "RentalRequestItem", "Contact", "AdminUser", "SyncLog"]
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,12 @@
|
||||
"""Admin user model."""
|
||||
from sqlalchemy import Column, Integer, String, TIMESTAMP, func
|
||||
from app.database import Base
|
||||
|
||||
|
||||
class AdminUser(Base):
|
||||
__tablename__ = "admin_users"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
username = Column(String(64), unique=True, nullable=False)
|
||||
password_hash = Column(String(255), nullable=False)
|
||||
created_at = Column(TIMESTAMP, server_default=func.now())
|
||||
@@ -0,0 +1,16 @@
|
||||
"""Contact form submission model."""
|
||||
from sqlalchemy import Column, Integer, String, Text, Boolean, TIMESTAMP, func
|
||||
from app.database import Base
|
||||
|
||||
|
||||
class Contact(Base):
|
||||
__tablename__ = "contacts"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
name = Column(String(255), nullable=False)
|
||||
email = Column(String(255), nullable=False)
|
||||
phone = Column(String(64))
|
||||
message = Column(Text, nullable=False)
|
||||
privacy_consent = Column(Boolean, nullable=False)
|
||||
email_sent = Column(Boolean, default=False)
|
||||
created_at = Column(TIMESTAMP, server_default=func.now())
|
||||
@@ -0,0 +1,28 @@
|
||||
"""Equipment cache model (imported from Rentman)."""
|
||||
from sqlalchemy import Column, Integer, String, Text, Boolean, DECIMAL, JSON, Index, TIMESTAMP, func
|
||||
from app.database import Base
|
||||
|
||||
|
||||
class EquipmentCache(Base):
|
||||
__tablename__ = "equipment_cache"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
rentman_id = Column(String(64), unique=True, nullable=False)
|
||||
name = Column(String(255), nullable=False)
|
||||
number = Column(String(64))
|
||||
category = Column(String(128))
|
||||
subcategory = Column(String(128))
|
||||
description = Column(Text)
|
||||
specifications = Column(JSON)
|
||||
images = Column(JSON)
|
||||
rental_price = Column(DECIMAL(10, 2))
|
||||
brand = Column(String(128))
|
||||
available = Column(Boolean, default=True)
|
||||
created_at = Column(TIMESTAMP, server_default=func.now())
|
||||
updated_at = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now())
|
||||
|
||||
__table_args__ = (
|
||||
Index("idx_equipment_category", "category"),
|
||||
Index("idx_equipment_name", "name"),
|
||||
Index("idx_equipment_number", "number"),
|
||||
)
|
||||
@@ -0,0 +1,50 @@
|
||||
"""Rental request and rental request item models."""
|
||||
from sqlalchemy import Column, Integer, String, Text, Date, TIMESTAMP, ForeignKey, func, Index
|
||||
from sqlalchemy.orm import relationship
|
||||
from app.database import Base
|
||||
|
||||
|
||||
class RentalRequest(Base):
|
||||
__tablename__ = "rental_requests"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
reference_number = Column(String(32), unique=True, nullable=False)
|
||||
event_name = Column(String(255), nullable=False)
|
||||
date_start = Column(Date, nullable=False)
|
||||
date_end = Column(Date, nullable=False)
|
||||
location = Column(String(255))
|
||||
person_count = Column(Integer)
|
||||
contact_name = Column(String(255), nullable=False)
|
||||
contact_company = Column(String(255))
|
||||
contact_email = Column(String(255), nullable=False)
|
||||
contact_phone = Column(String(64))
|
||||
contact_street = Column(String(255))
|
||||
contact_postalcode = Column(String(16))
|
||||
contact_city = Column(String(128))
|
||||
message = Column(Text)
|
||||
status = Column(String(32), default="pending")
|
||||
rentman_request_id = Column(String(64))
|
||||
rentman_sync_status = Column(String(32), default="pending")
|
||||
rentman_sync_error = Column(Text)
|
||||
created_at = Column(TIMESTAMP, server_default=func.now())
|
||||
|
||||
items = relationship("RentalRequestItem", back_populates="rental_request", cascade="all, delete-orphan")
|
||||
|
||||
__table_args__ = (Index("idx_rental_status", "status"),)
|
||||
|
||||
|
||||
class RentalRequestItem(Base):
|
||||
__tablename__ = "rental_request_items"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
rental_request_id = Column(Integer, ForeignKey("rental_requests.id", ondelete="CASCADE"), nullable=False)
|
||||
equipment_id = Column(Integer, ForeignKey("equipment_cache.id"))
|
||||
equipment_name = Column(String(255))
|
||||
rentman_equipment_id = Column(String(64))
|
||||
quantity = Column(Integer, nullable=False, default=1)
|
||||
unit_price = Column(String(20))
|
||||
rentman_sync_status = Column(String(32), default="pending")
|
||||
|
||||
rental_request = relationship("RentalRequest", back_populates="items")
|
||||
|
||||
__table_args__ = (Index("idx_rental_items_request", "rental_request_id"),)
|
||||
@@ -0,0 +1,18 @@
|
||||
"""Sync log model for equipment import tracking."""
|
||||
from sqlalchemy import Column, Integer, String, Text, TIMESTAMP, func, Index
|
||||
from app.database import Base
|
||||
|
||||
|
||||
class SyncLog(Base):
|
||||
__tablename__ = "sync_log"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
sync_type = Column(String(32), nullable=False, default="equipment")
|
||||
status = Column(String(32), nullable=False)
|
||||
items_processed = Column(Integer, default=0)
|
||||
items_failed = Column(Integer, default=0)
|
||||
error_message = Column(Text)
|
||||
started_at = Column(TIMESTAMP, server_default=func.now())
|
||||
completed_at = Column(TIMESTAMP)
|
||||
|
||||
__table_args__ = (Index("idx_sync_log_started", "started_at"),)
|
||||
Reference in New Issue
Block a user