35 lines
1.7 KiB
Python
35 lines
1.7 KiB
Python
|
|
import uuid
|
||
|
|
from datetime import datetime
|
||
|
|
from typing import Optional
|
||
|
|
|
||
|
|
from sqlalchemy import DateTime, ForeignKey, JSON, String, Text, func
|
||
|
|
from sqlalchemy import Uuid
|
||
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
||
|
|
|
||
|
|
from app.models.base import Base, UUIDMixin, TimestampMixin
|
||
|
|
|
||
|
|
|
||
|
|
class ContactLead(Base, UUIDMixin, TimestampMixin):
|
||
|
|
__tablename__ = "contact_leads"
|
||
|
|
|
||
|
|
full_name: Mapped[str] = mapped_column(String(255), nullable=False)
|
||
|
|
email: Mapped[str] = mapped_column(String(255), nullable=False, index=True)
|
||
|
|
phone: Mapped[Optional[str]] = mapped_column(String(50), nullable=True)
|
||
|
|
requested_services: Mapped[Optional[str]] = mapped_column(String(255), nullable=True)
|
||
|
|
pet_name: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
|
||
|
|
pet_breed: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
|
||
|
|
suburb: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
|
||
|
|
service_area_status: Mapped[Optional[str]] = mapped_column(String(32), nullable=True)
|
||
|
|
message: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
||
|
|
source: Mapped[str] = mapped_column(String(50), nullable=False, default="contact_form")
|
||
|
|
status: Mapped[str] = mapped_column(String(32), nullable=False, default="invite", index=True)
|
||
|
|
notes: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
||
|
|
metadata_json: Mapped[Optional[dict]] = mapped_column("metadata", JSON, nullable=True)
|
||
|
|
invited_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
|
||
|
|
invited_member_id: Mapped[Optional[uuid.UUID]] = mapped_column(
|
||
|
|
Uuid(as_uuid=True),
|
||
|
|
ForeignKey("members.id", ondelete="SET NULL"),
|
||
|
|
nullable=True,
|
||
|
|
index=True,
|
||
|
|
)
|