Files

62 lines
3.1 KiB
Python

"""Модели пользователей."""
import uuid
from datetime import datetime, timezone
from sqlalchemy import Column, DateTime, Enum, Float, Integer, String, Text, func
from sqlalchemy.dialects.postgresql import UUID as PG_UUID
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.core.database import Base
class User(Base):
__tablename__ = "users"
id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
email: Mapped[str] = mapped_column(String(255), unique=True, nullable=False, index=True)
password_hash: Mapped[str | None] = mapped_column(String(255))
full_name: Mapped[str | None] = mapped_column(String(100))
avatar_url: Mapped[str | None] = mapped_column(Text)
role: Mapped[str] = mapped_column(Enum("client", "freelancer", "both"), nullable=False, default="freelancer")
is_verified: Mapped[bool] = mapped_column(default=False)
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), onupdate=func.now())
# Relationships
freelancer_profile: Mapped["FreelancerProfile | None"] = relationship(back_populates="user", uselist=False)
client_profile: Mapped["ClientProfile | None"] = relationship(back_populates="user", uselist=False)
class FreelancerProfile(Base):
__tablename__ = "freelancer_profiles"
user_id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, nullable=False)
bio: Mapped[str | None] = mapped_column(Text)
skills: Mapped[list] = mapped_column("skills", postgresql.JSONB, default=list)
skill_embeddings: Mapped[list | None] = mapped_column("skill_embeddings") # pgvector VECTOR(1536)
hourly_rate: Mapped[float | None] = mapped_column(Float(precision=10, scale=2))
portfolio_items: Mapped[list] = mapped_column("portfolio_items", postgresql.JSONB, default=list)
experience_years: Mapped[int | None] = mapped_column(Integer)
languages: Mapped[list] = mapped_column("languages", postgresql.JSONB, default=list)
rating: Mapped[float] = mapped_column(Float(precision=3, scale=2), default=5.0)
total_jobs_completed: Mapped[int] = mapped_column(Integer, default=0)
response_time_hours: Mapped[int | None] = mapped_column(Integer)
is_online: Mapped[bool] = mapped_column(default=False)
last_seen: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
user: Mapped["User"] = relationship(back_populates="freelancer_profile")
class ClientProfile(Base):
__tablename__ = "client_profiles"
user_id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, nullable=False)
company_name: Mapped[str | None] = mapped_column(String(255))
industry: Mapped[str | None] = mapped_column(String(100))
budget_range: Mapped[dict | None] = mapped_column("budget_range", postgresql.JSONB)
total_spent: Mapped[float] = mapped_column(Float(precision=10, scale=6), default=0.0)
rating: Mapped[float] = mapped_column(Float(precision=3, scale=2), default=5.0)
user: Mapped["User"] = relationship(back_populates="client_profile")