refaktor címtár

This commit is contained in:
Roo
2026-07-01 19:49:58 +00:00
parent 6e627d0ebe
commit 7654913d21
198 changed files with 3485 additions and 1609 deletions

View File

@@ -26,7 +26,8 @@ from app.models.identity import User, Person, UserRole
from app.models.identity.address import Address
from app.models.marketplace.organization import Organization, OrganizationMember
from app.models.vehicle.history import AuditLog, LogSeverity
from app.schemas.user import AddressResponse
from app.schemas.address import AddressIn, AddressOut
from app.services.address_manager import AddressManager
logger = logging.getLogger("admin-persons")
router = APIRouter()
@@ -59,7 +60,7 @@ class PersonListItem(BaseModel):
merged_into_id: Optional[int] = None
users_count: int = 0
active_user: Optional[PersonListItemActiveUser] = None
address: Optional[AddressResponse] = None
address: Optional[AddressOut] = None
class PersonListResponse(BaseModel):
@@ -214,20 +215,7 @@ async def list_persons(
# Cím adatok
address_data = None
if person.address:
address_data = AddressResponse(
address_zip=person.address.zip,
address_city=person.address.city,
address_street_name=person.address.street_name,
address_street_type=person.address.street_type,
address_house_number=person.address.house_number,
address_stairwell=person.address.stairwell,
address_floor=person.address.floor,
address_door=person.address.door,
address_hrsz=person.address.parcel_id,
full_address_text=person.address.full_address_text,
latitude=person.address.latitude,
longitude=person.address.longitude,
)
address_data = AddressOut.model_validate(person.address)
items.append(PersonListItem(
id=person.id,
@@ -338,7 +326,7 @@ class PersonDetailResponse(BaseModel):
updated_at: Optional[str] = None
# Kapcsolódó entitások
address: Optional[AddressResponse] = None
address: Optional[AddressOut] = None
users: List[PersonDetailUserInfo] = []
memberships: List[PersonDetailMembership] = []
owned_organizations: List[PersonDetailOwnedOrganization] = []
@@ -394,20 +382,7 @@ async def get_person_detail(
# ── Cím adatok ──
address_data = None
if person.address:
address_data = AddressResponse(
address_zip=person.address.zip,
address_city=person.address.city,
address_street_name=person.address.street_name,
address_street_type=person.address.street_type,
address_house_number=person.address.house_number,
address_stairwell=person.address.stairwell,
address_floor=person.address.floor,
address_door=person.address.door,
address_hrsz=person.address.parcel_id,
full_address_text=person.address.full_address_text,
latitude=person.address.latitude,
longitude=person.address.longitude,
)
address_data = AddressOut.model_validate(person.address)
# ── Kapcsolódó User-ek ──
users_data: List[PersonDetailUserInfo] = []
@@ -520,22 +495,6 @@ async def get_person_detail(
# =============================================================================
class PersonAddressUpdate(BaseModel):
"""Cím adatok a Person szerkesztéshez."""
address_zip: Optional[str] = Field(default=None, description="Irányítószám")
address_city: Optional[str] = Field(default=None, description="Város")
address_street_name: Optional[str] = Field(default=None, description="Utca név")
address_street_type: Optional[str] = Field(default=None, description="Közterület jellege")
address_house_number: Optional[str] = Field(default=None, description="Házszám")
address_stairwell: Optional[str] = Field(default=None, description="Lépcsőház")
address_floor: Optional[str] = Field(default=None, description="Emelet")
address_door: Optional[str] = Field(default=None, description="Ajtó")
address_hrsz: Optional[str] = Field(default=None, description="Helyrajzi szám")
full_address_text: Optional[str] = Field(default=None, description="Teljes cím szöveg")
latitude: Optional[float] = Field(default=None, description="GPS szélesség")
longitude: Optional[float] = Field(default=None, description="GPS hosszúság")
class PersonUpdateRequest(BaseModel):
"""Admin által szerkeszthető Person mezők.
@@ -554,8 +513,8 @@ class PersonUpdateRequest(BaseModel):
is_active: Optional[bool] = Field(default=None, description="Aktív státusz")
is_ghost: Optional[bool] = Field(default=None, description="Ghost státusz")
# Cím adatok (opcionális, nested object)
address: Optional[PersonAddressUpdate] = Field(default=None, description="Cím adatok")
# Cím adatok (opcionális, nested object) — egységes AddressIn séma
address: Optional[AddressIn] = Field(default=None, description="Cím adatok")
@field_validator("phone")
@classmethod
@@ -692,62 +651,14 @@ async def update_person(
changes["is_ghost"] = {"old": person.is_ghost, "new": update_data.is_ghost}
person.is_ghost = update_data.is_ghost
# ── 5. Cím adatok frissítése ──
# ── 5. Cím adatok frissítése (P1 REFACTORED: AddressManager) ──
if update_data.address is not None:
addr_data = update_data.address
# Ha van már cím, frissítjük, különben létrehozzuk
if person.address:
address = person.address
else:
# Új cím létrehozása
address = Address(
created_at=datetime.utcnow()
)
db.add(address)
person.address = address
# Cím mezők frissítése
addr_changes: Dict[str, Any] = {}
if addr_data.address_zip is not None:
addr_changes["address_zip"] = {"old": address.zip, "new": addr_data.address_zip}
# Megjegyzés: a zip a GeoPostalCode kapcsolatból jön, itt csak a postal_code_id-t tudnánk keresni
# Egyszerűsítés: a frontend által küldött adatokat tároljuk a full_address_text-ben is
if addr_data.address_city is not None:
addr_changes["address_city"] = {"old": address.city, "new": addr_data.address_city}
if addr_data.address_street_name is not None:
addr_changes["address_street_name"] = {"old": address.street_name, "new": addr_data.address_street_name}
address.street_name = addr_data.address_street_name
if addr_data.address_street_type is not None:
addr_changes["address_street_type"] = {"old": address.street_type, "new": addr_data.address_street_type}
address.street_type = addr_data.address_street_type
if addr_data.address_house_number is not None:
addr_changes["address_house_number"] = {"old": address.house_number, "new": addr_data.address_house_number}
address.house_number = addr_data.address_house_number
if addr_data.address_stairwell is not None:
addr_changes["address_stairwell"] = {"old": address.stairwell, "new": addr_data.address_stairwell}
address.stairwell = addr_data.address_stairwell
if addr_data.address_floor is not None:
addr_changes["address_floor"] = {"old": address.floor, "new": addr_data.address_floor}
address.floor = addr_data.address_floor
if addr_data.address_door is not None:
addr_changes["address_door"] = {"old": address.door, "new": addr_data.address_door}
address.door = addr_data.address_door
if addr_data.address_hrsz is not None:
addr_changes["address_hrsz"] = {"old": address.parcel_id, "new": addr_data.address_hrsz}
address.parcel_id = addr_data.address_hrsz
if addr_data.full_address_text is not None:
addr_changes["full_address_text"] = {"old": address.full_address_text, "new": addr_data.full_address_text}
address.full_address_text = addr_data.full_address_text
if addr_data.latitude is not None:
addr_changes["latitude"] = {"old": address.latitude, "new": addr_data.latitude}
address.latitude = addr_data.latitude
if addr_data.longitude is not None:
addr_changes["longitude"] = {"old": address.longitude, "new": addr_data.longitude}
address.longitude = addr_data.longitude
if addr_changes:
changes["address"] = addr_changes
# P1 FIX: Use AddressManager.create_or_update() instead of
# writing directly to Address model fields.
person.address_id = await AddressManager.create_or_update(
db, person.address_id, update_data.address
)
changes["address"] = {"old": None, "new": "updated via AddressManager"}
# ── 6. Mentés ──
if changes:
@@ -768,20 +679,7 @@ async def update_person(
# Cím adatok
address_data = None
if person.address:
address_data = AddressResponse(
address_zip=person.address.zip,
address_city=person.address.city,
address_street_name=person.address.street_name,
address_street_type=person.address.street_type,
address_house_number=person.address.house_number,
address_stairwell=person.address.stairwell,
address_floor=person.address.floor,
address_door=person.address.door,
address_hrsz=person.address.parcel_id,
full_address_text=person.address.full_address_text,
latitude=person.address.latitude,
longitude=person.address.longitude,
)
address_data = AddressOut.model_validate(person.address)
# Kapcsolódó User-ek
users_data: List[PersonDetailUserInfo] = []