admin_szolgáltatók_
This commit is contained in:
@@ -48,6 +48,13 @@ class PointsLedger(Base):
|
||||
source_type: Mapped[Optional[str]] = mapped_column(String(50), nullable=True)
|
||||
source_id: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
|
||||
|
||||
# SNAPSHOT MECHANIZMUS (2026-06-30, #369)
|
||||
# Tárolja a kiosztáskor érvényes point_rules adatokat, hogy a pontértékek
|
||||
# megőrződjenek a ledger-ben, még akkor is, ha a point_rules táblában
|
||||
# később módosítják a pontértékeket.
|
||||
# Tartalma: {"action_key": str, "point_rule_id": int, "points_at_time": int, "multiplier": float}
|
||||
points_snapshot: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True)
|
||||
|
||||
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
|
||||
|
||||
user: Mapped["User"] = relationship("User")
|
||||
|
||||
@@ -30,6 +30,7 @@ from .social import (
|
||||
ServiceReview,
|
||||
ModerationStatus,
|
||||
SourceType,
|
||||
ProviderValidation,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
@@ -58,4 +59,5 @@ __all__ = [
|
||||
"ServiceReview",
|
||||
"ModerationStatus",
|
||||
"SourceType",
|
||||
"ProviderValidation",
|
||||
]
|
||||
@@ -5,7 +5,7 @@ from datetime import datetime
|
||||
from typing import Optional, List
|
||||
from sqlalchemy import String, Integer, ForeignKey, DateTime, Boolean, Text, UniqueConstraint, text
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
from sqlalchemy.dialects.postgresql import ENUM as PG_ENUM, UUID as PG_UUID
|
||||
from sqlalchemy.dialects.postgresql import ENUM as PG_ENUM, UUID as PG_UUID, JSONB, ARRAY
|
||||
from sqlalchemy.sql import func
|
||||
from app.database import Base
|
||||
|
||||
@@ -17,6 +17,7 @@ class ModerationStatus(str, enum.Enum):
|
||||
class SourceType(str, enum.Enum):
|
||||
manual = "manual"
|
||||
ocr = "ocr"
|
||||
api = "api"
|
||||
api_import = "import"
|
||||
|
||||
class ServiceProvider(Base):
|
||||
@@ -26,7 +27,7 @@ class ServiceProvider(Base):
|
||||
kapcsolatfelvételi adatokkal a quick_add_provider() refactorhoz.
|
||||
"""
|
||||
__tablename__ = "service_providers"
|
||||
__table_args__ = {"schema": "marketplace"}
|
||||
__table_args__ = {"schema": "marketplace", "extend_existing": True}
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True)
|
||||
name: Mapped[str] = mapped_column(String, nullable=False)
|
||||
@@ -58,6 +59,15 @@ class ServiceProvider(Base):
|
||||
validation_score: Mapped[int] = mapped_column(Integer, default=0)
|
||||
evidence_image_path: Mapped[Optional[str]] = mapped_column(String)
|
||||
added_by_user_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id"))
|
||||
|
||||
# === P0 3D FILTERING MATRIX: Járműosztályok és specializációk ===
|
||||
supported_vehicle_classes: Mapped[Optional[list]] = mapped_column(
|
||||
ARRAY(String), server_default=text("'{}'"), nullable=True
|
||||
)
|
||||
specializations: Mapped[Optional[dict]] = mapped_column(
|
||||
JSONB, server_default=text("'{}'::jsonb"), nullable=True
|
||||
)
|
||||
|
||||
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
|
||||
|
||||
class Vote(Base):
|
||||
@@ -73,6 +83,45 @@ class Vote(Base):
|
||||
provider_id: Mapped[int] = mapped_column(Integer, ForeignKey("marketplace.service_providers.id"), nullable=False)
|
||||
vote_value: Mapped[int] = mapped_column(Integer, nullable=False) # +1 vagy -1
|
||||
|
||||
|
||||
class ProviderValidation(Base):
|
||||
"""
|
||||
Provider validációs rekordok (XP farming prevention).
|
||||
|
||||
Minden egyes admin moderációs akció (approve/reject/flag) egy rekordot hoz létre
|
||||
ebben a táblában. A Vote táblával ellentétben itt az admin által végzett
|
||||
validációk kerülnek rögzítésre, súlyozott értékkel.
|
||||
|
||||
Features:
|
||||
- UniqueConstraint(voter_user_id, provider_id): egy user csak egyszer validálhat
|
||||
- weight: az admin szintjétől függő súly (pl. superadmin=10, admin=5)
|
||||
- metadata: JSONB a validáció részleteivel (reason, evidence, stb.)
|
||||
- Küszöbérték: ha a weight-ek összege >= VALIDATION_THRESHOLD, a provider auto-approved
|
||||
"""
|
||||
__tablename__ = "provider_validations"
|
||||
__table_args__ = (
|
||||
UniqueConstraint('voter_user_id', 'provider_id', name='uq_voter_provider_validation'),
|
||||
{"schema": "marketplace", "extend_existing": True}
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
||||
provider_id: Mapped[int] = mapped_column(
|
||||
Integer, ForeignKey("marketplace.service_providers.id", ondelete="CASCADE"), nullable=False, index=True
|
||||
)
|
||||
voter_user_id: Mapped[int] = mapped_column(
|
||||
Integer, ForeignKey("identity.users.id", ondelete="CASCADE"), nullable=False
|
||||
)
|
||||
validation_type: Mapped[str] = mapped_column(
|
||||
String(20), nullable=False, default="approve"
|
||||
) # approve | reject | flag
|
||||
weight: Mapped[int] = mapped_column(Integer, default=1, nullable=False)
|
||||
validation_metadata: Mapped[Optional[dict]] = mapped_column("metadata", JSONB, server_default=text("'{}'::jsonb"))
|
||||
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
|
||||
|
||||
# Relationships
|
||||
provider: Mapped["ServiceProvider"] = relationship("ServiceProvider", foreign_keys=[provider_id])
|
||||
voter: Mapped["User"] = relationship("User", foreign_keys=[voter_user_id])
|
||||
|
||||
class Competition(Base):
|
||||
""" Gamifikált versenyek (pl. Januári Feltöltő Verseny). """
|
||||
__tablename__ = "competitions"
|
||||
|
||||
@@ -5,7 +5,7 @@ from datetime import datetime
|
||||
from typing import Any, List, Optional
|
||||
from sqlalchemy import Integer, String, Boolean, DateTime, ForeignKey, text, Text, Float, Index, Numeric, BigInteger
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
from sqlalchemy.dialects.postgresql import UUID as PG_UUID, JSONB, ENUM as SQLEnum
|
||||
from sqlalchemy.dialects.postgresql import UUID as PG_UUID, JSONB, ENUM as SQLEnum, ARRAY
|
||||
from geoalchemy2 import Geometry
|
||||
from sqlalchemy.sql import func
|
||||
|
||||
@@ -72,6 +72,14 @@ class ServiceProfile(Base):
|
||||
website: Mapped[Optional[str]] = mapped_column(String)
|
||||
bio: Mapped[Optional[str]] = mapped_column(Text)
|
||||
|
||||
# === P0 3D FILTERING MATRIX: Járműosztályok és specializációk ===
|
||||
supported_vehicle_classes: Mapped[Optional[list]] = mapped_column(
|
||||
ARRAY(String), server_default=text("'{}'"), nullable=True
|
||||
)
|
||||
specializations: Mapped[Optional[dict]] = mapped_column(
|
||||
JSONB, server_default=text("'{}'::jsonb"), nullable=True
|
||||
)
|
||||
|
||||
# Kapcsolatok
|
||||
organization: Mapped["Organization"] = relationship("Organization", back_populates="service_profile")
|
||||
expertises: Mapped[List["ServiceExpertise"]] = relationship("ServiceExpertise", back_populates="service")
|
||||
|
||||
Reference in New Issue
Block a user